This commit is contained in:
TONY_All 2023-05-04 21:18:04 +08:00
parent 4b65a2459b
commit f971211e33
34 changed files with 90 additions and 87 deletions

View File

@ -3,7 +3,7 @@ plugins {
id("com.github.johnrengelman.shadow") id("com.github.johnrengelman.shadow")
} }
group = "cc.maxmc.msm.child" group = "cc.maxmc.msm.controlled"
repositories { repositories {
mavenCentral() mavenCentral()
@ -14,9 +14,8 @@ dependencies {
implementation(kotlin("stdlib")) implementation(kotlin("stdlib"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0-Beta") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0-Beta")
implementation(project(":common")) implementation(project(":common"))
implementation("io.netty:netty-all:4.1.90.Final") compileOnly("io.netty:netty-all:4.1.90.Final")
@Suppress("VulnerableLibrariesLocal") @Suppress("VulnerableLibrariesLocal") compileOnly("io.github.waterfallmc:waterfall-api:1.19-R0.1-SNAPSHOT")
implementation("io.github.waterfallmc:waterfall-api:1.19-R0.1-SNAPSHOT")
} }
tasks.shadowJar { tasks.shadowJar {

View File

@ -1,14 +1,14 @@
package cc.maxmc.msm.child package cc.maxmc.msm.controlled
import cc.maxmc.msm.api.MultiServerManAPIProvider import cc.maxmc.msm.api.MultiServerManAPIProvider
import cc.maxmc.msm.child.api.APIImpl import cc.maxmc.msm.controlled.api.APIImpl
import cc.maxmc.msm.child.listener.APIPacketListener import cc.maxmc.msm.controlled.listener.APIPacketListener
import cc.maxmc.msm.child.command.Api import cc.maxmc.msm.controlled.command.Api
import cc.maxmc.msm.child.command.Send import cc.maxmc.msm.controlled.command.Send
import cc.maxmc.msm.child.listener.ProtocolListener import cc.maxmc.msm.controlled.listener.ProtocolListener
import cc.maxmc.msm.child.netty.NetClient import cc.maxmc.msm.controlled.netty.NetClient
import cc.maxmc.msm.child.settings.Settings import cc.maxmc.msm.controlled.settings.Settings
import cc.maxmc.msm.child.settings.SettingsReader import cc.maxmc.msm.controlled.settings.SettingsReader
import cc.maxmc.msm.common.network.netty.NetworkRegistry import cc.maxmc.msm.common.network.netty.NetworkRegistry
import net.md_5.bungee.api.ProxyServer import net.md_5.bungee.api.ProxyServer
import net.md_5.bungee.api.plugin.Plugin import net.md_5.bungee.api.plugin.Plugin

View File

@ -1,8 +1,8 @@
package cc.maxmc.msm.child.api package cc.maxmc.msm.controlled.api
import cc.maxmc.msm.api.MultiServerManAPI import cc.maxmc.msm.api.MultiServerManAPI
import cc.maxmc.msm.api.misc.MatchInfo import cc.maxmc.msm.api.misc.MatchInfo
import cc.maxmc.msm.child.netty.NetClient import cc.maxmc.msm.controlled.netty.NetClient
import cc.maxmc.msm.common.network.packet.PPacketAPICall import cc.maxmc.msm.common.network.packet.PPacketAPICall
import java.util.* import java.util.*
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture

View File

@ -1,4 +1,4 @@
package cc.maxmc.msm.child.command package cc.maxmc.msm.controlled.command
import cc.maxmc.msm.api.MultiServerManAPIProvider import cc.maxmc.msm.api.MultiServerManAPIProvider
import net.md_5.bungee.api.CommandSender import net.md_5.bungee.api.CommandSender

View File

@ -1,6 +1,6 @@
package cc.maxmc.msm.child.command package cc.maxmc.msm.controlled.command
import cc.maxmc.msm.child.netty.NetClient import cc.maxmc.msm.controlled.netty.NetClient
import cc.maxmc.msm.common.network.packet.PPacketDebug import cc.maxmc.msm.common.network.packet.PPacketDebug
import net.md_5.bungee.api.CommandSender import net.md_5.bungee.api.CommandSender
import net.md_5.bungee.api.chat.TextComponent import net.md_5.bungee.api.chat.TextComponent

View File

@ -1,6 +1,6 @@
package cc.maxmc.msm.child.listener package cc.maxmc.msm.controlled.listener
import cc.maxmc.msm.child.api.APIImpl import cc.maxmc.msm.controlled.api.APIImpl
import cc.maxmc.msm.common.event.PacketReceiveEvent import cc.maxmc.msm.common.event.PacketReceiveEvent
import cc.maxmc.msm.common.network.packet.CPacketAPICallback import cc.maxmc.msm.common.network.packet.CPacketAPICallback
import net.md_5.bungee.api.plugin.Listener import net.md_5.bungee.api.plugin.Listener

View File

@ -1,9 +1,9 @@
package cc.maxmc.msm.child.listener package cc.maxmc.msm.controlled.listener
import cc.maxmc.msm.child.MultiServerMan import cc.maxmc.msm.controlled.MultiServerMan
import cc.maxmc.msm.child.misc.SubServer import cc.maxmc.msm.controlled.misc.SubServer
import cc.maxmc.msm.child.netty.NetClient import cc.maxmc.msm.controlled.netty.NetClient
import cc.maxmc.msm.child.settings.Settings import cc.maxmc.msm.controlled.settings.Settings
import cc.maxmc.msm.common.event.ChannelInactiveEvent import cc.maxmc.msm.common.event.ChannelInactiveEvent
import cc.maxmc.msm.common.event.PacketReceiveEvent import cc.maxmc.msm.common.event.PacketReceiveEvent
import cc.maxmc.msm.common.network.packet.* import cc.maxmc.msm.common.network.packet.*
@ -47,15 +47,18 @@ object ProtocolListener : Listener {
} }
@EventHandler @EventHandler
fun onDisconnect(packet: ChannelInactiveEvent) { fun onDisconnect(evt: ChannelInactiveEvent) {
repeat(10) { log("§c| §7与远程服务器断开连接.")
log("Remote Disconnected.")
}
} }
@EventHandler @EventHandler
fun onServerEnd(evt: PacketReceiveEvent) { fun onServerEnd(evt: PacketReceiveEvent) {
val packet = evt.packet as? CPacketEndServer ?: return val packet = evt.packet as? CPacketEndServer ?: return
packet.server val serverInfo = packet.server
val server =
serverCache[serverInfo.uid] ?: throw IllegalAccessError("Server ($serverInfo) is not in this sub bungee.")
pluginScope.launch {
server.cleanup()
}
} }
} }

View File

@ -1,8 +1,8 @@
package cc.maxmc.msm.child.misc package cc.maxmc.msm.controlled.misc
import cc.maxmc.msm.child.MultiServerMan import cc.maxmc.msm.controlled.MultiServerMan
import cc.maxmc.msm.child.settings.Settings import cc.maxmc.msm.controlled.settings.Settings
import cc.maxmc.msm.child.utils.ScriptRunner import cc.maxmc.msm.controlled.utils.ScriptRunner
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.nio.file.Path import java.nio.file.Path

View File

@ -1,4 +1,4 @@
package cc.maxmc.msm.child.netty package cc.maxmc.msm.controlled.netty
import cc.maxmc.msm.common.network.BungeePacket import cc.maxmc.msm.common.network.BungeePacket
import cc.maxmc.msm.common.network.netty.NetworkRegistry import cc.maxmc.msm.common.network.netty.NetworkRegistry

View File

@ -1,6 +1,6 @@
package cc.maxmc.msm.child.settings package cc.maxmc.msm.controlled.settings
import cc.maxmc.msm.child.settings.SettingsReader.config import cc.maxmc.msm.controlled.settings.SettingsReader.config
object Settings { object Settings {
val name val name

View File

@ -1,6 +1,6 @@
package cc.maxmc.msm.child.settings package cc.maxmc.msm.controlled.settings
import cc.maxmc.msm.child.MultiServerMan import cc.maxmc.msm.controlled.MultiServerMan
import net.md_5.bungee.api.ProxyServer import net.md_5.bungee.api.ProxyServer
import net.md_5.bungee.api.chat.TextComponent import net.md_5.bungee.api.chat.TextComponent
import net.md_5.bungee.config.Configuration import net.md_5.bungee.config.Configuration

View File

@ -1,4 +1,4 @@
package cc.maxmc.msm.child.utils package cc.maxmc.msm.controlled.utils
import cc.maxmc.msm.common.utils.log import cc.maxmc.msm.common.utils.log
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View File

@ -0,0 +1,3 @@
name: Controlled
main: cc.maxmc.msm.controlled.MultiServerMan
author: MistyRain

View File

@ -3,7 +3,7 @@ plugins {
id("com.github.johnrengelman.shadow") id("com.github.johnrengelman.shadow")
} }
group = "cc.maxmc.msm.parent" group = "cc.maxmc.msm.mastercontrol"
repositories { repositories {
mavenCentral() mavenCentral()

View File

@ -1,13 +1,12 @@
package cc.maxmc.msm.parent package cc.maxmc.msm.mastercontrol
import cc.maxmc.msm.api.MultiServerManAPIProvider import cc.maxmc.msm.api.MultiServerManAPIProvider
import cc.maxmc.msm.parent.api.APIImpl import cc.maxmc.msm.mastercontrol.api.APIImpl
import cc.maxmc.msm.parent.listener.PacketListener import cc.maxmc.msm.mastercontrol.listener.PacketListener
import cc.maxmc.msm.parent.manager.MatchManager import cc.maxmc.msm.mastercontrol.manager.MatchManager
import cc.maxmc.msm.parent.manager.ServerManager import cc.maxmc.msm.mastercontrol.manager.ServerManager
import cc.maxmc.msm.parent.netty.NetManager import cc.maxmc.msm.mastercontrol.netty.NetManager
import net.md_5.bungee.api.ProxyServer import net.md_5.bungee.api.ProxyServer
import net.md_5.bungee.api.connection.Server
import net.md_5.bungee.api.plugin.Plugin import net.md_5.bungee.api.plugin.Plugin
class MultiServerMan : Plugin() { class MultiServerMan : Plugin() {

View File

@ -1,9 +1,9 @@
package cc.maxmc.msm.parent.api package cc.maxmc.msm.mastercontrol.api
import cc.maxmc.msm.api.MultiServerManAPI import cc.maxmc.msm.api.MultiServerManAPI
import cc.maxmc.msm.api.misc.MatchInfo import cc.maxmc.msm.api.misc.MatchInfo
import cc.maxmc.msm.parent.database.SQLDatabase import cc.maxmc.msm.mastercontrol.database.SQLDatabase
import cc.maxmc.msm.parent.manager.MatchManager import cc.maxmc.msm.mastercontrol.manager.MatchManager
object APIImpl : MultiServerManAPI { object APIImpl : MultiServerManAPI {
override fun getServer(type: String, players: List<String>): MatchInfo { override fun getServer(type: String, players: List<String>): MatchInfo {

View File

@ -1,8 +1,8 @@
package cc.maxmc.msm.parent.database package cc.maxmc.msm.mastercontrol.database
import cc.maxmc.msm.api.misc.MatchInfo import cc.maxmc.msm.api.misc.MatchInfo
import cc.maxmc.msm.parent.manager.MatchManager import cc.maxmc.msm.mastercontrol.manager.MatchManager
import cc.maxmc.msm.parent.settings.Settings import cc.maxmc.msm.mastercontrol.settings.Settings
import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.pool.HikariPool import com.zaxxer.hikari.pool.HikariPool
import java.sql.Timestamp import java.sql.Timestamp

View File

@ -1,4 +1,4 @@
package cc.maxmc.msm.parent.listener package cc.maxmc.msm.mastercontrol.listener
import cc.maxmc.msm.api.MultiServerManAPIProvider import cc.maxmc.msm.api.MultiServerManAPIProvider
import cc.maxmc.msm.common.event.ChannelActiveEvent import cc.maxmc.msm.common.event.ChannelActiveEvent
@ -9,7 +9,7 @@ import cc.maxmc.msm.common.network.packet.CPacketDebug
import cc.maxmc.msm.common.network.packet.PPacketAPICall import cc.maxmc.msm.common.network.packet.PPacketAPICall
import cc.maxmc.msm.common.network.packet.PPacketDebug import cc.maxmc.msm.common.network.packet.PPacketDebug
import cc.maxmc.msm.common.utils.log import cc.maxmc.msm.common.utils.log
import cc.maxmc.msm.parent.manager.ChildManager import cc.maxmc.msm.mastercontrol.manager.ChildManager
import net.md_5.bungee.api.plugin.Listener import net.md_5.bungee.api.plugin.Listener
import net.md_5.bungee.event.EventHandler import net.md_5.bungee.event.EventHandler
@ -57,6 +57,7 @@ object PacketListener : Listener {
ChildManager.registerChild(evt.channel) ChildManager.registerChild(evt.channel)
} }
@EventHandler
fun onChannelInactive(evt: ChannelInactiveEvent) { fun onChannelInactive(evt: ChannelInactiveEvent) {
log("§c| §7子BC ${evt.channel.remoteAddress()} 断开连接.") log("§c| §7子BC ${evt.channel.remoteAddress()} 断开连接.")
ChildManager.unregisterChild(evt.channel) ChildManager.unregisterChild(evt.channel)

View File

@ -1,11 +1,11 @@
package cc.maxmc.msm.parent.manager package cc.maxmc.msm.mastercontrol.manager
import cc.maxmc.msm.common.network.packet.CPacketGetInfo import cc.maxmc.msm.common.network.packet.CPacketGetInfo
import cc.maxmc.msm.common.network.packet.PPacketChildInfo import cc.maxmc.msm.common.network.packet.PPacketChildInfo
import cc.maxmc.msm.common.utils.awaitPacket import cc.maxmc.msm.common.utils.awaitPacket
import cc.maxmc.msm.common.utils.log import cc.maxmc.msm.common.utils.log
import cc.maxmc.msm.common.utils.pluginScope import cc.maxmc.msm.common.utils.pluginScope
import cc.maxmc.msm.parent.misc.ChildBungee import cc.maxmc.msm.mastercontrol.misc.ChildBungee
import io.netty.channel.Channel import io.netty.channel.Channel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.* import java.util.*

View File

@ -1,14 +1,14 @@
package cc.maxmc.msm.parent.manager package cc.maxmc.msm.mastercontrol.manager
import cc.maxmc.msm.api.misc.MatchInfo import cc.maxmc.msm.api.misc.MatchInfo
import cc.maxmc.msm.parent.database.SQLDatabase import cc.maxmc.msm.mastercontrol.database.SQLDatabase
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
object MatchManager { object MatchManager {
private val matchMap = ConcurrentHashMap<Int, MatchInfo>() private val matchMap = ConcurrentHashMap<Int, MatchInfo>()
fun requestMatch(type: String, players: List<String>): MatchInfo { fun requestMatch(type: String, players: List<String>): MatchInfo {
val server = ServerManager.consumeServer(type) val server = ServerManager.consumeServer(type) ?: return MatchInfo()
val id = SQLDatabase.recordMatch(type, players) val id = SQLDatabase.recordMatch(type, players)
val match = MatchInfo(id, server) val match = MatchInfo(id, server)
matchMap[id] = match matchMap[id] = match

View File

@ -1,10 +1,10 @@
package cc.maxmc.msm.parent.manager package cc.maxmc.msm.mastercontrol.manager
import cc.maxmc.msm.api.misc.ServerInfo import cc.maxmc.msm.api.misc.ServerInfo
import cc.maxmc.msm.common.network.packet.CPacketEndServer import cc.maxmc.msm.common.network.packet.CPacketEndServer
import cc.maxmc.msm.common.utils.log import cc.maxmc.msm.common.utils.log
import cc.maxmc.msm.common.utils.pluginScope import cc.maxmc.msm.common.utils.pluginScope
import cc.maxmc.msm.parent.misc.ChildBungee import cc.maxmc.msm.mastercontrol.misc.ChildBungee
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.* import java.util.*
@ -44,9 +44,9 @@ object ServerManager {
} }
} }
fun consumeServer(type: String): ServerInfo { fun consumeServer(type: String): ServerInfo? {
val servers = getAvailableServers(type) val servers = getAvailableServers(type)
val info = servers.first() val info = servers.firstOrNull() ?: return null
info.isAvailable = false info.isAvailable = false
if (servers.size - 1 <= 2) { if (servers.size - 1 <= 2) {
pluginScope.launch { pluginScope.launch {

View File

@ -1,4 +1,4 @@
package cc.maxmc.msm.parent.misc package cc.maxmc.msm.mastercontrol.misc
import cc.maxmc.msm.api.misc.ServerInfo import cc.maxmc.msm.api.misc.ServerInfo
import cc.maxmc.msm.common.network.BungeePacket import cc.maxmc.msm.common.network.BungeePacket

View File

@ -1,11 +1,9 @@
package cc.maxmc.msm.parent.netty package cc.maxmc.msm.mastercontrol.netty
import cc.maxmc.msm.common.network.netty.NetworkRegistry import cc.maxmc.msm.common.network.netty.NetworkRegistry
import cc.maxmc.msm.common.utils.log import cc.maxmc.msm.common.utils.log
import cc.maxmc.msm.common.utils.pipelineInit import cc.maxmc.msm.common.utils.pipelineInit
import cc.maxmc.msm.parent.manager.MatchManager import cc.maxmc.msm.mastercontrol.settings.Settings
import cc.maxmc.msm.parent.manager.ServerManager
import cc.maxmc.msm.parent.settings.Settings
import io.netty.bootstrap.ServerBootstrap import io.netty.bootstrap.ServerBootstrap
import io.netty.channel.ChannelFutureListener import io.netty.channel.ChannelFutureListener
import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.nio.NioEventLoopGroup

View File

@ -1,6 +1,6 @@
package cc.maxmc.msm.parent.settings package cc.maxmc.msm.mastercontrol.settings
import cc.maxmc.msm.parent.settings.SettingsReader.config import cc.maxmc.msm.mastercontrol.settings.SettingsReader.config
object Settings { object Settings {
val serverPort val serverPort

View File

@ -1,6 +1,6 @@
package cc.maxmc.msm.parent.settings package cc.maxmc.msm.mastercontrol.settings
import cc.maxmc.msm.parent.MultiServerMan import cc.maxmc.msm.mastercontrol.MultiServerMan
import net.md_5.bungee.api.ProxyServer import net.md_5.bungee.api.ProxyServer
import net.md_5.bungee.api.chat.TextComponent import net.md_5.bungee.api.chat.TextComponent
import net.md_5.bungee.config.Configuration import net.md_5.bungee.config.Configuration

View File

@ -0,0 +1,3 @@
name: MasterControl
main: cc.maxmc.msm.mastercontrol.MultiServerMan
author: MistyRain

View File

@ -15,10 +15,14 @@ dependencies {
compileOnly("io.github.waterfallmc:waterfall-api:1.19-R0.1-SNAPSHOT") compileOnly("io.github.waterfallmc:waterfall-api:1.19-R0.1-SNAPSHOT")
} }
java {
withSourcesJar()
}
publishing { publishing {
publications { publications {
val release by getting(MavenPublication::class) { val release by getting(MavenPublication::class) {
artifact(tasks.jar) from(components["java"])
} }
} }
} }

View File

@ -3,7 +3,7 @@ plugins {
} }
group = "cc.maxmc.msm" group = "cc.maxmc.msm"
version = "1.0" version = "1.1.0"
subprojects { subprojects {

View File

@ -1,3 +0,0 @@
name: MultiServerMan-Child
main: cc.maxmc.msm.child.MultiServerMan
author: TONY_All

View File

@ -4,6 +4,7 @@ import cc.maxmc.msm.common.event.ChannelActiveEvent
import cc.maxmc.msm.common.event.ChannelInactiveEvent import cc.maxmc.msm.common.event.ChannelInactiveEvent
import cc.maxmc.msm.common.event.PacketReceiveEvent import cc.maxmc.msm.common.event.PacketReceiveEvent
import cc.maxmc.msm.common.utils.awaiting import cc.maxmc.msm.common.utils.awaiting
import cc.maxmc.msm.common.utils.log
import io.netty.channel.ChannelHandler.Sharable import io.netty.channel.ChannelHandler.Sharable
import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelHandlerContext
import io.netty.channel.SimpleChannelInboundHandler import io.netty.channel.SimpleChannelInboundHandler
@ -12,9 +13,7 @@ import kotlin.coroutines.resume
@Sharable @Sharable
object ClusterPacketHandler : SimpleChannelInboundHandler<BungeePacket>() { object ClusterPacketHandler : SimpleChannelInboundHandler<BungeePacket>() {
override fun channelRead0(ctx: ChannelHandlerContext, msg: BungeePacket) { override fun channelRead0(ctx: ChannelHandlerContext, msg: BungeePacket) {
awaiting.filter { it.first == msg::class.java } awaiting.filter { it.first == msg::class.java }.filter { it.second(ctx.channel(), msg) }.forEach {
.filter { it.second(ctx.channel(), msg) }
.forEach {
it.third.resume(msg) it.third.resume(msg)
} }
PacketReceiveEvent(ctx.channel(), msg).callEvent() PacketReceiveEvent(ctx.channel(), msg).callEvent()

View File

@ -1,3 +0,0 @@
name: MultiServerMan-Parent
main: cc.maxmc.msm.parent.MultiServerMan
author: TONY_All

View File

@ -1,10 +1,10 @@
plugins { plugins {
id("com.github.johnrengelman.shadow") version "8.1.0" apply false id("com.github.johnrengelman.shadow") version "8.1.0" apply false
kotlin("jvm") version "1.8.10" apply false kotlin("jvm") version "1.8.20" apply false
} }
rootProject.name = "MultiServerMan" rootProject.name = "MultiServerMan"
val subProjects = listOf("api", "common", "parent", "child") val subProjects = listOf("api", "common", "MasterControl", "Controlled")
include(subProjects) include(subProjects)