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,9 @@
package cc.maxmc.msm.child
import cc.maxmc.msm.api.MultiServerManAPIProvider
import cc.maxmc.msm.child.api.APIImpl
import cc.maxmc.msm.child.api.APIPacketListener
import cc.maxmc.msm.child.command.Api
import cc.maxmc.msm.child.command.Send
import cc.maxmc.msm.child.netty.NetClient
import cc.maxmc.msm.child.settings.Settings
@@ -13,7 +17,10 @@ class MultiServerMan : Plugin() {
}
override fun onEnable() {
MultiServerManAPIProvider.register(APIImpl)
ProxyServer.getInstance().pluginManager.registerCommand(this, Send)
ProxyServer.getInstance().pluginManager.registerCommand(this, Api)
ProxyServer.getInstance().pluginManager.registerListener(this, APIPacketListener)
NetworkRegistry
NetClient.start(Settings.Parent.address, Settings.Parent.port)
}
@@ -4,44 +4,45 @@ import cc.maxmc.msm.api.MultiServerManAPI
import cc.maxmc.msm.api.misc.ServerInfo
import cc.maxmc.msm.child.netty.NetClient
import cc.maxmc.msm.common.network.packet.PPacketAPICall
import net.md_5.bungee.api.connection.ProxiedPlayer
import java.util.*
import java.util.concurrent.CompletableFuture
import java.util.concurrent.TimeUnit
@Suppress("UNCHECKED_CAST")
object APIImpl : MultiServerManAPI {
val apiCallCache = HashMap<UUID, CompletableFuture<out Any>>()
val apiCallCache = HashMap<UUID, CompletableFuture<in Any>>()
private const val TIMEOUT = 3L
override fun getServer(type: String, players: MutableList<ProxiedPlayer>): ServerInfo {
val packet = PPacketAPICall.PPacketCallGetServer(type, players.map { it.name })
override fun getServer(type: String, players: MutableList<String>): ServerInfo {
val packet = PPacketAPICall.PPacketCallGetServer(type, players)
NetClient.sendPacket(packet)
val future = CompletableFuture<ServerInfo>()
apiCallCache[UUID.randomUUID()] = future
return future.get(1, TimeUnit.SECONDS)
apiCallCache[packet.uid] = future as CompletableFuture<Any>
return future.get(TIMEOUT, TimeUnit.SECONDS)
}
override fun informEnd(id: Int) {
val packet = PPacketAPICall.PPacketCallInformEnd(id)
NetClient.sendPacket(packet)
val future = CompletableFuture<Unit>()
apiCallCache[UUID.randomUUID()] = future
future.get(1, TimeUnit.SECONDS)
apiCallCache[packet.uid] = future as CompletableFuture<Any>
future.get(TIMEOUT, TimeUnit.SECONDS)
return
}
override fun getPlayerServer(player: ProxiedPlayer): ServerInfo {
val packet = PPacketAPICall.PPacketCallGetPlayerServer(player.name)
override fun getPlayerServer(player: String): ServerInfo {
val packet = PPacketAPICall.PPacketCallGetPlayerServer(player)
NetClient.sendPacket(packet)
val future = CompletableFuture<ServerInfo>()
apiCallCache[UUID.randomUUID()] = future
return future.get(1, TimeUnit.SECONDS)
apiCallCache[packet.uid] = future as CompletableFuture<Any>
return future.get(TIMEOUT, TimeUnit.SECONDS)
}
override fun containPlayer(player: ProxiedPlayer): Boolean {
val packet = PPacketAPICall.PPacketCallContainPlayer(player.name)
override fun containPlayer(player: String): Boolean {
val packet = PPacketAPICall.PPacketCallContainPlayer(player)
NetClient.sendPacket(packet)
val future = CompletableFuture<Boolean>()
apiCallCache[UUID.randomUUID()] = future
return future.get(1, TimeUnit.SECONDS)
apiCallCache[packet.uid] = future as CompletableFuture<Any>
return future.get(TIMEOUT, TimeUnit.SECONDS)
}
}
@@ -0,0 +1,40 @@
package cc.maxmc.msm.child.api
import cc.maxmc.msm.common.event.PacketReceiveEvent
import cc.maxmc.msm.common.network.packet.CPacketAPICallback
import cc.maxmc.msm.common.utils.debug
import net.md_5.bungee.api.plugin.Listener
import net.md_5.bungee.event.EventHandler
object APIPacketListener : Listener {
@EventHandler
fun onPacket(packetEvent: PacketReceiveEvent) {
val packet = packetEvent.packet
if (packet !is CPacketAPICallback) {
return
}
val future = APIImpl.apiCallCache[packet.uid]
when (packet) {
is CPacketAPICallback.CPacketCallbackContainPlayer -> {
future?.complete(packet.value)
?: throw IllegalStateException("Packet callback received, however no request")
}
is CPacketAPICallback.CPacketCallbackGetPlayerServer -> {
future?.complete(packet.serverInfo)
?: throw IllegalStateException("Packet callback received, however no request")
}
is CPacketAPICallback.CPacketCallbackGetServer -> {
future?.complete(packet.serverInfo)
?: throw IllegalStateException("Packet callback received, however no request")
}
is CPacketAPICallback.CPacketCallbackInformEnd -> {
future?.complete(Unit)
?: throw IllegalStateException("Packet callback received, however no request")
}
}
}
}
@@ -0,0 +1,36 @@
package cc.maxmc.msm.child.command
import cc.maxmc.msm.api.MultiServerManAPIProvider
import net.md_5.bungee.api.CommandSender
import net.md_5.bungee.api.chat.TextComponent
import net.md_5.bungee.api.plugin.Command
object Api : Command("api") {
override fun execute(sender: CommandSender, args: Array<out String>) {
sender.sendMessage(TextComponent("Calling API"))
val api = args[0]
val apiInst = MultiServerManAPIProvider.getAPI()
@Suppress("IMPLICIT_CAST_TO_ANY") val ret = when (api) {
"gs" -> {
apiInst.getServer("def", listOf("abc", "def"))
}
"ie" -> {
apiInst.informEnd(100)
}
"gps" -> {
apiInst.getPlayerServer("def")
}
"cp" -> {
apiInst.containPlayer("awa")
}
else -> {
"non api exist"
}
}.toString()
sender.sendMessage(TextComponent("Returning $ret"))
}
}
@@ -22,7 +22,12 @@ object NetClient {
.option(ChannelOption.TCP_NODELAY, true)
.remoteAddress(address, port)
.connect().addListener(ChannelFutureListener {
println("§a| §7成功连接到集群的主节点. (${it.channel().remoteAddress()})")
val result = it.cause() ?: return@ChannelFutureListener println(
"§a| §7成功连接到集群的主节点. (${
it.channel().remoteAddress()
})"
)
result.printStackTrace()
})
channel = future.channel()
}
@@ -6,6 +6,11 @@ object Settings {
val name
get() = config
val portRange
get() = config.getStringList("ports").flatMap {
it.toIntOrNull()?.run { listOf(this) } ?: it.split("..").run { this[0].toInt()..this[1].toInt() }
}
object Parent {
val address: String
get() = config.getString("parent.address", "localhost")
+4
View File
@@ -1,3 +1,7 @@
parent:
address: 127.0.0.1
port: 23333
ports:
- 30000
- 30001..30019
-