finish client & server communicate

finish database
This commit is contained in:
2023-03-27 01:19:37 +08:00
parent aa4a229b7d
commit e1459c3e8e
23 changed files with 359 additions and 49 deletions
@@ -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()
})
}