This commit is contained in:
2023-04-05 20:13:19 +08:00
parent e1459c3e8e
commit 5681164469
19 changed files with 301 additions and 9 deletions
+1
View File
@@ -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
}