sync
This commit is contained in:
@@ -14,6 +14,7 @@ dependencies {
|
||||
implementation(kotlin("stdlib"))
|
||||
implementation(project(":common"))
|
||||
implementation("com.zaxxer:HikariCP:4.0.3")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0-Beta")
|
||||
@Suppress("VulnerableLibrariesLocal")
|
||||
compileOnly("io.github.waterfallmc:waterfall-api:1.19-R0.1-SNAPSHOT")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package cc.maxmc.msm.parent
|
||||
|
||||
import sun.misc.Signal
|
||||
import java.lang.management.ManagementFactory
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
fun main() {
|
||||
|
||||
}
|
||||
@@ -1,13 +1,15 @@
|
||||
package cc.maxmc.msm.parent.listener
|
||||
|
||||
import cc.maxmc.msm.api.MultiServerManAPIProvider
|
||||
import cc.maxmc.msm.common.event.ChannelActiveEvent
|
||||
import cc.maxmc.msm.common.event.ChannelInactiveEvent
|
||||
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 cc.maxmc.msm.parent.manager.ChildManager
|
||||
import net.md_5.bungee.api.plugin.Listener
|
||||
import net.md_5.bungee.event.EventHandler
|
||||
|
||||
@@ -48,4 +50,13 @@ object PacketListener : Listener {
|
||||
log("§fDEBUG | §7收到: \"${packet.content}\"")
|
||||
evt.channel.writeAndFlush(CPacketDebug("(${evt.channel.localAddress()}) - ${packet.content}"))
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
fun onChannelActive(evt: ChannelActiveEvent) {
|
||||
ChildManager.registerChild(evt.channel)
|
||||
}
|
||||
|
||||
fun onChannelInactive(evt: ChannelInactiveEvent) {
|
||||
ChildManager.unregisterChild(evt.channel)
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,36 @@
|
||||
package cc.maxmc.msm.parent.manager
|
||||
|
||||
import cc.maxmc.msm.common.network.packet.CPacketGetInfo
|
||||
import cc.maxmc.msm.common.network.packet.PPacketChildInfo
|
||||
import cc.maxmc.msm.common.utils.awaitPacket
|
||||
import cc.maxmc.msm.common.utils.log
|
||||
import cc.maxmc.msm.common.utils.pluginScope
|
||||
import cc.maxmc.msm.parent.misc.ChildBungee
|
||||
import io.netty.channel.Channel
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.concurrent.CopyOnWriteArrayList
|
||||
|
||||
object ChildManager {
|
||||
val children = ArrayList<ChildBungee>()
|
||||
private val children = CopyOnWriteArrayList<ChildBungee>()
|
||||
|
||||
fun registerChild(child: ChildBungee) {
|
||||
children.add(child)
|
||||
fun registerChild(channel: Channel) {
|
||||
pluginScope.launch {
|
||||
log("§b| §7正在将 ${channel.remoteAddress()} 注册到集群.")
|
||||
channel.writeAndFlush(CPacketGetInfo())
|
||||
val packet = awaitPacket(PPacketChildInfo::class.java) { ch, _ ->
|
||||
ch == channel
|
||||
}
|
||||
val child = ChildBungee(channel, packet.portRange)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fun unregisterChild(channel: Channel) {
|
||||
children.removeIf { it.channel == channel }
|
||||
}
|
||||
|
||||
fun requestChild(): ChildBungee {
|
||||
return children.filter { it.getAvailablePorts().isNotEmpty() }.maxByOrNull { it.getAvailablePorts().size }
|
||||
?: throw IllegalStateException("当前无可用端口开启新服务器.")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package cc.maxmc.msm.parent.manager
|
||||
|
||||
import cc.maxmc.msm.api.misc.ServerInfo
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
object ServerManager {
|
||||
val serverMap = ConcurrentHashMap<String, List<ServerInfo>>()
|
||||
|
||||
fun getAvailableServers(type: String): List<ServerInfo> {
|
||||
return serverMap[type]!!.filter { it.isAvailable }
|
||||
}
|
||||
|
||||
private fun requireServer(type: String) {
|
||||
val child = ChildManager.requestChild()
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,19 @@
|
||||
package cc.maxmc.msm.parent.misc
|
||||
|
||||
import cc.maxmc.msm.common.network.BungeePacket
|
||||
import cc.maxmc.msm.common.network.packet.CPacketRequestServer
|
||||
import cc.maxmc.msm.common.utils.awaitPacket
|
||||
import io.netty.channel.Channel
|
||||
|
||||
class ChildBungee(val channel: Channel, var ports: List<Int>, var usedPorts: List<Int> = ArrayList()) {
|
||||
fun sendPacket(packet: BungeePacket) {
|
||||
class ChildBungee(val channel: Channel, var ports: Set<Int>, var usedPorts: MutableSet<Int> = HashSet()) {
|
||||
private fun sendPacket(packet: BungeePacket) {
|
||||
channel.writeAndFlush(packet)
|
||||
}
|
||||
|
||||
suspend fun requestServer(type: String) {
|
||||
sendPacket(CPacketRequestServer(type))
|
||||
awaitPacket()
|
||||
}
|
||||
|
||||
fun getAvailablePorts() = ports - usedPorts
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user