finish client & server communicate
finish database
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package cc.maxmc.msm.parent
|
||||
|
||||
import cc.maxmc.msm.api.MultiServerManAPIProvider
|
||||
import cc.maxmc.msm.parent.api.APIImpl
|
||||
import cc.maxmc.msm.parent.listener.PacketListener
|
||||
import cc.maxmc.msm.parent.netty.NetManager
|
||||
import net.md_5.bungee.api.ProxyServer
|
||||
@@ -9,6 +11,7 @@ class MultiServerMan : Plugin() {
|
||||
|
||||
override fun onEnable() {
|
||||
instance = this
|
||||
MultiServerManAPIProvider.register(APIImpl)
|
||||
ProxyServer.getInstance().pluginManager.registerListener(this, PacketListener)
|
||||
NetManager.startServer()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
package cc.maxmc.msm.parent.api
|
||||
|
||||
import cc.maxmc.msm.api.MultiServerManAPI
|
||||
import cc.maxmc.msm.api.misc.ServerInfo
|
||||
import com.google.common.net.HostAndPort
|
||||
|
||||
object APIImpl : MultiServerManAPI {
|
||||
override fun getServer(type: String, players: MutableList<String>): ServerInfo {
|
||||
TODO("not implemented")
|
||||
return ServerInfo(HostAndPort.fromString("127.0.0.1:23456"), 1024)
|
||||
}
|
||||
|
||||
override fun informEnd(id: Int) {
|
||||
TODO("not implemented")
|
||||
return
|
||||
}
|
||||
|
||||
override fun getPlayerServer(player: String): ServerInfo {
|
||||
TODO("not implemented")
|
||||
return ServerInfo(HostAndPort.fromString("127.0.0.1:34567"), 1025)
|
||||
}
|
||||
|
||||
override fun containPlayer(player: String): Boolean {
|
||||
TODO("not implemented")
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -2,22 +2,84 @@ package cc.maxmc.msm.parent.database
|
||||
|
||||
import cc.maxmc.msm.parent.settings.Settings
|
||||
import com.zaxxer.hikari.HikariConfig
|
||||
import com.zaxxer.hikari.pool.HikariPool
|
||||
import java.sql.Timestamp
|
||||
|
||||
class SQLDatabase {
|
||||
val config = HikariConfig()
|
||||
private val config = HikariConfig()
|
||||
private lateinit var pool: HikariPool
|
||||
fun initDatabase() {
|
||||
val db = Settings.Database
|
||||
config.jdbcUrl = "jdbc:mysql://${db.address}:${db.port}"
|
||||
config.username = db.username
|
||||
config.password = db.password
|
||||
config.schema = db.database
|
||||
pool = HikariPool(config)
|
||||
}
|
||||
|
||||
fun getMatch(id: Int) {
|
||||
|
||||
fun createTable() {
|
||||
pool.connection.use {
|
||||
it.createStatement().use { statement ->
|
||||
statement.execute(
|
||||
"""
|
||||
CREATE TABLE `match`
|
||||
(
|
||||
`id` int auto_increment,
|
||||
`start` datetime not null,
|
||||
`end` datetime null,
|
||||
`players` text not null ,
|
||||
PRIMARY KEY (`id`)
|
||||
)
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun recordMatch() {
|
||||
fun getPlayerMatch(player: String): Int {
|
||||
pool.connection.use {
|
||||
it.prepareStatement("select `id` from `match` where find_in_set(?, players) AND end IS NULL")
|
||||
.use { prepared ->
|
||||
prepared.setString(0, player)
|
||||
val rs = prepared.executeQuery()
|
||||
if (!rs.next()) {
|
||||
return -1
|
||||
}
|
||||
return rs.getInt(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun recordMatch(type: String, players: List<String>, start: Long = System.currentTimeMillis()) =
|
||||
pool.connection.use {
|
||||
val prepared = it.prepareStatement(
|
||||
"""
|
||||
insert into `match` (type, start, end, players)
|
||||
values (?, ?, ?, ?);
|
||||
""".trimIndent()
|
||||
)
|
||||
prepared.apply {
|
||||
setString(1, type)
|
||||
setTimestamp(2, Timestamp(start))
|
||||
setTimestamp(3, null)
|
||||
setString(4, players.joinToString(","))
|
||||
}
|
||||
prepared.execute()
|
||||
prepared.close()
|
||||
return@use it.createStatement().use { statement ->
|
||||
val result = statement.executeQuery("select last_insert_id()")
|
||||
result.next()
|
||||
result.getInt(1)
|
||||
}
|
||||
}
|
||||
|
||||
fun endMatch(id: Int, end: Long = System.currentTimeMillis()) = pool.connection.use {
|
||||
val prepare = it.prepareStatement("update `match` set end = ? where id = ?")
|
||||
prepare.apply {
|
||||
setTimestamp(1, Timestamp(end))
|
||||
setInt(2, id)
|
||||
}
|
||||
prepare.execute()
|
||||
prepare.close()
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,44 @@
|
||||
package cc.maxmc.msm.parent.listener
|
||||
|
||||
import cc.maxmc.msm.api.MultiServerManAPIProvider
|
||||
import cc.maxmc.msm.common.event.PacketReceiveEvent
|
||||
import cc.maxmc.msm.common.network.packet.CPacketAPICallback
|
||||
import cc.maxmc.msm.common.network.packet.CPacketDebug
|
||||
import cc.maxmc.msm.common.network.packet.PPacketAPICall
|
||||
import cc.maxmc.msm.common.network.packet.PPacketDebug
|
||||
import cc.maxmc.msm.common.utils.debug
|
||||
import cc.maxmc.msm.common.utils.log
|
||||
import net.md_5.bungee.api.plugin.Listener
|
||||
import net.md_5.bungee.event.EventHandler
|
||||
|
||||
object PacketListener : Listener {
|
||||
val api = MultiServerManAPIProvider.getAPI()
|
||||
|
||||
@EventHandler
|
||||
fun onAPICall(evt: PacketReceiveEvent) {
|
||||
val packet = evt.packet
|
||||
if (packet !is PPacketAPICall) return
|
||||
val callback = when (packet) {
|
||||
is PPacketAPICall.PPacketCallContainPlayer -> {
|
||||
CPacketAPICallback.CPacketCallbackContainPlayer(api.containPlayer(packet.player), packet.uid)
|
||||
}
|
||||
|
||||
is PPacketAPICall.PPacketCallGetPlayerServer -> {
|
||||
CPacketAPICallback.CPacketCallbackGetPlayerServer(api.getPlayerServer(packet.player), packet.uid)
|
||||
}
|
||||
|
||||
is PPacketAPICall.PPacketCallGetServer -> {
|
||||
CPacketAPICallback.CPacketCallbackGetServer(api.getServer(packet.type, packet.players), packet.uid)
|
||||
}
|
||||
|
||||
is PPacketAPICall.PPacketCallInformEnd -> {
|
||||
api.informEnd(packet.matchID)
|
||||
CPacketAPICallback.CPacketCallbackInformEnd(packet.uid)
|
||||
}
|
||||
}
|
||||
evt.channel.writeAndFlush(callback)
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
fun onPacket(evt: PacketReceiveEvent) {
|
||||
val packet = evt.packet
|
||||
|
||||
@@ -6,6 +6,6 @@ object ChildManager {
|
||||
val children = ArrayList<ChildBungee>()
|
||||
|
||||
fun registerChild(child: ChildBungee) {
|
||||
|
||||
children.add(child)
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,10 @@
|
||||
package cc.maxmc.msm.parent.misc
|
||||
|
||||
import cc.maxmc.msm.common.network.BungeePacket
|
||||
import io.netty.channel.Channel
|
||||
|
||||
data class ChildBungee(val channel: Channel)
|
||||
class ChildBungee(val channel: Channel, var ports: List<Int>, var usedPorts: List<Int> = ArrayList()) {
|
||||
fun sendPacket(packet: BungeePacket) {
|
||||
channel.writeAndFlush(packet)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,12 @@ object NetManager {
|
||||
.childHandler(pipelineInit(NetworkRegistry.PacketDirection.PARENT_BOUND))
|
||||
.bind(Settings.serverPort)
|
||||
.addListener(ChannelFutureListener {
|
||||
log("§a| §7集群主服务端启动成功. ${it.channel().localAddress()}")
|
||||
val result = it.cause() ?: return@ChannelFutureListener log(
|
||||
"§a| §7集群主服务端启动成功. ${
|
||||
it.channel().localAddress()
|
||||
}"
|
||||
)
|
||||
result.printStackTrace()
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user