finish client & server communicate
finish database
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
parent:
|
||||
address: 127.0.0.1
|
||||
port: 23333
|
||||
ports:
|
||||
- 30000
|
||||
- 30001..30019
|
||||
-
|
||||
Reference in New Issue
Block a user