From a5c2eec5e54e35dfa897ddc654bcf446105197aa Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sat, 11 Nov 2023 17:54:40 +0800 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=20guava=20?= =?UTF-8?q?=E7=9A=84=20EventBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ball-bukkit/build.gradle.kts | 6 +- .../plugin/ball/bukkit/HamsterBallPlugin.java | 18 +- .../bukkit/listener/BallBukkitListener.java | 204 +++++++------- .../build.gradle.kts | 6 +- .../plugin/core/bungee/HamsterBallPlugin.java | 12 +- .../core/bungee/api/BallBungeeCordAPI.java | 0 .../listener/BallBungeeCordListener.java | 184 +++++++++++++ .../core/bungee/util/BallBungeeCordUtils.java | 3 +- .../src/main/resources/bungee.yml | 0 .../src/main/resources/config.yml | 0 .../listener/BallBungeeCordListener.java | 205 -------------- ball-common/build.gradle.kts | 6 +- .../mc/plugin/ball/common/api/BallAPI.java | 253 ++++-------------- ...{BallMessageInfo.java => BallMessage.java} | 18 +- .../plugin/ball/common/event/BallActions.java | 24 ++ .../event/message/MessageReceivedEvent.java | 11 + .../event/message/MessageSentEvent.java | 11 + .../operate/BroadcastPlayerMessageEvent.java | 3 - .../operate/DispatchConsoleCommandEvent.java | 2 - .../operate/DispatchPlayerCommandEvent.java | 2 - .../common/event/operate/KickPlayerEvent.java | 2 - .../operate/SendMessageToPlayerEvent.java | 2 - .../operate/SendPlayerToLocationEvent.java | 2 - .../operate/SendPlayerToPlayerEvent.java | 3 - .../player/BallPlayerConnectServerEvent.java | 2 - .../player/BallPlayerInfoUpdateEvent.java | 2 - .../event/player/BallPlayerLoginEvent.java | 2 - .../event/player/BallPlayerLogoutEvent.java | 2 - .../BallPlayerPostConnectServerEvent.java | 2 - .../player/BallPlayerPostLoginEvent.java | 2 - .../BallPlayerPreConnectServerEvent.java | 3 - .../event/player/BallPlayerPreLoginEvent.java | 2 - .../event/server/ServerOfflineEvent.java | 2 - .../event/server/ServerOnlineEvent.java | 2 - .../common/listener/BallCommonListener.java | 81 ++++++ .../common/listener/BallDebugListener.java | 13 +- .../ball/common/listener/BallListener.java | 55 ---- .../common/listener/BallMessageListener.java | 167 ------------ .../common/listener/BallRedisListener.java | 143 ++++++++++ .../common/listener/ListenerPriority.java | 45 ---- settings.gradle.kts | 4 +- 41 files changed, 642 insertions(+), 864 deletions(-) rename {ball-bungeecord => ball-bungee}/build.gradle.kts (74%) rename {ball-bungeecord => ball-bungee}/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java (89%) rename {ball-bungeecord => ball-bungee}/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java (100%) create mode 100644 ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java rename {ball-bungeecord => ball-bungee}/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java (97%) rename {ball-bungeecord => ball-bungee}/src/main/resources/bungee.yml (100%) rename {ball-bungeecord => ball-bungee}/src/main/resources/config.yml (100%) delete mode 100644 ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java rename ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/{BallMessageInfo.java => BallMessage.java} (87%) create mode 100644 ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java create mode 100644 ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java create mode 100644 ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java create mode 100644 ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java delete mode 100644 ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java delete mode 100644 ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java create mode 100644 ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java delete mode 100644 ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java diff --git a/ball-bukkit/build.gradle.kts b/ball-bukkit/build.gradle.kts index 5fb8d8f..4af0bb7 100644 --- a/ball-bukkit/build.gradle.kts +++ b/ball-bukkit/build.gradle.kts @@ -1,4 +1,4 @@ -@file:Suppress("GradlePackageVersionRange") +@file:Suppress("VulnerableLibrariesLocal", "GradlePackageVersionRange", "GradlePackageUpdate") evaluationDependsOn(":ball-common") @@ -8,8 +8,8 @@ dependencies { compileOnly("cn.hamster3.mc.plugin:core-bukkit:+") compileOnly("me.clip:placeholderapi:+") { isTransitive = false } - // https://mvnrepository.com/artifact/io.lettuce/lettuce-core - implementation("io.lettuce:lettuce-core:6.2.6.RELEASE") + + implementation("io.lettuce:lettuce-core:+") } tasks { diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java index 2359b8f..3229492 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java @@ -4,6 +4,7 @@ import cn.hamster3.mc.plugin.ball.bukkit.api.BallBukkitAPI; import cn.hamster3.mc.plugin.ball.bukkit.hook.PlaceholderHook; import cn.hamster3.mc.plugin.ball.bukkit.listener.BallBukkitListener; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -55,25 +56,18 @@ public class HamsterBallPlugin extends JavaPlugin { } catch (Exception e) { e.printStackTrace(); } - if (!BallAPI.getInstance().isEnabled()) { - sync(() -> { - logger.info("由于 HamsterBall 未能成功连接, 服务器将立即关闭"); - Bukkit.shutdown(); - }); - return; - } Bukkit.getPluginManager().registerEvents(BallBukkitListener.INSTANCE, this); + BallAPI.getInstance().getEventBus().register(BallBukkitListener.INSTANCE); logger.info("已注册 BallBukkitListener"); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - ServerOnlineEvent.ACTION, - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) - ); sync(() -> { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { PlaceholderHook.INSTANCE.register(); logger.info("已挂载 PlaceholderAPI 变量"); } + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), + new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) + ); }); long time = System.currentTimeMillis() - start; logger.info("仓鼠球启动完成,总计耗时 " + time + " ms"); diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java index c1506f1..ee4e5aa 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java @@ -3,15 +3,14 @@ package cn.hamster3.mc.plugin.ball.bukkit.listener; import cn.hamster3.mc.plugin.ball.bukkit.HamsterBallPlugin; import cn.hamster3.mc.plugin.ball.bukkit.data.BukkitLocation; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; import cn.hamster3.mc.plugin.ball.common.event.operate.*; -import cn.hamster3.mc.plugin.ball.common.listener.BallListener; import cn.hamster3.mc.plugin.core.bukkit.api.CoreBukkitAPI; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.TextReplacementConfig; +import com.google.common.eventbus.Subscribe; import lombok.AllArgsConstructor; import lombok.Data; import org.bukkit.Bukkit; @@ -33,7 +32,7 @@ import java.util.HashMap; import java.util.List; import java.util.UUID; -public class BallBukkitListener implements Listener, BallListener { +public class BallBukkitListener implements Listener { public static final BallBukkitListener INSTANCE = new BallBukkitListener(); private final HashMap playerToLocation = new HashMap<>(); @@ -42,108 +41,6 @@ public class BallBukkitListener implements Listener, BallListener { private BallBukkitListener() { } - @Override - public void onMessageReceived(@NotNull BallMessageInfo info) { - switch (info.getAction()) { - case BroadcastPlayerMessageEvent.ACTION: { - BroadcastPlayerMessageEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BroadcastPlayerMessageEvent.class); - DisplayMessage message = event.getMessage(); - Audience audience = CoreAPI.getInstance().getAudienceProvider().all(); - message.show(audience); - break; - } - case DispatchConsoleCommandEvent.ACTION: { - DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchConsoleCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.GAME) { - return; - } - if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { - return; - } - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), event.getCommand()); - break; - } - case DispatchPlayerCommandEvent.ACTION: { - DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchPlayerCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.GAME) { - return; - } - if (event.getUuid() != null) { - Player player = Bukkit.getPlayer(event.getUuid()); - if (player == null) { - return; - } - Bukkit.dispatchCommand(player, event.getCommand()); - return; - } - for (Player player : Bukkit.getOnlinePlayers()) { - Bukkit.dispatchCommand(player, event.getCommand()); - } - break; - } - case SendPlayerToLocationEvent.ACTION: { - SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToLocationEvent.class); - BukkitLocation location = new BukkitLocation(event.getLocation()); - if (BallAPI.getInstance().isLocalServer(location.getServerID())) { - for (UUID uuid : event.getSendPlayerUUID()) { - Player player = Bukkit.getPlayer(uuid); - if (player != null) { - HamsterBallPlugin.sync(() -> { - player.teleport(location.toBukkitLocation()); - if (event.getDoneMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); - event.getDoneMessage().show(audience); - } - }); - } else { - playerToLocation.put(uuid, new ToLocation(location.toBukkitLocation(), event.getDoneMessage())); - } - } - } - break; - } - case SendPlayerToPlayerEvent.ACTION: { - SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToPlayerEvent.class); - Player toPlayer = Bukkit.getPlayer(event.getToPlayerUUID()); - if (toPlayer == null) { - break; - } - Location location = toPlayer.getLocation(); - for (UUID uuid : event.getSendPlayerUUID()) { - Player sendPlayer = Bukkit.getPlayer(uuid); - if (sendPlayer != null) { - HamsterBallPlugin.sync(() -> { - sendPlayer.teleport(location); - if (event.getDoneMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(sendPlayer); - event.getDoneMessage().show(audience, TextReplacementConfig.builder() - .matchLiteral("%player_name%") - .replacement(toPlayer.getName()) - .build()); - } - if (event.getDoneTargetMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(toPlayer); - event.getDoneTargetMessage().show(audience, TextReplacementConfig.builder() - .matchLiteral("%player_name%") - .replacement(sendPlayer.getName()) - .build()); - } - }); - } else { - ToPlayer data = new ToPlayer( - toPlayer.getUniqueId(), - toPlayer.getLocation(), - event.getDoneMessage(), - event.getDoneTargetMessage() - ); - playerToPlayer.put(uuid, data); - } - } - break; - } - } - } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); @@ -189,6 +86,103 @@ public class BallBukkitListener implements Listener, BallListener { }); } + @Subscribe + public void onBroadcastPlayerMessage(BroadcastPlayerMessageEvent event) { + DisplayMessage message = event.getMessage(); + Audience audience = CoreAPI.getInstance().getAudienceProvider().all(); + message.show(audience); + } + + @Subscribe + public void onDispatchConsoleCommand(DispatchConsoleCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.GAME) { + return; + } + if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { + return; + } + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), event.getCommand()); + } + + @Subscribe + public void onDispatchPlayerCommand(DispatchPlayerCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.GAME) { + return; + } + if (event.getUuid() != null) { + Player player = Bukkit.getPlayer(event.getUuid()); + if (player == null) { + return; + } + Bukkit.dispatchCommand(player, event.getCommand()); + return; + } + for (Player player : Bukkit.getOnlinePlayers()) { + Bukkit.dispatchCommand(player, event.getCommand()); + } + } + + @Subscribe + public void onSendPlayerToLocation(SendPlayerToLocationEvent event) { + BukkitLocation location = new BukkitLocation(event.getLocation()); + if (!BallAPI.getInstance().isLocalServer(location.getServerID())) { + return; + } + for (UUID uuid : event.getSendPlayerUUID()) { + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + HamsterBallPlugin.sync(() -> { + player.teleport(location.toBukkitLocation()); + if (event.getDoneMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); + event.getDoneMessage().show(audience); + } + }); + } else { + playerToLocation.put(uuid, new ToLocation(location.toBukkitLocation(), event.getDoneMessage())); + } + } + } + + @Subscribe + public void onSendPlayerToPlayer(SendPlayerToPlayerEvent event) { + Player toPlayer = Bukkit.getPlayer(event.getToPlayerUUID()); + if (toPlayer == null) { + return; + } + Location location = toPlayer.getLocation(); + for (UUID uuid : event.getSendPlayerUUID()) { + Player sendPlayer = Bukkit.getPlayer(uuid); + if (sendPlayer != null) { + HamsterBallPlugin.sync(() -> { + sendPlayer.teleport(location); + if (event.getDoneMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(sendPlayer); + event.getDoneMessage().show(audience, TextReplacementConfig.builder() + .matchLiteral("%player_name%") + .replacement(toPlayer.getName()) + .build()); + } + if (event.getDoneTargetMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(toPlayer); + event.getDoneTargetMessage().show(audience, TextReplacementConfig.builder() + .matchLiteral("%player_name%") + .replacement(sendPlayer.getName()) + .build()); + } + }); + } else { + ToPlayer data = new ToPlayer( + toPlayer.getUniqueId(), + toPlayer.getLocation(), + event.getDoneMessage(), + event.getDoneTargetMessage() + ); + playerToPlayer.put(uuid, data); + } + } + } + @NotNull private List getCachedPlayerMessage(@NotNull UUID uuid) throws SQLException { ArrayList list = new ArrayList<>(); diff --git a/ball-bungeecord/build.gradle.kts b/ball-bungee/build.gradle.kts similarity index 74% rename from ball-bungeecord/build.gradle.kts rename to ball-bungee/build.gradle.kts index c8c71f3..d42aec7 100644 --- a/ball-bungeecord/build.gradle.kts +++ b/ball-bungee/build.gradle.kts @@ -1,3 +1,5 @@ +@file:Suppress("VulnerableLibrariesLocal", "GradlePackageVersionRange", "GradlePackageUpdate") + evaluationDependsOn(":ball-common") dependencies { @@ -5,8 +7,8 @@ dependencies { compileOnly("net.md-5:bungeecord-api:+") compileOnly("cn.hamster3.mc.plugin:core-bungeecord:+") - // https://mvnrepository.com/artifact/io.lettuce/lettuce-core - implementation("io.lettuce:lettuce-core:6.2.6.RELEASE") + + implementation("io.lettuce:lettuce-core:+") } tasks { diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java similarity index 89% rename from ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java rename to ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java index b4b27bd..71f708f 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java @@ -2,6 +2,7 @@ package cn.hamster3.mc.plugin.core.bungee; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import cn.hamster3.mc.plugin.core.bungee.api.BallBungeeCordAPI; import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeCordListener; @@ -45,18 +46,15 @@ public class HamsterBallPlugin extends Plugin { } catch (Exception e) { e.printStackTrace(); } - if (!BallAPI.getInstance().isEnabled()) { - ProxyServer.getInstance().stop("由于 HamsterBall 未能成功连接, 服务器将立即关闭"); - return; - } ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeCordListener.INSTANCE); + BallAPI.getInstance().getEventBus().register(BallBungeeCordListener.INSTANCE); logger.info("已注册 BallBungeeCordListener"); BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - ServerOnlineEvent.ACTION, + BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) ); - BallAPI.getInstance().getAllPlayerInfo().values() + // 移除失效的在线玩家 + BallAPI.getInstance().getPlayerInfo().values() .stream() .filter(BallPlayerInfo::isOnline) .filter(o -> BallAPI.getInstance().isLocalServer(o.getProxyServer())) diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java similarity index 100% rename from ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java rename to ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java new file mode 100644 index 0000000..d140226 --- /dev/null +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java @@ -0,0 +1,184 @@ +package cn.hamster3.mc.plugin.core.bungee.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.operate.*; +import cn.hamster3.mc.plugin.ball.common.event.player.*; +import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; +import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience; +import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import com.google.common.eventbus.Subscribe; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.PendingConnection; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.*; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +import java.util.UUID; + +public final class BallBungeeCordListener implements Listener { + public static final BallBungeeCordListener INSTANCE = new BallBungeeCordListener(); + + private BallBungeeCordListener() { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPreLogin(PreLoginEvent event) { + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreLogin.name(), + new BallPlayerPreLoginEvent(event.getConnection().getName()) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onLogin(LoginEvent event) { + if (event.isCancelled()) { + return; + } + PendingConnection connection = event.getConnection(); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogin.name(), + new BallPlayerLoginEvent(new BallPlayerInfo( + connection.getUniqueId(), connection.getName(), "connecting", + BallAPI.getInstance().getLocalServerId(), true + )) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPostLogin(PostLoginEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.BallPlayerPostLogin.name(), + new BallPlayerPostLoginEvent(playerInfo) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnect(ServerConnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getTarget().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreConnectServer.name(), + new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnected(ServerConnectedEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getServer().getInfo().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPostConnectServer.name(), + new BallPlayerPostConnectServerEvent(playerInfo) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerDisconnect(PlayerDisconnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); + BallAPI.getInstance().sendBallMessage(BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogout.name(), + new BallPlayerLogoutEvent(playerInfo) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @Subscribe + public void onDispatchConsoleCommand(DispatchConsoleCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.PROXY) { + return; + } + if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { + return; + } + ProxyServer server = ProxyServer.getInstance(); + server.getPluginManager().dispatchCommand(server.getConsole(), event.getCommand()); + } + + @Subscribe + public void onDispatchPlayerCommandEvent(DispatchPlayerCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.GAME) { + return; + } + ProxyServer server = ProxyServer.getInstance(); + if (event.getUuid() != null) { + ProxiedPlayer player = server.getPlayer(event.getUuid()); + if (player == null) { + return; + } + server.getPluginManager().dispatchCommand(player, event.getCommand()); + return; + } + for (ProxiedPlayer player : server.getPlayers()) { + server.getPluginManager().dispatchCommand(player, event.getCommand()); + } + } + + @Subscribe + public void onKickPlayerEvent(KickPlayerEvent event) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(event.getUuid()); + BaseComponent[] components = BungeeComponentSerializer.get().serialize(event.getReason()); + player.disconnect(components); + } + + @Subscribe + public void onSendMessageToPlayerEvent(SendMessageToPlayerEvent event) { + for (UUID receiver : event.getReceivers()) { + Audience audience = CoreAPI.getInstance().getAudienceProvider().player(receiver); + event.getMessage().show(audience); + } + } + + @Subscribe + public void onSendPlayerToLocationEvent(SendPlayerToLocationEvent event) { + String serverID = event.getLocation().getServerID(); + ServerInfo serverInfo = ProxyServer.getInstance().getServerInfo(serverID); + if (serverInfo == null) { + HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 服务器 " + serverID + " 不在线"); + return; + } + for (UUID uuid : event.getSendPlayerUUID()) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid); + if (player == null) { + continue; + } + if (player.getServer().getInfo().getName().equals(serverID)) { + continue; + } + player.connect(serverInfo); + } + } + + @Subscribe + public void onSendPlayerToPlayerEvent(SendPlayerToPlayerEvent event) { + UUID toPlayerUUID = event.getToPlayerUUID(); + ProxiedPlayer toPlayer = ProxyServer.getInstance().getPlayer(toPlayerUUID); + if (toPlayer == null) { + HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 目标玩家 " + toPlayerUUID + " 不在线"); + return; + } + ServerInfo toServer = toPlayer.getServer().getInfo(); + for (UUID uuid : event.getSendPlayerUUID()) { + ProxiedPlayer sendPlayer = ProxyServer.getInstance().getPlayer(uuid); + if (sendPlayer.getServer().getInfo().getName().equals(toServer.getName())) { + continue; + } + sendPlayer.connect(toServer); + } + } +} diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java similarity index 97% rename from ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java rename to ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java index 9244d06..a075e89 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java @@ -2,6 +2,7 @@ package cn.hamster3.mc.plugin.core.bungee.util; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariConfig; @@ -51,7 +52,7 @@ public final class BallBungeeCordUtils { } BallAPI.getInstance().sendBallMessage( BallAPI.BALL_CHANNEL, - BallPlayerInfoUpdateEvent.ACTION, + BallActions.BallPlayerInfoUpdate.name(), new BallPlayerInfoUpdateEvent(playerInfo) ); }); diff --git a/ball-bungeecord/src/main/resources/bungee.yml b/ball-bungee/src/main/resources/bungee.yml similarity index 100% rename from ball-bungeecord/src/main/resources/bungee.yml rename to ball-bungee/src/main/resources/bungee.yml diff --git a/ball-bungeecord/src/main/resources/config.yml b/ball-bungee/src/main/resources/config.yml similarity index 100% rename from ball-bungeecord/src/main/resources/config.yml rename to ball-bungee/src/main/resources/config.yml diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java deleted file mode 100644 index 35d1724..0000000 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java +++ /dev/null @@ -1,205 +0,0 @@ -package cn.hamster3.mc.plugin.core.bungee.listener; - -import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; -import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; -import cn.hamster3.mc.plugin.ball.common.event.operate.*; -import cn.hamster3.mc.plugin.ball.common.event.player.*; -import cn.hamster3.mc.plugin.ball.common.listener.BallListener; -import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; -import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; -import cn.hamster3.mc.plugin.core.common.api.CoreAPI; -import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience; -import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.*; -import net.md_5.bungee.api.plugin.Listener; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.event.EventPriority; -import org.jetbrains.annotations.NotNull; - -import java.util.UUID; - -public final class BallBungeeCordListener implements Listener, BallListener { - public static final BallBungeeCordListener INSTANCE = new BallBungeeCordListener(); - - private BallBungeeCordListener() { - } - - @Override - public void onMessageReceived(@NotNull BallMessageInfo info) { - switch (info.getAction()) { - case DispatchConsoleCommandEvent.ACTION: { - DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchConsoleCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.PROXY) { - return; - } - if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { - return; - } - ProxyServer server = ProxyServer.getInstance(); - server.getPluginManager().dispatchCommand(server.getConsole(), event.getCommand()); - break; - } - case DispatchPlayerCommandEvent.ACTION: { - DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchPlayerCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.GAME) { - return; - } - ProxyServer server = ProxyServer.getInstance(); - if (event.getUuid() != null) { - ProxiedPlayer player = server.getPlayer(event.getUuid()); - if (player == null) { - return; - } - server.getPluginManager().dispatchCommand(player, event.getCommand()); - return; - } - for (ProxiedPlayer player : server.getPlayers()) { - server.getPluginManager().dispatchCommand(player, event.getCommand()); - } - break; - } - case KickPlayerEvent.ACTION: { - KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), KickPlayerEvent.class); - ProxiedPlayer player = ProxyServer.getInstance().getPlayer(event.getUuid()); - BaseComponent[] components = BungeeComponentSerializer.get().serialize(event.getReason()); - player.disconnect(components); - break; - } - case SendMessageToPlayerEvent.ACTION: { - SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendMessageToPlayerEvent.class); - for (UUID receiver : event.getReceivers()) { - Audience audience = CoreAPI.getInstance().getAudienceProvider().player(receiver); - event.getMessage().show(audience); - } - break; - } - case SendPlayerToLocationEvent.ACTION: { - SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToLocationEvent.class); - String serverID = event.getLocation().getServerID(); - ServerInfo serverInfo = ProxyServer.getInstance().getServerInfo(serverID); - if (serverInfo == null) { - HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 服务器 " + serverID + " 不在线"); - break; - } - for (UUID uuid : event.getSendPlayerUUID()) { - ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid); - if (player == null) { - continue; - } - if (player.getServer().getInfo().getName().equals(serverID)) { - continue; - } - player.connect(serverInfo); - } - break; - } - case SendPlayerToPlayerEvent.ACTION: { - SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToPlayerEvent.class); - UUID toPlayerUUID = event.getToPlayerUUID(); - ProxiedPlayer toPlayer = ProxyServer.getInstance().getPlayer(toPlayerUUID); - if (toPlayer == null) { - HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 目标玩家 " + toPlayerUUID + " 不在线"); - break; - } - ServerInfo toServer = toPlayer.getServer().getInfo(); - for (UUID uuid : event.getSendPlayerUUID()) { - ProxiedPlayer sendPlayer = ProxyServer.getInstance().getPlayer(uuid); - if (sendPlayer.getServer().getInfo().getName().equals(toServer.getName())) { - continue; - } - sendPlayer.connect(toServer); - } - } - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPreLogin(PreLoginEvent event) { - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPreLoginEvent.ACTION, - new BallPlayerPreLoginEvent(event.getConnection().getName()) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onLogin(LoginEvent event) { - if (event.isCancelled()) { - return; - } - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerLoginEvent.ACTION, - new BallPlayerLoginEvent(new BallPlayerInfo( - event.getConnection().getUniqueId(), - event.getConnection().getName(), - "connecting", - BallAPI.getInstance().getLocalServerId(), - true - )) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPostLogin(PostLoginEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPostLoginEvent.ACTION, - new BallPlayerPostLoginEvent(playerInfo) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnect(ServerConnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getTarget().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPreConnectServerEvent.ACTION, - new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnected(ServerConnectedEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getServer().getInfo().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPostConnectServerEvent.ACTION, - new BallPlayerPostConnectServerEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler - public void onServerSwitch(ServerSwitchEvent event) { - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerDisconnect(ServerDisconnectEvent event) { - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPlayerDisconnect(PlayerDisconnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerLogoutEvent.ACTION, - new BallPlayerLogoutEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } -} diff --git a/ball-common/build.gradle.kts b/ball-common/build.gradle.kts index fcb0a68..22db957 100644 --- a/ball-common/build.gradle.kts +++ b/ball-common/build.gradle.kts @@ -1,12 +1,12 @@ -@file:Suppress("VulnerableLibrariesLocal") +@file:Suppress("VulnerableLibrariesLocal", "GradlePackageVersionRange", "GradlePackageUpdate") dependencies { compileOnly("cn.hamster3.mc.plugin:core-common:+") compileOnly("com.google.code.gson:gson:2.8.0") + compileOnly("com.google.guava:guava:31.0-jre") - // https://mvnrepository.com/artifact/io.lettuce/lettuce-core - compileOnly("io.lettuce:lettuce-core:6.2.6.RELEASE") + compileOnly("io.lettuce:lettuce-core:+") } tasks { diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index e35a81a..d0d0b10 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -1,22 +1,22 @@ package cn.hamster3.mc.plugin.ball.common.api; import cn.hamster3.mc.plugin.ball.common.data.BallLocation; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.message.MessageSentEvent; import cn.hamster3.mc.plugin.ball.common.event.operate.*; -import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerConnectServerEvent; -import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; +import cn.hamster3.mc.plugin.ball.common.listener.BallCommonListener; import cn.hamster3.mc.plugin.ball.common.listener.BallDebugListener; -import cn.hamster3.mc.plugin.ball.common.listener.BallListener; -import cn.hamster3.mc.plugin.ball.common.listener.BallMessageListener; -import cn.hamster3.mc.plugin.ball.common.listener.ListenerPriority; +import cn.hamster3.mc.plugin.ball.common.listener.BallRedisListener; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.Component; +import com.google.common.eventbus.AsyncEventBus; +import com.google.common.eventbus.EventBus; import io.lettuce.core.RedisClient; import io.lettuce.core.pubsub.StatefulRedisPubSubConnection; import lombok.Getter; @@ -30,6 +30,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; @SuppressWarnings("unused") +@Getter public abstract class BallAPI { /** * API 使用的通信频道 @@ -51,105 +52,29 @@ public abstract class BallAPI { @NotNull private final RedisClient redisClient; @NotNull - private final StatefulRedisPubSubConnection pubSubConnection; - + private final StatefulRedisPubSubConnection subConnection; @NotNull - private List listeners; - @Getter - private boolean enabled; + private final StatefulRedisPubSubConnection pubConnection; + @NotNull + private final EventBus eventBus; public BallAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { this.localServerInfo = localServerInfo; this.datasource = datasource; this.redisClient = redisClient; - pubSubConnection = redisClient.connectPubSub(BallMessageInfo.CODEC); + subConnection = redisClient.connectPubSub(BallMessage.CODEC); + pubConnection = redisClient.connectPubSub(BallMessage.CODEC); serverInfo = new ConcurrentHashMap<>(); playerInfo = new ConcurrentHashMap<>(); - listeners = new ArrayList<>(); - enabled = false; - initListener(debug); - } - - private void initListener(boolean debug) { - addListener(new BallListener() { - @Override - public ListenerPriority getPriority() { - return ListenerPriority.LOW; - } - - @Override - public void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { - BallPlayerInfo info = event.getPlayerInfo(); - playerInfo.put(info.getUuid(), info); - } - - @Override - public void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { - BallPlayerInfo info = event.getPlayerInfo(); - playerInfo.put(info.getUuid(), info); - } - - @Override - public void onServerOnline(@NotNull ServerOnlineEvent event) { - BallServerInfo info = event.getServerInfo(); - serverInfo.put(info.getId(), info); - switch (info.getType()) { - case GAME: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getGameServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - case PROXY: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getProxyServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - } - } - - @Override - public void onServerOffline(@NotNull ServerOfflineEvent event) { - String serverID = event.getServerID(); - BallServerInfo info = serverInfo.remove(serverID); - if (info == null) { - return; - } - switch (info.getType()) { - case GAME: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getGameServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - case PROXY: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getProxyServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - } - } - }); + eventBus = new AsyncEventBus("HamsterBall - EventBus", CoreAPI.getInstance().getExecutorService()); + eventBus.register(BallCommonListener.INSTANCE); if (debug) { getLogger().warning("已启用调试模式"); - pubSubConnection.addListener(BallDebugListener.INSTANCE); + subConnection.addListener(BallDebugListener.INSTANCE); } } protected void enable() throws SQLException, InterruptedException { - if (enabled) { - return; - } BallServerInfo localInfo = getLocalServerInfo(); try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { @@ -216,13 +141,12 @@ public abstract class BallAPI { } } RedisClient client = getRedisClient(); - pubSubConnection.addListener(BallMessageListener.INSTANCE); - pubSubConnection.async().subscribe("HamsterBall"); - enabled = true; + subConnection.addListener(BallRedisListener.INSTANCE); + subConnection.async().subscribe(BALL_CHANNEL); } protected void disable() throws SQLException, InterruptedException { - sendBallMessage(new BallMessageInfo(BALL_CHANNEL, ServerOfflineEvent.ACTION, new ServerOfflineEvent(getLocalServerId())), true); + sendBallMessage(new BallMessage(BALL_CHANNEL, BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerId())), true); try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( @@ -279,12 +203,12 @@ public abstract class BallAPI { * @param message 消息 */ public void broadcastPlayerMessage(@NotNull DisplayMessage message) { - sendBallMessage(new BallMessageInfo( + sendBallMessage(new BallMessage( BALL_CHANNEL, getLocalServerId(), null, BallServerType.PROXY, - BroadcastPlayerMessageEvent.ACTION, + BallActions.BroadcastPlayerMessage.name(), CoreAPI.getInstance().getGson().toJsonTree( new BroadcastPlayerMessageEvent(message) ) @@ -299,12 +223,12 @@ public abstract class BallAPI { * @param command 命令内容 */ public void dispatchConsoleCommand(@Nullable BallServerType type, @Nullable String serverID, @NotNull String command) { - sendBallMessage(new BallMessageInfo( + sendBallMessage(new BallMessage( BALL_CHANNEL, getLocalServerId(), null, BallServerType.GAME, - DispatchConsoleCommandEvent.ACTION, + BallActions.DispatchConsoleCommand.name(), CoreAPI.getInstance().getGson().toJsonTree( new DispatchConsoleCommandEvent(type, serverID, command) ) @@ -319,12 +243,12 @@ public abstract class BallAPI { * @param command 命令内容 */ public void dispatchPlayerCommand(@Nullable BallServerType type, @Nullable UUID uuid, @NotNull String command) { - sendBallMessage(new BallMessageInfo( + sendBallMessage(new BallMessage( BALL_CHANNEL, getLocalServerId(), null, BallServerType.GAME, - DispatchPlayerCommandEvent.ACTION, + BallActions.DispatchPlayerCommand.name(), CoreAPI.getInstance().getGson().toJsonTree( new DispatchPlayerCommandEvent(type, uuid, command) ) @@ -348,12 +272,12 @@ public abstract class BallAPI { * @param reason 原因 */ public void kickPlayer(@NotNull UUID uuid, @NotNull Component reason) { - sendBallMessage(new BallMessageInfo( + sendBallMessage(new BallMessage( BALL_CHANNEL, getLocalServerId(), null, BallServerType.PROXY, - KickPlayerEvent.ACTION, + BallActions.KickPlayer.name(), CoreAPI.getInstance().getGson().toJsonTree( new KickPlayerEvent(uuid, reason) ) @@ -368,34 +292,7 @@ public abstract class BallAPI { * @param cache 当玩家不在线时,是否缓存消息等待玩家上线再发送 */ public void sendMessageToPlayer(@NotNull UUID receiver, @NotNull DisplayMessage message, boolean cache) { - BallPlayerInfo info = getPlayerInfo(receiver); - if (info == null || !info.isOnline()) { - if (!cache) { - return; - } - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { - try (PreparedStatement statement = connection.prepareStatement( - "INSERT INTO `hamster_ball_cached_message` VALUES(?, ?);" - )) { - statement.setString(1, receiver.toString()); - statement.setString(2, message.toJson().toString()); - statement.executeUpdate(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return; - } - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.PROXY, - SendMessageToPlayerEvent.ACTION, - CoreAPI.getInstance().getGson().toJsonTree( - new SendMessageToPlayerEvent(Collections.singleton(receiver), message) - ) - )); + sendMessageToPlayer(Collections.singleton(receiver), message, cache); } /** @@ -425,12 +322,12 @@ public abstract class BallAPI { } } } - sendBallMessage(new BallMessageInfo( + sendBallMessage(new BallMessage( BALL_CHANNEL, getLocalServerId(), null, BallServerType.PROXY, - SendMessageToPlayerEvent.ACTION, + BallActions.SendMessageToPlayer.name(), CoreAPI.getInstance().getGson().toJsonTree( new SendMessageToPlayerEvent(new HashSet<>(receivers), message) ) @@ -449,11 +346,7 @@ public abstract class BallAPI { * @param doneMessage 传送完成后显示的消息 */ public void sendPlayerToLocation(@NotNull UUID sendPlayerUUID, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { - sendBallMessage( - BALL_CHANNEL, - SendPlayerToLocationEvent.ACTION, - new SendPlayerToLocationEvent(Collections.singleton(sendPlayerUUID), location, doneMessage) - ); + sendPlayerToLocation(Collections.singleton(sendPlayerUUID), location, doneMessage); } /** @@ -468,9 +361,7 @@ public abstract class BallAPI { * @param doneMessage 传送完成后显示的消息 */ public void sendPlayerToLocation(@NotNull Collection sendPlayerUUID, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { - sendBallMessage( - BALL_CHANNEL, - SendPlayerToLocationEvent.ACTION, + sendBallMessage(BALL_CHANNEL, BallActions.SendPlayerToLocation.name(), new SendPlayerToLocationEvent(new HashSet<>(sendPlayerUUID), location, doneMessage) ); } @@ -486,11 +377,7 @@ public abstract class BallAPI { * @param doneTargetMessage 传送完成后目标玩家显示的消息,自动将 %player_name% 替换成被传送者的名称 */ public void sendPlayerToPlayer(@NotNull UUID sendPlayer, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { - sendBallMessage( - BALL_CHANNEL, - SendPlayerToPlayerEvent.ACTION, - new SendPlayerToPlayerEvent(Collections.singleton(sendPlayer), toPlayer, doneMessage, doneTargetMessage) - ); + sendPlayerToPlayer(Collections.singleton(sendPlayer), toPlayer, doneMessage, doneTargetMessage); } /** @@ -504,9 +391,7 @@ public abstract class BallAPI { * @param doneTargetMessage 传送完成后目标玩家显示的消息,自动将 %player_name% 替换成被传送者的名称 */ public void sendPlayerToPlayer(@NotNull Collection sendPlayerUUID, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { - sendBallMessage( - BALL_CHANNEL, - SendPlayerToPlayerEvent.ACTION, + sendBallMessage(BALL_CHANNEL, BallActions.SendPlayerToPlayer.name(), new SendPlayerToPlayerEvent(new HashSet<>(sendPlayerUUID), toPlayer, doneMessage, doneTargetMessage) ); } @@ -518,7 +403,7 @@ public abstract class BallAPI { * @param action 执行动作 */ public void sendBallMessage(@NotNull String channel, @NotNull String action) { - sendBallMessage(new BallMessageInfo(channel, action)); + sendBallMessage(new BallMessage(channel, action)); } /** @@ -529,7 +414,7 @@ public abstract class BallAPI { * @param content 附加参数 */ public void sendBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { - sendBallMessage(new BallMessageInfo(channel, action, content)); + sendBallMessage(new BallMessage(channel, action, content)); } /** @@ -537,45 +422,29 @@ public abstract class BallAPI { * * @param messageInfo 消息内容 */ - public void sendBallMessage(@NotNull BallMessageInfo messageInfo) { + public void sendBallMessage(@NotNull BallMessage messageInfo) { sendBallMessage(messageInfo, false); } /** * 自定义服务消息信息并发送 * - * @param messageInfo 消息内容 + * @param ballMessage 消息内容 * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) */ - public void sendBallMessage(@NotNull BallMessageInfo messageInfo, boolean block) { - String string = CoreAPI.getInstance().getGson().toJson(messageInfo); - try (StatefulRedisPubSubConnection connection = getRedisClient().connectPubSub(BallMessageInfo.CODEC)) { - if (block) { - connection.sync().publish("HamsterBall", messageInfo); - } else { - connection.async().publish("HamsterBall", messageInfo); - } + public void sendBallMessage(@NotNull BallMessage ballMessage, boolean block) { + String string = CoreAPI.getInstance().getGson().toJson(ballMessage); + if (block) { + pubConnection.sync().publish(BALL_CHANNEL, ballMessage); + eventBus.post(new MessageSentEvent(ballMessage)); + } else { + pubConnection.async().publish(BALL_CHANNEL, ballMessage).whenComplete((aLong, throwable) -> { + if (throwable != null) { + return; + } + eventBus.post(new MessageSentEvent(ballMessage)); + }); } - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onMessageSend(messageInfo); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - } - - public void addListener(@NotNull BallListener listener) { - ArrayList newListeners = new ArrayList<>(listeners); - newListeners.add(listener); - newListeners.sort(Comparator.comparing(BallListener::getPriority)); - listeners = newListeners; - } - - public void removeListener(@NotNull BallListener listener) { - ArrayList newListeners = new ArrayList<>(listeners); - newListeners.remove(listener); - listeners = newListeners; } /** @@ -705,21 +574,6 @@ public abstract class BallAPI { return info.getName(); } - @NotNull - public Map getAllServerInfo() { - return serverInfo; - } - - @NotNull - public Map getAllPlayerInfo() { - return playerInfo; - } - - @NotNull - public List getListeners() { - return listeners; - } - @NotNull public abstract Logger getLogger(); @@ -727,9 +581,4 @@ public abstract class BallAPI { public DataSource getDatasource() { return datasource == null ? CoreAPI.getInstance().getDataSource() : datasource; } - - @NotNull - public RedisClient getRedisClient() { - return redisClient; - } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java similarity index 87% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java index 7d9b7ee..29bddb7 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java @@ -22,20 +22,20 @@ import java.util.UUID; */ @Data @SuppressWarnings("unused") -public class BallMessageInfo { +public class BallMessage { /** * 编解码器 */ - public static final RedisCodec CODEC = new RedisCodec() { + public static final RedisCodec CODEC = new RedisCodec() { @Override public String decodeKey(ByteBuffer bytes) { return StringCodec.UTF8.decodeKey(bytes); } @Override - public BallMessageInfo decodeValue(ByteBuffer bytes) { + public BallMessage decodeValue(ByteBuffer bytes) { String string = StringCodec.UTF8.decodeValue(bytes); - return CoreAPI.getInstance().getGson().fromJson(string, BallMessageInfo.class); + return CoreAPI.getInstance().getGson().fromJson(string, BallMessage.class); } @Override @@ -44,7 +44,7 @@ public class BallMessageInfo { } @Override - public ByteBuffer encodeValue(BallMessageInfo value) { + public ByteBuffer encodeValue(BallMessage value) { return StringCodec.UTF8.encodeValue(CoreAPI.getInstance().getGson().toJson(value)); } }; @@ -90,21 +90,21 @@ public class BallMessageInfo { */ private JsonElement content; - public BallMessageInfo(@NotNull String channel, @NotNull String action) { + public BallMessage(@NotNull String channel, @NotNull String action) { senderID = BallAPI.getInstance().getLocalServerId(); this.channel = channel; this.action = action; } - public BallMessageInfo(@NotNull String channel, @NotNull String action, @NotNull Object content) { + public BallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { this.channel = channel; senderID = BallAPI.getInstance().getLocalServerId(); this.action = action; this.content = CoreAPI.getInstance().getGson().toJsonTree(content); } - public BallMessageInfo(@NotNull String channel, @NotNull String senderID, @Nullable String receiverID, - @Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) { + public BallMessage(@NotNull String channel, @NotNull String senderID, @Nullable String receiverID, + @Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) { this.channel = channel; this.senderID = senderID; this.receiverID = receiverID; diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java new file mode 100644 index 0000000..26c65ce --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java @@ -0,0 +1,24 @@ +package cn.hamster3.mc.plugin.ball.common.event; + +public enum BallActions { + BroadcastPlayerMessage, + DispatchConsoleCommand, + DispatchPlayerCommand, + KickPlayer, + SendMessageToPlayer, + SendPlayerToLocation, + SendPlayerToPlayer, + + BallPlayerPreLogin, + BallPlayerLogin, + BallPlayerPostLogin, + BallPlayerPreConnectServer, + BallPlayerConnectServer, + BallPlayerPostConnectServer, + BallPlayerLogout, + + BallPlayerInfoUpdate, + + ServerOffline, + ServerOnline, +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java new file mode 100644 index 0000000..554bf20 --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java @@ -0,0 +1,11 @@ +package cn.hamster3.mc.plugin.ball.common.event.message; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class MessageReceivedEvent { + private BallMessage message; +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java new file mode 100644 index 0000000..4761c3a --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java @@ -0,0 +1,11 @@ +package cn.hamster3.mc.plugin.ball.common.event.message; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class MessageSentEvent { + private BallMessage message; +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java index 6342330..ae8e886 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java @@ -8,9 +8,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BroadcastPlayerMessageEvent { - public static final String ACTION = "BroadcastPlayerMessage"; - @NotNull private final DisplayMessage message; - } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java index a27e40e..0c4ec36 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java @@ -9,8 +9,6 @@ import org.jetbrains.annotations.Nullable; @Data @AllArgsConstructor public class DispatchConsoleCommandEvent { - public static final String ACTION = "DispatchConsoleCommand"; - @Nullable private final BallServerType type; @Nullable diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java index e13018b..1e9365a 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java @@ -11,8 +11,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class DispatchPlayerCommandEvent { - public static final String ACTION = "DispatchPlayerCommand"; - @Nullable private final BallServerType type; @Nullable diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java index 64bee96..ba571da 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java @@ -10,8 +10,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class KickPlayerEvent { - public static final String ACTION = "KickPlayer"; - @NotNull private final UUID uuid; @NotNull diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java index 23c48f3..a1a1885 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java @@ -11,8 +11,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class SendMessageToPlayerEvent { - public static final String ACTION = "SendMessageToPlayer"; - @NotNull private final Set receivers; @NotNull diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java index d4519eb..a701911 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java @@ -13,8 +13,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class SendPlayerToLocationEvent { - public static final String ACTION = "SendPlayerToLocation"; - @NotNull private final Set sendPlayerUUID; @NotNull diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java index 3af5576..9797624 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java @@ -12,8 +12,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class SendPlayerToPlayerEvent { - public static final String ACTION = "SendPlayerToPlayer"; - @NotNull private final Set sendPlayerUUID; @NotNull @@ -22,5 +20,4 @@ public class SendPlayerToPlayerEvent { private final DisplayMessage doneMessage; @Nullable private final DisplayMessage doneTargetMessage; - } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java index 4dde9f2..a66fc6e 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java @@ -18,8 +18,6 @@ import org.jetbrains.annotations.Nullable; @Data @AllArgsConstructor public class BallPlayerConnectServerEvent { - public static final String ACTION = "PlayerConnectServer"; - @NotNull private final BallPlayerInfo playerInfo; @Nullable diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java index 5df3559..3a030e1 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerInfoUpdateEvent { - public static final String ACTION = "PlayerInfoUpdateEvent"; - @NotNull private final BallPlayerInfo playerInfo; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java index 8605061..a6f51c1 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerLoginEvent { - public static final String ACTION = "PlayerLogin"; - @NotNull private final BallPlayerInfo playerInfo; diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java index fdca0b3..ced102d 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerLogoutEvent { - public static final String ACTION = "PlayerLogout"; - @NotNull private BallPlayerInfo playerInfo; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java index d63ae4e..8ba54f4 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java @@ -15,8 +15,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerPostConnectServerEvent { - public static final String ACTION = "PlayerPostConnectServer"; - @NotNull private final BallPlayerInfo playerInfo; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java index 299fa50..0220d80 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerPostLoginEvent { - public static final String ACTION = "PlayerPostLogin"; - @NotNull private final BallPlayerInfo playerInfo; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java index 9a21b5f..ffd2b7a 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java @@ -16,13 +16,10 @@ import org.jetbrains.annotations.Nullable; @Data @AllArgsConstructor public class BallPlayerPreConnectServerEvent { - public static final String ACTION = "PlayerPreConnectServer"; - @NotNull private final BallPlayerInfo playerInfo; @Nullable private final String from; @NotNull private final String to; - } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java index 23ce371..63f5c57 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java @@ -10,8 +10,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerPreLoginEvent { - public static final String ACTION = "PlayerPreLogin"; - @NotNull private final String playerName; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java index 2109925..494952f 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java @@ -10,8 +10,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class ServerOfflineEvent { - public static final String ACTION = "ServerOffline"; - @NotNull private final String serverID; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java index 1fc203e..23e71fe 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class ServerOnlineEvent { - public static final String ACTION = "ServerOnline"; - @NotNull private final BallServerInfo serverInfo; diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java new file mode 100644 index 0000000..4d575de --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java @@ -0,0 +1,81 @@ +package cn.hamster3.mc.plugin.ball.common.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerConnectServerEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; +import com.google.common.eventbus.Subscribe; +import org.jetbrains.annotations.NotNull; + +public class BallCommonListener { + public static final BallCommonListener INSTANCE = new BallCommonListener(); + + private BallCommonListener() { + } + + @Subscribe + public void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { + BallPlayerInfo info = event.getPlayerInfo(); + BallAPI.getInstance().getPlayerInfo().put(info.getUuid(), info); + } + + @Subscribe + public void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { + BallPlayerInfo info = event.getPlayerInfo(); + BallAPI.getInstance().getPlayerInfo().put(info.getUuid(), info); + } + + @Subscribe + public void onServerOnline(@NotNull ServerOnlineEvent event) { + BallServerInfo info = event.getServerInfo(); + BallAPI.getInstance().getServerInfo().put(info.getId(), info); + switch (info.getType()) { + case GAME: { + BallAPI.getInstance().getPlayerInfo().forEach((uuid, playerInfo) -> { + if (playerInfo.getGameServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + case PROXY: { + BallAPI.getInstance().getPlayerInfo().forEach((uuid, playerInfo) -> { + if (playerInfo.getProxyServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + } + } + + @Subscribe + public void onServerOffline(@NotNull ServerOfflineEvent event) { + String serverID = event.getServerID(); + BallServerInfo info = BallAPI.getInstance().getServerInfo().remove(serverID); + if (info == null) { + return; + } + switch (info.getType()) { + case GAME: { + BallAPI.getInstance().getPlayerInfo().forEach((uuid, playerInfo) -> { + if (playerInfo.getGameServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + case PROXY: { + BallAPI.getInstance().getPlayerInfo().forEach((uuid, playerInfo) -> { + if (playerInfo.getProxyServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + } + } +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java index de77072..80b6d51 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java @@ -1,43 +1,38 @@ package cn.hamster3.mc.plugin.ball.common.listener; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import io.lettuce.core.pubsub.RedisPubSubListener; -public class BallDebugListener implements RedisPubSubListener { +public class BallDebugListener implements RedisPubSubListener { public static final BallDebugListener INSTANCE = new BallDebugListener(); private BallDebugListener() { } @Override - public void message(String channel, BallMessageInfo event) { + public void message(String channel, BallMessage event) { BallAPI.getInstance().getLogger().info("从 " + channel + " 收到了一条消息: " + event); } @Override - public void message(String pattern, String channel, BallMessageInfo event) { + public void message(String pattern, String channel, BallMessage event) { BallAPI.getInstance().getLogger().info("从 " + pattern + "(" + channel + ") 收到了一条消息: " + event); } @Override public void subscribed(String channel, long count) { - BallAPI.getInstance().getLogger().info("已订阅 redis 频道: " + channel); - } @Override public void psubscribed(String pattern, long count) { - BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则): " + pattern); } @Override public void unsubscribed(String channel, long count) { - BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道: " + channel); } @Override public void punsubscribed(String pattern, long count) { - BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则): " + pattern); } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java deleted file mode 100644 index a360f1e..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.listener; - -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -import cn.hamster3.mc.plugin.ball.common.event.player.*; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; -import org.jetbrains.annotations.NotNull; - -public interface BallListener { - /** - * 该监听器的执行优先级 - * - * @return 优先级 - */ - default ListenerPriority getPriority() { - return ListenerPriority.NORMAL; - } - - default void onMessageReceived(@NotNull BallMessageInfo event) { - } - - default void onMessageSend(@NotNull BallMessageInfo event) { - } - - default void onBallPlayerPreLogin(@NotNull BallPlayerPreLoginEvent event) { - } - - default void onBallPlayerLogin(@NotNull BallPlayerLoginEvent event) { - } - - default void onBallPlayerPostLogin(@NotNull BallPlayerPostLoginEvent event) { - } - - default void onBallPlayerPreConnectServer(@NotNull BallPlayerPreConnectServerEvent event) { - } - - default void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { - } - - default void onBallPlayerPostConnectServer(@NotNull BallPlayerPostConnectServerEvent event) { - } - - default void onBallPlayerLogout(@NotNull BallPlayerLogoutEvent event) { - } - - default void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { - } - - default void onServerOnline(@NotNull ServerOnlineEvent event) { - } - - default void onServerOffline(@NotNull ServerOfflineEvent event) { - } - -} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java deleted file mode 100644 index 6b0451e..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java +++ /dev/null @@ -1,167 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.listener; - -import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -import cn.hamster3.mc.plugin.ball.common.event.player.*; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; -import cn.hamster3.mc.plugin.core.common.api.CoreAPI; -import io.lettuce.core.pubsub.RedisPubSubListener; - -public class BallMessageListener implements RedisPubSubListener { - public static final BallMessageListener INSTANCE = new BallMessageListener(); - - private BallMessageListener() { - } - - @Override - public void message(String channel, BallMessageInfo info) { - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onMessageReceived(info); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - if (!BallAPI.BALL_CHANNEL.equals(info.getChannel())) { - return; - } - switch (info.getAction()) { - case BallPlayerPreLoginEvent.ACTION: { - BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPreLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPreLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerLoginEvent.ACTION: { - BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPostLoginEvent.ACTION: { - BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPostLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPostLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPreConnectServerEvent.ACTION: { - BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPreConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPreConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerConnectServerEvent.ACTION: { - BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPostConnectServerEvent.ACTION: { - BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPostConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPostConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerLogoutEvent.ACTION: { - BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerLogoutEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerLogout(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerInfoUpdateEvent.ACTION: { - BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerInfoUpdateEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerInfoUpdate(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case ServerOfflineEvent.ACTION: { - ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), ServerOfflineEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onServerOffline(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case ServerOnlineEvent.ACTION: { - ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), ServerOnlineEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onServerOnline(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - } - } - - @Override - public void message(String pattern, String channel, BallMessageInfo info) { - message(channel, info); - } - - @Override - public void subscribed(String channel, long count) { - - } - - @Override - public void psubscribed(String pattern, long count) { - - } - - @Override - public void unsubscribed(String channel, long count) { - - } - - @Override - public void punsubscribed(String pattern, long count) { - - } -} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java new file mode 100644 index 0000000..756ed8e --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java @@ -0,0 +1,143 @@ +package cn.hamster3.mc.plugin.ball.common.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.message.MessageReceivedEvent; +import cn.hamster3.mc.plugin.ball.common.event.operate.*; +import cn.hamster3.mc.plugin.ball.common.event.player.*; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import io.lettuce.core.pubsub.RedisPubSubListener; + +public class BallRedisListener implements RedisPubSubListener { + public static final BallRedisListener INSTANCE = new BallRedisListener(); + + private BallRedisListener() { + } + + @Override + public void message(String channel, BallMessage ballMessage) { + BallAPI.getInstance().getEventBus().post(new MessageReceivedEvent(ballMessage)); + if (!BallAPI.BALL_CHANNEL.equals(ballMessage.getChannel())) { + return; + } + switch (BallActions.valueOf(ballMessage.getAction())) { + case BroadcastPlayerMessage: { + BroadcastPlayerMessageEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BroadcastPlayerMessageEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case DispatchConsoleCommand: { + DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchConsoleCommandEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case DispatchPlayerCommand: { + DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchPlayerCommandEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case KickPlayer: { + KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), KickPlayerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case SendMessageToPlayer: { + SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendMessageToPlayerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case SendPlayerToLocation: { + SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToLocationEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case SendPlayerToPlayer: { + SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToPlayerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + + case BallPlayerPreLogin: { + BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreLoginEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerLogin: { + BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLoginEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerPostLogin: { + BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostLoginEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerPreConnectServer: { + BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreConnectServerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerConnectServer: { + BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerConnectServerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerPostConnectServer: { + BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostConnectServerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerLogout: { + BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLogoutEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + + case BallPlayerInfoUpdate: { + BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerInfoUpdateEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + + case ServerOffline: { + ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOfflineEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case ServerOnline: { + ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOnlineEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + } + } + + @Override + public void message(String pattern, String channel, BallMessage info) { + message(channel, info); + } + + @Override + public void subscribed(String channel, long count) { + BallAPI.getInstance().getLogger().info("已订阅 redis 频道: " + channel); + + } + + @Override + public void psubscribed(String pattern, long count) { + BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则): " + pattern); + } + + @Override + public void unsubscribed(String channel, long count) { + BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道: " + channel); + } + + @Override + public void punsubscribed(String pattern, long count) { + BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则): " + pattern); + } +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java deleted file mode 100644 index c589478..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.listener; - -@SuppressWarnings("unused") -public enum ListenerPriority { - - /** - * Event call is of very low importance and should be run first, to allow - * other plugins to further customise the outcome - */ - LOWEST(0), - /** - * Event call is of low importance - */ - LOW(1), - /** - * Event call is neither important nor unimportant, and may be run - * normally - */ - NORMAL(2), - /** - * Event call is of high importance - */ - HIGH(3), - /** - * Event call is critical and must have the final say in what happens - * to the event - */ - HIGHEST(4), - /** - * Event is listened to purely for monitoring the outcome of an event. - *

- * No modifications to the event should be made under this priority - */ - MONITOR(5); - - private final int slot; - - ListenerPriority(int slot) { - this.slot = slot; - } - - public int getSlot() { - return slot; - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 8325d3e..689e8bc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,6 @@ pluginManagement { } } rootProject.name = "hamster-ball" -include("ball-bukkit") include("ball-common") -include("ball-bungeecord") +include("ball-bukkit") +include("ball-bungee") From d70841167f3aecb7f6b05ad334809f1c288663ff Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sat, 11 Nov 2023 18:39:20 +0800 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=20guava=20?= =?UTF-8?q?=E7=9A=84=20EventBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ball-bungee/build.gradle.kts | 2 +- .../plugin/core/bungee/HamsterBallPlugin.java | 8 +- .../bungee/listener/BallBungeeListener.java | 88 +++++++++++++++++++ ...istener.java => BallBungeeListenerV2.java} | 83 +---------------- .../mc/plugin/ball/common/api/BallAPI.java | 24 ++++- build.gradle.kts | 7 +- 6 files changed, 119 insertions(+), 93 deletions(-) create mode 100644 ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java rename ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/{BallBungeeCordListener.java => BallBungeeListenerV2.java} (53%) diff --git a/ball-bungee/build.gradle.kts b/ball-bungee/build.gradle.kts index d42aec7..4ccd88f 100644 --- a/ball-bungee/build.gradle.kts +++ b/ball-bungee/build.gradle.kts @@ -6,7 +6,7 @@ dependencies { api(project(":ball-common")) { isTransitive = false } compileOnly("net.md-5:bungeecord-api:+") - compileOnly("cn.hamster3.mc.plugin:core-bungeecord:+") + compileOnly("cn.hamster3.mc.plugin:core-bungee:+") implementation("io.lettuce:lettuce-core:+") } diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java index 71f708f..b296f4b 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java @@ -5,7 +5,8 @@ import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import cn.hamster3.mc.plugin.core.bungee.api.BallBungeeCordAPI; -import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeCordListener; +import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeListener; +import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeListenerV2; import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; @@ -46,9 +47,10 @@ public class HamsterBallPlugin extends Plugin { } catch (Exception e) { e.printStackTrace(); } - ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeCordListener.INSTANCE); - BallAPI.getInstance().getEventBus().register(BallBungeeCordListener.INSTANCE); + ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeListener.INSTANCE); logger.info("已注册 BallBungeeCordListener"); + BallAPI.getInstance().getEventBus().register(BallBungeeListenerV2.INSTANCE); + logger.info("已注册 BallBungeeListenerV2"); BallAPI.getInstance().sendBallMessage( BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java new file mode 100644 index 0000000..6c4bed3 --- /dev/null +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java @@ -0,0 +1,88 @@ +package cn.hamster3.mc.plugin.core.bungee.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.*; +import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; +import net.md_5.bungee.api.connection.PendingConnection; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.*; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public final class BallBungeeListener implements Listener { + public static final BallBungeeListener INSTANCE = new BallBungeeListener(); + + private BallBungeeListener() { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPreLogin(PreLoginEvent event) { + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreLogin.name(), + new BallPlayerPreLoginEvent(event.getConnection().getName()) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onLogin(LoginEvent event) { + if (event.isCancelled()) { + return; + } + PendingConnection connection = event.getConnection(); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogin.name(), + new BallPlayerLoginEvent(new BallPlayerInfo( + connection.getUniqueId(), connection.getName(), "connecting", + BallAPI.getInstance().getLocalServerId(), true + )) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPostLogin(PostLoginEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.BallPlayerPostLogin.name(), + new BallPlayerPostLoginEvent(playerInfo) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnect(ServerConnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getTarget().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreConnectServer.name(), + new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnected(ServerConnectedEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getServer().getInfo().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPostConnectServer.name(), + new BallPlayerPostConnectServerEvent(playerInfo) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerDisconnect(PlayerDisconnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); + BallAPI.getInstance().sendBallMessage(BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogout.name(), + new BallPlayerLogoutEvent(playerInfo) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } +} diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListenerV2.java similarity index 53% rename from ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java rename to ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListenerV2.java index d140226..e6c10f3 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListenerV2.java @@ -1,13 +1,9 @@ package cn.hamster3.mc.plugin.core.bungee.listener; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; -import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.operate.*; -import cn.hamster3.mc.plugin.ball.common.event.player.*; import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; -import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; @@ -15,87 +11,14 @@ import com.google.common.eventbus.Subscribe; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.*; -import net.md_5.bungee.api.plugin.Listener; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.event.EventPriority; import java.util.UUID; -public final class BallBungeeCordListener implements Listener { - public static final BallBungeeCordListener INSTANCE = new BallBungeeCordListener(); +public class BallBungeeListenerV2 { + public static final BallBungeeListenerV2 INSTANCE = new BallBungeeListenerV2(); - private BallBungeeCordListener() { - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPreLogin(PreLoginEvent event) { - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreLogin.name(), - new BallPlayerPreLoginEvent(event.getConnection().getName()) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onLogin(LoginEvent event) { - if (event.isCancelled()) { - return; - } - PendingConnection connection = event.getConnection(); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogin.name(), - new BallPlayerLoginEvent(new BallPlayerInfo( - connection.getUniqueId(), connection.getName(), "connecting", - BallAPI.getInstance().getLocalServerId(), true - )) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPostLogin(PostLoginEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, BallActions.BallPlayerPostLogin.name(), - new BallPlayerPostLoginEvent(playerInfo) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnect(ServerConnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getTarget().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreConnectServer.name(), - new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnected(ServerConnectedEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getServer().getInfo().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallActions.BallPlayerPostConnectServer.name(), - new BallPlayerPostConnectServerEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPlayerDisconnect(PlayerDisconnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); - BallAPI.getInstance().sendBallMessage(BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogout.name(), - new BallPlayerLogoutEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + private BallBungeeListenerV2() { } @Subscribe diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index d0d0b10..7238700 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -77,7 +77,7 @@ public abstract class BallAPI { protected void enable() throws SQLException, InterruptedException { BallServerInfo localInfo = getLocalServerInfo(); - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (Connection connection = getDatasource().getConnection()) { try (Statement statement = connection.createStatement()) { statement.execute("CREATE TABLE IF NOT EXISTS `hamster_ball_player_info`(" + "`uuid` CHAR(36) PRIMARY KEY," + @@ -142,13 +142,13 @@ public abstract class BallAPI { } RedisClient client = getRedisClient(); subConnection.addListener(BallRedisListener.INSTANCE); - subConnection.async().subscribe(BALL_CHANNEL); + subscribe(BALL_CHANNEL); } protected void disable() throws SQLException, InterruptedException { sendBallMessage(new BallMessage(BALL_CHANNEL, BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerId())), true); - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (Connection connection = getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( "DELETE FROM `hamster_ball_server_info` WHERE `id`=?;" )) { @@ -309,7 +309,7 @@ public abstract class BallAPI { if (info != null && info.isOnline()) { continue; } - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (Connection connection = getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( "INSERT INTO `hamster_ball_cached_message` VALUES(?, ?);" )) { @@ -447,6 +447,22 @@ public abstract class BallAPI { } } + public void subscribe(@NotNull String... channel) { + subConnection.sync().subscribe(channel); + } + + public void subscribePatterns(@NotNull String patterns) { + subConnection.sync().psubscribe(patterns); + } + + public void unsubscribe(@NotNull String... channel) { + subConnection.sync().unsubscribe(channel); + } + + public void unsubscribePatterns(@NotNull String patterns) { + subConnection.sync().punsubscribe(patterns); + } + /** * 获取本地服务器ID * diff --git a/build.gradle.kts b/build.gradle.kts index 2ca2d67..bd60fe7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "cn.hamster3.mc.plugin" -version = "1.1.0-SNAPSHOT" +version = "1.2.0-DEV" subprojects { apply { @@ -64,10 +64,7 @@ subprojects { } repositories { maven { - val releasesRepoUrl = uri("https://maven.airgame.net/maven-releases/") - val snapshotsRepoUrl = uri("https://maven.airgame.net/maven-snapshots/") - - url = if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl + url = uri("https://maven.airgame.net/maven-airgame") credentials { username = rootProject.properties.getOrDefault("maven_username", "").toString() From ade285312549c4f5715656bad0932bc6f8430a9e Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sun, 12 Nov 2023 15:38:49 +0800 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=20guava=20?= =?UTF-8?q?=E7=9A=84=20EventBus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index bd60fe7..3a13c60 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "cn.hamster3.mc.plugin" -version = "1.2.0-DEV" +version = "1.3.0" subprojects { apply { From a47e821868a496173efb203c5093e0899549083a Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sun, 12 Nov 2023 16:19:30 +0800 Subject: [PATCH 04/12] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/plugin/ball/common/api/BallAPI.java | 64 ++++++++----------- .../plugin/ball/common/data/BallMessage.java | 17 ++--- .../event/message/MessageReceivedEvent.java | 10 +++ .../event/message/MessageSentEvent.java | 10 +++ .../common/listener/BallRedisListener.java | 46 +++++++------ 5 files changed, 76 insertions(+), 71 deletions(-) diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index 7238700..2112ccf 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -146,7 +146,7 @@ public abstract class BallAPI { } protected void disable() throws SQLException, InterruptedException { - sendBallMessage(new BallMessage(BALL_CHANNEL, BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerId())), true); + sendBallMessage(BALL_CHANNEL, new BallMessage(BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerId())), true); try (Connection connection = getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( @@ -203,11 +203,8 @@ public abstract class BallAPI { * @param message 消息 */ public void broadcastPlayerMessage(@NotNull DisplayMessage message) { - sendBallMessage(new BallMessage( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.PROXY, + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.PROXY, BallActions.BroadcastPlayerMessage.name(), CoreAPI.getInstance().getGson().toJsonTree( new BroadcastPlayerMessageEvent(message) @@ -223,11 +220,8 @@ public abstract class BallAPI { * @param command 命令内容 */ public void dispatchConsoleCommand(@Nullable BallServerType type, @Nullable String serverID, @NotNull String command) { - sendBallMessage(new BallMessage( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.GAME, + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.GAME, BallActions.DispatchConsoleCommand.name(), CoreAPI.getInstance().getGson().toJsonTree( new DispatchConsoleCommandEvent(type, serverID, command) @@ -243,11 +237,8 @@ public abstract class BallAPI { * @param command 命令内容 */ public void dispatchPlayerCommand(@Nullable BallServerType type, @Nullable UUID uuid, @NotNull String command) { - sendBallMessage(new BallMessage( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.GAME, + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.GAME, BallActions.DispatchPlayerCommand.name(), CoreAPI.getInstance().getGson().toJsonTree( new DispatchPlayerCommandEvent(type, uuid, command) @@ -272,11 +263,8 @@ public abstract class BallAPI { * @param reason 原因 */ public void kickPlayer(@NotNull UUID uuid, @NotNull Component reason) { - sendBallMessage(new BallMessage( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.PROXY, + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.PROXY, BallActions.KickPlayer.name(), CoreAPI.getInstance().getGson().toJsonTree( new KickPlayerEvent(uuid, reason) @@ -322,11 +310,8 @@ public abstract class BallAPI { } } } - sendBallMessage(new BallMessage( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.PROXY, + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.PROXY, BallActions.SendMessageToPlayer.name(), CoreAPI.getInstance().getGson().toJsonTree( new SendMessageToPlayerEvent(new HashSet<>(receivers), message) @@ -403,7 +388,7 @@ public abstract class BallAPI { * @param action 执行动作 */ public void sendBallMessage(@NotNull String channel, @NotNull String action) { - sendBallMessage(new BallMessage(channel, action)); + sendBallMessage(channel, new BallMessage(action)); } /** @@ -414,35 +399,36 @@ public abstract class BallAPI { * @param content 附加参数 */ public void sendBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { - sendBallMessage(new BallMessage(channel, action, content)); + sendBallMessage(channel, new BallMessage(action, content)); } /** * 发送自定义消息 * - * @param messageInfo 消息内容 + * @param message 消息内容 */ - public void sendBallMessage(@NotNull BallMessage messageInfo) { - sendBallMessage(messageInfo, false); + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message) { + sendBallMessage(channel, message, false); } /** * 自定义服务消息信息并发送 * - * @param ballMessage 消息内容 - * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) + * @param channel 消息标签 + * @param message 消息内容 + * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) */ - public void sendBallMessage(@NotNull BallMessage ballMessage, boolean block) { - String string = CoreAPI.getInstance().getGson().toJson(ballMessage); + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean block) { + String string = CoreAPI.getInstance().getGson().toJson(message); if (block) { - pubConnection.sync().publish(BALL_CHANNEL, ballMessage); - eventBus.post(new MessageSentEvent(ballMessage)); + pubConnection.sync().publish(BALL_CHANNEL, message); + eventBus.post(new MessageSentEvent(channel, message)); } else { - pubConnection.async().publish(BALL_CHANNEL, ballMessage).whenComplete((aLong, throwable) -> { + pubConnection.async().publish(BALL_CHANNEL, message).whenComplete((aLong, throwable) -> { if (throwable != null) { return; } - eventBus.post(new MessageSentEvent(ballMessage)); + eventBus.post(new MessageSentEvent(channel, message)); }); } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java index 29bddb7..aae2025 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java @@ -9,6 +9,7 @@ import com.google.gson.JsonObject; import io.lettuce.core.codec.RedisCodec; import io.lettuce.core.codec.StringCodec; import lombok.Data; +import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -21,6 +22,7 @@ import java.util.UUID; * 服务消息 */ @Data +@NoArgsConstructor @SuppressWarnings("unused") public class BallMessage { /** @@ -71,11 +73,6 @@ public class BallMessage { */ @Nullable private BallServerType receiverType; - /** - * 消息的频道 - */ - @NotNull - private String channel; /** * 消息动作 *

@@ -90,22 +87,19 @@ public class BallMessage { */ private JsonElement content; - public BallMessage(@NotNull String channel, @NotNull String action) { + public BallMessage(@NotNull String action) { senderID = BallAPI.getInstance().getLocalServerId(); - this.channel = channel; this.action = action; } - public BallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { - this.channel = channel; + public BallMessage(@NotNull String action, @NotNull Object content) { senderID = BallAPI.getInstance().getLocalServerId(); this.action = action; this.content = CoreAPI.getInstance().getGson().toJsonTree(content); } - public BallMessage(@NotNull String channel, @NotNull String senderID, @Nullable String receiverID, + public BallMessage(@NotNull String senderID, @Nullable String receiverID, @Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) { - this.channel = channel; this.senderID = senderID; this.receiverID = receiverID; this.receiverType = receiverType; @@ -121,7 +115,6 @@ public class BallMessage { @NotNull public JsonObject toJson() { JsonObject object = new JsonObject(); - object.addProperty("channel", channel); object.addProperty("senderID", senderID); if (receiverID != null) { object.addProperty("toServer", receiverID); diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java index 554bf20..9cd30e9 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java @@ -3,9 +3,19 @@ package cn.hamster3.mc.plugin.ball.common.event.message; import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import lombok.AllArgsConstructor; import lombok.Data; +import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class MessageReceivedEvent { + /** + * 消息的频道 + */ + @NotNull + private String channel; + /** + * 消息的内容 + */ + @NotNull private BallMessage message; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java index 4761c3a..cd6c229 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java @@ -3,9 +3,19 @@ package cn.hamster3.mc.plugin.ball.common.event.message; import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import lombok.AllArgsConstructor; import lombok.Data; +import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class MessageSentEvent { + /** + * 消息的频道 + */ + @NotNull + private String channel; + /** + * 消息的内容 + */ + @NotNull private BallMessage message; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java index 756ed8e..66e806b 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java @@ -19,97 +19,104 @@ public class BallRedisListener implements RedisPubSubListener Date: Sun, 12 Nov 2023 17:18:57 +0800 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java | 2 +- .../mc/plugin/ball/common/event/server/ServerOfflineEvent.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index 2112ccf..56066f4 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -146,7 +146,7 @@ public abstract class BallAPI { } protected void disable() throws SQLException, InterruptedException { - sendBallMessage(BALL_CHANNEL, new BallMessage(BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerId())), true); + sendBallMessage(BALL_CHANNEL, new BallMessage(BallActions.ServerOffline.name(), new ServerOfflineEvent(localServerInfo)), true); try (Connection connection = getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java index 494952f..b6c4f03 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java @@ -1,5 +1,6 @@ package cn.hamster3.mc.plugin.ball.common.event.server; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import lombok.AllArgsConstructor; import lombok.Data; import org.jetbrains.annotations.NotNull; @@ -11,5 +12,5 @@ import org.jetbrains.annotations.NotNull; @AllArgsConstructor public class ServerOfflineEvent { @NotNull - private final String serverID; + private final BallServerInfo serverInfo; } From ea38a715c7eb1d714b40a6b7b9fcd6b9c014abb7 Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sun, 12 Nov 2023 17:19:29 +0800 Subject: [PATCH 06/12] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/ball/common/event/server/ServerOfflineEvent.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java index b6c4f03..31cd515 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java @@ -13,4 +13,9 @@ import org.jetbrains.annotations.NotNull; public class ServerOfflineEvent { @NotNull private final BallServerInfo serverInfo; + + @NotNull + public String getServerID() { + return serverInfo.getId(); + } } From b52685e94c126ad3110e6bdb3de851bc40bfd0ac Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sun, 12 Nov 2023 17:22:53 +0800 Subject: [PATCH 07/12] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ball/bukkit/hook/PlaceholderHook.java | 6 ++-- .../plugin/core/bungee/HamsterBallPlugin.java | 2 +- .../mc/plugin/ball/common/api/BallAPI.java | 36 +++++++++---------- .../common/listener/BallCommonListener.java | 16 ++++----- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/hook/PlaceholderHook.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/hook/PlaceholderHook.java index 96c2cde..1f31ed5 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/hook/PlaceholderHook.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/hook/PlaceholderHook.java @@ -38,11 +38,11 @@ public class PlaceholderHook extends PlaceholderExpansion { return BallAPI.getInstance().getLocalServerInfo().getName(); } case "proxy_id": { - return BallAPI.getInstance().getPlayerInfo(player.getUniqueId()).getProxyServer(); + return BallAPI.getInstance().getAllPlayerInfo(player.getUniqueId()).getProxyServer(); } case "proxy_name": { - String id = BallAPI.getInstance().getPlayerInfo(player.getUniqueId()).getProxyServer(); - return BallAPI.getInstance().getServerInfo(id).getName(); + String id = BallAPI.getInstance().getAllPlayerInfo(player.getUniqueId()).getProxyServer(); + return BallAPI.getInstance().getAllServerInfo(id).getName(); } } return null; diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java index b296f4b..fd81bcb 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java @@ -56,7 +56,7 @@ public class HamsterBallPlugin extends Plugin { new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) ); // 移除失效的在线玩家 - BallAPI.getInstance().getPlayerInfo().values() + BallAPI.getInstance().getAllPlayerInfo().values() .stream() .filter(BallPlayerInfo::isOnline) .filter(o -> BallAPI.getInstance().isLocalServer(o.getProxyServer())) diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index 56066f4..b0f9e7b 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -42,9 +42,9 @@ public abstract class BallAPI { @Getter protected static BallAPI instance; @NotNull - protected final Map serverInfo; + protected final Map allServerInfo; @NotNull - protected final Map playerInfo; + protected final Map allPlayerInfo; @NotNull private final BallServerInfo localServerInfo; @Nullable @@ -64,8 +64,8 @@ public abstract class BallAPI { this.redisClient = redisClient; subConnection = redisClient.connectPubSub(BallMessage.CODEC); pubConnection = redisClient.connectPubSub(BallMessage.CODEC); - serverInfo = new ConcurrentHashMap<>(); - playerInfo = new ConcurrentHashMap<>(); + allServerInfo = new ConcurrentHashMap<>(); + allPlayerInfo = new ConcurrentHashMap<>(); eventBus = new AsyncEventBus("HamsterBall - EventBus", CoreAPI.getInstance().getExecutorService()); eventBus.register(BallCommonListener.INSTANCE); if (debug) { @@ -114,7 +114,7 @@ public abstract class BallAPI { try (ResultSet set = statement.executeQuery()) { while (set.next()) { String serverID = set.getString("id"); - serverInfo.put(serverID, new BallServerInfo( + allServerInfo.put(serverID, new BallServerInfo( serverID, set.getString("name"), BallServerType.valueOf(set.getString("type")), @@ -130,7 +130,7 @@ public abstract class BallAPI { try (ResultSet set = statement.executeQuery()) { while (set.next()) { UUID uuid = UUID.fromString(set.getString("uuid")); - playerInfo.put(uuid, new BallPlayerInfo(uuid, + allPlayerInfo.put(uuid, new BallPlayerInfo(uuid, set.getString("name"), set.getString("game_server"), set.getString("proxy_server"), @@ -293,7 +293,7 @@ public abstract class BallAPI { public void sendMessageToPlayer(@NotNull Collection receivers, @NotNull DisplayMessage message, boolean cache) { if (cache) { for (UUID receiver : receivers) { - BallPlayerInfo info = getPlayerInfo(receiver); + BallPlayerInfo info = getAllPlayerInfo(receiver); if (info != null && info.isOnline()) { continue; } @@ -470,8 +470,8 @@ public abstract class BallAPI { * @param serverID 服务器ID * @return 可能为 null */ - public BallServerInfo getServerInfo(@NotNull String serverID) { - return serverInfo.get(serverID); + public BallServerInfo getAllServerInfo(@NotNull String serverID) { + return allServerInfo.get(serverID); } /** @@ -480,8 +480,8 @@ public abstract class BallAPI { * @param uuid 玩家的 UUID * @return 玩家信息 */ - public BallPlayerInfo getPlayerInfo(@NotNull UUID uuid) { - return playerInfo.get(uuid); + public BallPlayerInfo getAllPlayerInfo(@NotNull UUID uuid) { + return allPlayerInfo.get(uuid); } /** @@ -490,8 +490,8 @@ public abstract class BallAPI { * @param playerName 玩家名称 * @return 玩家信息 */ - public BallPlayerInfo getPlayerInfo(@NotNull String playerName) { - for (BallPlayerInfo info : playerInfo.values()) { + public BallPlayerInfo getAllPlayerInfo(@NotNull String playerName) { + for (BallPlayerInfo info : allPlayerInfo.values()) { if (info.getName().equalsIgnoreCase(playerName)) { return info; } @@ -506,7 +506,7 @@ public abstract class BallAPI { * @return 玩家信息 */ public BallPlayerInfo getPlayerInfoExact(@NotNull String playerName) { - for (BallPlayerInfo info : playerInfo.values()) { + for (BallPlayerInfo info : allPlayerInfo.values()) { if (info.getName().equals(playerName)) { return info; } @@ -522,7 +522,7 @@ public abstract class BallAPI { */ @Nullable public UUID getPlayerUUID(String playerName) { - BallPlayerInfo info = getPlayerInfo(playerName); + BallPlayerInfo info = getAllPlayerInfo(playerName); if (info == null) { return null; } @@ -538,7 +538,7 @@ public abstract class BallAPI { */ @NotNull public UUID getPlayerUUID(String playerName, @NotNull UUID defaultValue) { - BallPlayerInfo info = getPlayerInfo(playerName); + BallPlayerInfo info = getAllPlayerInfo(playerName); if (info == null) { return defaultValue; } @@ -553,7 +553,7 @@ public abstract class BallAPI { */ @Nullable public String getPlayerName(@NotNull UUID uuid) { - BallPlayerInfo info = getPlayerInfo(uuid); + BallPlayerInfo info = getAllPlayerInfo(uuid); if (info == null) { return null; } @@ -569,7 +569,7 @@ public abstract class BallAPI { */ @NotNull public String getPlayerName(@NotNull UUID uuid, @NotNull String defaultValue) { - BallPlayerInfo info = getPlayerInfo(uuid); + BallPlayerInfo info = getAllPlayerInfo(uuid); if (info == null) { return defaultValue; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java index 4d575de..f87e8e7 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java @@ -19,22 +19,22 @@ public class BallCommonListener { @Subscribe public void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { BallPlayerInfo info = event.getPlayerInfo(); - BallAPI.getInstance().getPlayerInfo().put(info.getUuid(), info); + BallAPI.getInstance().getAllPlayerInfo().put(info.getUuid(), info); } @Subscribe public void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { BallPlayerInfo info = event.getPlayerInfo(); - BallAPI.getInstance().getPlayerInfo().put(info.getUuid(), info); + BallAPI.getInstance().getAllPlayerInfo().put(info.getUuid(), info); } @Subscribe public void onServerOnline(@NotNull ServerOnlineEvent event) { BallServerInfo info = event.getServerInfo(); - BallAPI.getInstance().getServerInfo().put(info.getId(), info); + BallAPI.getInstance().getAllServerInfo().put(info.getId(), info); switch (info.getType()) { case GAME: { - BallAPI.getInstance().getPlayerInfo().forEach((uuid, playerInfo) -> { + BallAPI.getInstance().getAllPlayerInfo().forEach((uuid, playerInfo) -> { if (playerInfo.getGameServer().equals(info.getId())) { playerInfo.setOnline(false); } @@ -42,7 +42,7 @@ public class BallCommonListener { break; } case PROXY: { - BallAPI.getInstance().getPlayerInfo().forEach((uuid, playerInfo) -> { + BallAPI.getInstance().getAllPlayerInfo().forEach((uuid, playerInfo) -> { if (playerInfo.getProxyServer().equals(info.getId())) { playerInfo.setOnline(false); } @@ -55,13 +55,13 @@ public class BallCommonListener { @Subscribe public void onServerOffline(@NotNull ServerOfflineEvent event) { String serverID = event.getServerID(); - BallServerInfo info = BallAPI.getInstance().getServerInfo().remove(serverID); + BallServerInfo info = BallAPI.getInstance().getAllServerInfo().remove(serverID); if (info == null) { return; } switch (info.getType()) { case GAME: { - BallAPI.getInstance().getPlayerInfo().forEach((uuid, playerInfo) -> { + BallAPI.getInstance().getAllPlayerInfo().forEach((uuid, playerInfo) -> { if (playerInfo.getGameServer().equals(info.getId())) { playerInfo.setOnline(false); } @@ -69,7 +69,7 @@ public class BallCommonListener { break; } case PROXY: { - BallAPI.getInstance().getPlayerInfo().forEach((uuid, playerInfo) -> { + BallAPI.getInstance().getAllPlayerInfo().forEach((uuid, playerInfo) -> { if (playerInfo.getProxyServer().equals(info.getId())) { playerInfo.setOnline(false); } From 4d4413811e293d350993913d1d4c573e493d3c4b Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sun, 12 Nov 2023 17:45:45 +0800 Subject: [PATCH 08/12] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ball/bukkit/hook/PlaceholderHook.java | 6 ++--- .../mc/plugin/ball/common/api/BallAPI.java | 22 +++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/hook/PlaceholderHook.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/hook/PlaceholderHook.java index 1f31ed5..96c2cde 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/hook/PlaceholderHook.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/hook/PlaceholderHook.java @@ -38,11 +38,11 @@ public class PlaceholderHook extends PlaceholderExpansion { return BallAPI.getInstance().getLocalServerInfo().getName(); } case "proxy_id": { - return BallAPI.getInstance().getAllPlayerInfo(player.getUniqueId()).getProxyServer(); + return BallAPI.getInstance().getPlayerInfo(player.getUniqueId()).getProxyServer(); } case "proxy_name": { - String id = BallAPI.getInstance().getAllPlayerInfo(player.getUniqueId()).getProxyServer(); - return BallAPI.getInstance().getAllServerInfo(id).getName(); + String id = BallAPI.getInstance().getPlayerInfo(player.getUniqueId()).getProxyServer(); + return BallAPI.getInstance().getServerInfo(id).getName(); } } return null; diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index b0f9e7b..a4c5fa3 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -29,8 +29,8 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; -@SuppressWarnings("unused") @Getter +@SuppressWarnings("unused") public abstract class BallAPI { /** * API 使用的通信频道 @@ -140,7 +140,6 @@ public abstract class BallAPI { } } } - RedisClient client = getRedisClient(); subConnection.addListener(BallRedisListener.INSTANCE); subscribe(BALL_CHANNEL); } @@ -164,7 +163,7 @@ public abstract class BallAPI { } } getLogger().info("正在关闭 redission"); - getRedisClient().close(); + redisClient.close(); getLogger().info("已关闭 redission"); } @@ -293,7 +292,7 @@ public abstract class BallAPI { public void sendMessageToPlayer(@NotNull Collection receivers, @NotNull DisplayMessage message, boolean cache) { if (cache) { for (UUID receiver : receivers) { - BallPlayerInfo info = getAllPlayerInfo(receiver); + BallPlayerInfo info = getPlayerInfo(receiver); if (info != null && info.isOnline()) { continue; } @@ -419,7 +418,6 @@ public abstract class BallAPI { * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) */ public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean block) { - String string = CoreAPI.getInstance().getGson().toJson(message); if (block) { pubConnection.sync().publish(BALL_CHANNEL, message); eventBus.post(new MessageSentEvent(channel, message)); @@ -470,7 +468,7 @@ public abstract class BallAPI { * @param serverID 服务器ID * @return 可能为 null */ - public BallServerInfo getAllServerInfo(@NotNull String serverID) { + public BallServerInfo getServerInfo(@NotNull String serverID) { return allServerInfo.get(serverID); } @@ -480,7 +478,7 @@ public abstract class BallAPI { * @param uuid 玩家的 UUID * @return 玩家信息 */ - public BallPlayerInfo getAllPlayerInfo(@NotNull UUID uuid) { + public BallPlayerInfo getPlayerInfo(@NotNull UUID uuid) { return allPlayerInfo.get(uuid); } @@ -490,7 +488,7 @@ public abstract class BallAPI { * @param playerName 玩家名称 * @return 玩家信息 */ - public BallPlayerInfo getAllPlayerInfo(@NotNull String playerName) { + public BallPlayerInfo getPlayerInfo(@NotNull String playerName) { for (BallPlayerInfo info : allPlayerInfo.values()) { if (info.getName().equalsIgnoreCase(playerName)) { return info; @@ -522,7 +520,7 @@ public abstract class BallAPI { */ @Nullable public UUID getPlayerUUID(String playerName) { - BallPlayerInfo info = getAllPlayerInfo(playerName); + BallPlayerInfo info = getPlayerInfo(playerName); if (info == null) { return null; } @@ -538,7 +536,7 @@ public abstract class BallAPI { */ @NotNull public UUID getPlayerUUID(String playerName, @NotNull UUID defaultValue) { - BallPlayerInfo info = getAllPlayerInfo(playerName); + BallPlayerInfo info = getPlayerInfo(playerName); if (info == null) { return defaultValue; } @@ -553,7 +551,7 @@ public abstract class BallAPI { */ @Nullable public String getPlayerName(@NotNull UUID uuid) { - BallPlayerInfo info = getAllPlayerInfo(uuid); + BallPlayerInfo info = getPlayerInfo(uuid); if (info == null) { return null; } @@ -569,7 +567,7 @@ public abstract class BallAPI { */ @NotNull public String getPlayerName(@NotNull UUID uuid, @NotNull String defaultValue) { - BallPlayerInfo info = getAllPlayerInfo(uuid); + BallPlayerInfo info = getPlayerInfo(uuid); if (info == null) { return defaultValue; } From f0c88f446957613823e292463c87d0d01c4ba556 Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sun, 12 Nov 2023 20:31:51 +0800 Subject: [PATCH 09/12] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index a4c5fa3..64bccec 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -419,10 +419,10 @@ public abstract class BallAPI { */ public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean block) { if (block) { - pubConnection.sync().publish(BALL_CHANNEL, message); + pubConnection.sync().publish(channel, message); eventBus.post(new MessageSentEvent(channel, message)); } else { - pubConnection.async().publish(BALL_CHANNEL, message).whenComplete((aLong, throwable) -> { + pubConnection.async().publish(channel, message).whenComplete((aLong, throwable) -> { if (throwable != null) { return; } From 5616117c947922540c743995671d286637c4b846 Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sun, 19 Nov 2023 22:26:32 +0800 Subject: [PATCH 10/12] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=A2=91?= =?UTF-8?q?=E9=81=93=E5=88=86=E7=BB=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/ball/bukkit/HamsterBallPlugin.java | 11 +- .../plugin/ball/bukkit/api/BallBukkitAPI.java | 18 ++- .../listener/UpdatePlayerInfoListener.java | 85 ++++++++++ ball-bukkit/src/main/resources/config.yml | 13 ++ .../plugin/core/bungee/HamsterBallPlugin.java | 12 +- .../core/bungee/api/BallBungeeCordAPI.java | 18 ++- .../bungee/listener/BallBungeeListener.java | 58 ++----- .../listener/UpdatePlayerInfoListener.java | 64 ++++++++ .../core/bungee/util/BallBungeeCordUtils.java | 5 +- ball-bungee/src/main/resources/config.yml | 12 ++ .../mc/plugin/ball/common/api/BallAPI.java | 146 ++++++++++++------ .../plugin/ball/common/config/BallConfig.java | 20 ++- .../common/listener/BallDebugListener.java | 35 ++--- .../common/listener/BallRedisListener.java | 8 +- 14 files changed, 358 insertions(+), 147 deletions(-) create mode 100644 ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java create mode 100644 ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/UpdatePlayerInfoListener.java diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java index 3229492..6905bad 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java @@ -3,6 +3,7 @@ package cn.hamster3.mc.plugin.ball.bukkit; import cn.hamster3.mc.plugin.ball.bukkit.api.BallBukkitAPI; import cn.hamster3.mc.plugin.ball.bukkit.hook.PlaceholderHook; import cn.hamster3.mc.plugin.ball.bukkit.listener.BallBukkitListener; +import cn.hamster3.mc.plugin.ball.bukkit.listener.UpdatePlayerInfoListener; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; @@ -58,7 +59,13 @@ public class HamsterBallPlugin extends JavaPlugin { } Bukkit.getPluginManager().registerEvents(BallBukkitListener.INSTANCE, this); BallAPI.getInstance().getEventBus().register(BallBukkitListener.INSTANCE); - logger.info("已注册 BallBukkitListener"); + logger.info("已注册监听器 BallBukkitListener"); + if (BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { + BallAPI.getInstance().subscribe(BallAPI.PLAYER_INFO_UPDATE_CHANNEL); + Bukkit.getPluginManager().registerEvents(UpdatePlayerInfoListener.INSTANCE, this); + BallAPI.getInstance().getEventBus().register(UpdatePlayerInfoListener.INSTANCE); + logger.info("已注册监听器 UpdatePlayerInfoListener"); + } sync(() -> { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { PlaceholderHook.INSTANCE.register(); @@ -66,7 +73,7 @@ public class HamsterBallPlugin extends JavaPlugin { } BallAPI.getInstance().sendBallMessage( BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) + new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), false ); }); long time = System.currentTimeMillis() - start; diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java index 4c24ef9..5b1704a 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java @@ -3,6 +3,7 @@ package cn.hamster3.mc.plugin.ball.bukkit.api; import cn.hamster3.mc.plugin.ball.bukkit.HamsterBallPlugin; import cn.hamster3.mc.plugin.ball.bukkit.util.BallBukkitUtils; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.config.BallConfig; import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; @@ -10,7 +11,6 @@ import io.lettuce.core.RedisClient; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; import java.sql.SQLException; @@ -18,8 +18,8 @@ import java.util.Map; import java.util.logging.Logger; public class BallBukkitAPI extends BallAPI { - public BallBukkitAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { - super(localServerInfo, datasource, redisClient, debug); + public BallBukkitAPI(@NotNull BallConfig ballConfig) { + super(ballConfig); } public static BallBukkitAPI getInstance() { @@ -56,9 +56,15 @@ public class BallBukkitAPI extends BallAPI { datasource = CoreAPI.getInstance().getDataSource(); } - RedisClient redisClient = RedisClient.create(config.getString("redis-url", "redis://localhost:6379?clientName=HamsterBall")); - - instance = new BallBukkitAPI(serverInfo, datasource, redisClient, config.getBoolean("debug", false)); + BallConfig ballConfig = new BallConfig( + config.getBoolean("debug", false), + RedisClient.create(config.getString("redis-url")), + config.getString("channel-prefix", ""), + config.getBoolean("game-server-update-player-info", false), + serverInfo, + datasource + ); + instance = new BallBukkitAPI(ballConfig); } @Override diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java new file mode 100644 index 0000000..bfc0133 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java @@ -0,0 +1,85 @@ +package cn.hamster3.mc.plugin.ball.bukkit.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLoginEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLogoutEvent; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import com.google.common.eventbus.Subscribe; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.jetbrains.annotations.NotNull; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class UpdatePlayerInfoListener implements Listener { + public static final UpdatePlayerInfoListener INSTANCE = new UpdatePlayerInfoListener(); + + private final Map PLAYER_PROXY_SERVER = new ConcurrentHashMap<>(); + + private UpdatePlayerInfoListener() { + } + + public static void uploadPlayerInfo(@NotNull BallPlayerInfo playerInfo) { + CoreAPI.getInstance().getExecutorService().execute(() -> { + try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (PreparedStatement statement = connection.prepareStatement( + "REPLACE INTO `hamster_ball_player_info` VALUES(?, ?, ?, ?, ?);" + )) { + statement.setString(1, playerInfo.getUuid().toString()); + statement.setString(2, playerInfo.getName()); + statement.setString(3, playerInfo.getGameServer()); + statement.setString(4, playerInfo.getProxyServer()); + statement.setBoolean(5, playerInfo.isOnline()); + statement.executeUpdate(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + BallAPI.getInstance().sendBallMessage( + BallAPI.PLAYER_INFO_UPDATE_CHANNEL, + BallActions.BallPlayerInfoUpdate.name(), + new BallPlayerInfoUpdateEvent(playerInfo), + false + ); + }); + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + BallPlayerInfo playerInfo = new BallPlayerInfo( + player.getUniqueId(), + player.getName(), + BallAPI.getInstance().getLocalServerId(), + PLAYER_PROXY_SERVER.getOrDefault(player.getUniqueId(), "unknown"), + true + ); + uploadPlayerInfo(playerInfo); + } + + @Subscribe + public void onBallPlayerLogin(BallPlayerLoginEvent event) { + BallPlayerInfo info = event.getPlayerInfo(); + PLAYER_PROXY_SERVER.put(info.getUuid(), info.getProxyServer()); + } + + @Subscribe + public void onBallPlayerLogout(BallPlayerLogoutEvent event) { + BallPlayerInfo playerInfo = BallAPI.getInstance().getPlayerInfo(event.getPlayerInfo().getUuid()); + if (!BallAPI.getInstance().isLocalServer(playerInfo.getGameServer())) { + return; + } + playerInfo.setOnline(false); + uploadPlayerInfo(playerInfo); + } +} diff --git a/ball-bukkit/src/main/resources/config.yml b/ball-bukkit/src/main/resources/config.yml index 39d28aa..e12947c 100644 --- a/ball-bukkit/src/main/resources/config.yml +++ b/ball-bukkit/src/main/resources/config.yml @@ -13,9 +13,22 @@ debug: false # 详细信息:https://github.com/lettuce-io/lettuce-core/wiki/Redis-URI-and-connection-details redis-url: "redis://localhost:6379?clientName=HamsterBall" +# 频道名前缀 +# 使用这个配置选项可以划分子服消息通信分组 +# 只有在同一个频道名的子服才能互相通信 +channel-prefix: "" + +# 是否在子服端更新玩家信息 +# 默认情况下,BC 统一管理玩家信息,包括记录 UUID 和玩家名称 +# 如果一个子服同时拥有多个 BC 入口 +# 且每个 BC 入口为不同的玩家名称分配不同的 UUID +# 则可以启用该功能以防止 UUID 紊乱的问题 +game-server-update-player-info: false + # 本服务器信息 server-info: # 服务器唯一识别码,最长 32 字符 + # 需要与 BC 端中 config.yml 里填写的服务器 ID 一致,否则插件跨服传送功能将失效 # 推荐格式:全小写英文+横杠+数字尾号 # 例如: # survival-1, survival-2(生存1区,生存2区) diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java index fd81bcb..8e0b111 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java @@ -7,6 +7,7 @@ import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import cn.hamster3.mc.plugin.core.bungee.api.BallBungeeCordAPI; import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeListener; import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeListenerV2; +import cn.hamster3.mc.plugin.core.bungee.listener.UpdatePlayerInfoListener; import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; @@ -48,12 +49,17 @@ public class HamsterBallPlugin extends Plugin { e.printStackTrace(); } ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeListener.INSTANCE); - logger.info("已注册 BallBungeeCordListener"); + logger.info("已注册监听器 BallBungeeListener"); BallAPI.getInstance().getEventBus().register(BallBungeeListenerV2.INSTANCE); - logger.info("已注册 BallBungeeListenerV2"); + logger.info("已注册监听器 BallBungeeListenerV2"); + if (!BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { + ProxyServer.getInstance().getPluginManager().registerListener(this, UpdatePlayerInfoListener.INSTANCE); + logger.info("已注册监听器 UpdatePlayerInfoListener"); + } BallAPI.getInstance().sendBallMessage( BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) + new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), + false ); // 移除失效的在线玩家 BallAPI.getInstance().getAllPlayerInfo().values() diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java index 1811139..3dc362e 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java @@ -1,6 +1,7 @@ package cn.hamster3.mc.plugin.core.bungee.api; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.config.BallConfig; import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; @@ -10,7 +11,6 @@ import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import io.lettuce.core.RedisClient; import net.md_5.bungee.config.Configuration; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; import java.sql.SQLException; @@ -18,8 +18,8 @@ import java.util.Map; import java.util.logging.Logger; public class BallBungeeCordAPI extends BallAPI { - public BallBungeeCordAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { - super(localServerInfo, datasource, redisClient, debug); + public BallBungeeCordAPI(@NotNull BallConfig ballConfig) { + super(ballConfig); } public static BallBungeeCordAPI getInstance() { @@ -53,9 +53,15 @@ public class BallBungeeCordAPI extends BallAPI { datasource = CoreAPI.getInstance().getDataSource(); } - RedisClient redisClient = RedisClient.create(config.getString("redis-url", "redis://localhost:6379?clientName=HamsterBall")); - - instance = new BallBungeeCordAPI(serverInfo, datasource, redisClient, config.getBoolean("debug", false)); + BallConfig ballConfig = new BallConfig( + config.getBoolean("debug", false), + RedisClient.create(config.getString("redis-url")), + config.getString("channel-prefix", ""), + config.getBoolean("game-server-update-player-info", false), + serverInfo, + datasource + ); + instance = new BallBungeeCordAPI(ballConfig); } @Override diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java index 6c4bed3..18d5aff 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java @@ -3,11 +3,15 @@ package cn.hamster3.mc.plugin.core.bungee.listener; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import cn.hamster3.mc.plugin.ball.common.event.BallActions; -import cn.hamster3.mc.plugin.ball.common.event.player.*; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLoginEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerPostLoginEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerPreLoginEvent; import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.*; +import net.md_5.bungee.api.event.LoginEvent; +import net.md_5.bungee.api.event.PostLoginEvent; +import net.md_5.bungee.api.event.PreLoginEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.event.EventPriority; @@ -21,8 +25,10 @@ public final class BallBungeeListener implements Listener { @EventHandler(priority = EventPriority.HIGH) public void onPreLogin(PreLoginEvent event) { BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreLogin.name(), - new BallPlayerPreLoginEvent(event.getConnection().getName()) + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPreLogin.name(), + new BallPlayerPreLoginEvent(event.getConnection().getName()), + false ); } @@ -33,11 +39,12 @@ public final class BallBungeeListener implements Listener { } PendingConnection connection = event.getConnection(); BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogin.name(), + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerLogin.name(), new BallPlayerLoginEvent(new BallPlayerInfo( connection.getUniqueId(), connection.getName(), "connecting", BallAPI.getInstance().getLocalServerId(), true - )) + )), false ); } @@ -45,44 +52,11 @@ public final class BallBungeeListener implements Listener { public void onPostLogin(PostLoginEvent event) { ProxiedPlayer player = event.getPlayer(); BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, BallActions.BallPlayerPostLogin.name(), - new BallPlayerPostLoginEvent(playerInfo) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnect(ServerConnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getTarget().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreConnectServer.name(), - new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnected(ServerConnectedEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getServer().getInfo().getName()); BallAPI.getInstance().sendBallMessage( BallAPI.BALL_CHANNEL, - BallActions.BallPlayerPostConnectServer.name(), - new BallPlayerPostConnectServerEvent(playerInfo) + BallActions.BallPlayerPostLogin.name(), + new BallPlayerPostLoginEvent(playerInfo), + false ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPlayerDisconnect(PlayerDisconnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); - BallAPI.getInstance().sendBallMessage(BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogout.name(), - new BallPlayerLogoutEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); } } diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/UpdatePlayerInfoListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/UpdatePlayerInfoListener.java new file mode 100644 index 0000000..24d6476 --- /dev/null +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/UpdatePlayerInfoListener.java @@ -0,0 +1,64 @@ +package cn.hamster3.mc.plugin.core.bungee.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLogoutEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerPostConnectServerEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerPreConnectServerEvent; +import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.event.ServerConnectEvent; +import net.md_5.bungee.api.event.ServerConnectedEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public class UpdatePlayerInfoListener implements Listener { + public static final UpdatePlayerInfoListener INSTANCE = new UpdatePlayerInfoListener(); + + private UpdatePlayerInfoListener() { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnect(ServerConnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getTarget().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPreConnectServer.name(), + new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()), + false + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnected(ServerConnectedEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getServer().getInfo().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPostConnectServer.name(), + new BallPlayerPostConnectServerEvent(playerInfo), + false + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerDisconnect(PlayerDisconnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerLogout.name(), + new BallPlayerLogoutEvent(playerInfo), + false + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } +} diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java index a075e89..00af80e 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java @@ -51,9 +51,10 @@ public final class BallBungeeCordUtils { e.printStackTrace(); } BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, + BallAPI.PLAYER_INFO_UPDATE_CHANNEL, BallActions.BallPlayerInfoUpdate.name(), - new BallPlayerInfoUpdateEvent(playerInfo) + new BallPlayerInfoUpdateEvent(playerInfo), + false ); }); } diff --git a/ball-bungee/src/main/resources/config.yml b/ball-bungee/src/main/resources/config.yml index 946ec3f..d5c1c91 100644 --- a/ball-bungee/src/main/resources/config.yml +++ b/ball-bungee/src/main/resources/config.yml @@ -13,6 +13,18 @@ debug: false # 详细信息:https://github.com/lettuce-io/lettuce-core/wiki/Redis-URI-and-connection-details redis-url: "redis://localhost:6379?clientName=HamsterBall" +# 频道名前缀 +# 使用这个配置选项可以划分子服消息通信分组 +# 只有在同一个频道名的子服才能互相通信 +channel-prefix: "" + +# 是否在子服端更新玩家信息 +# 默认情况下,BC 统一管理玩家信息,包括记录 UUID 和玩家名称 +# 如果一个子服同时拥有多个 BC 入口 +# 且每个 BC 入口为不同的玩家名称分配不同的 UUID +# 则可以启用该功能以防止 UUID 紊乱的问题 +game-server-update-player-info: false + # 本服务器信息 server-info: # 服务器唯一识别码,最长 32 字符 diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index 64bccec..3eed97b 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -1,5 +1,6 @@ package cn.hamster3.mc.plugin.ball.common.api; +import cn.hamster3.mc.plugin.ball.common.config.BallConfig; import cn.hamster3.mc.plugin.ball.common.data.BallLocation; import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; @@ -36,41 +37,39 @@ public abstract class BallAPI { * API 使用的通信频道 */ public static final String BALL_CHANNEL = "HamsterBall"; + /** + * API 使用的玩家信息更新通信频道 + */ + public static final String PLAYER_INFO_UPDATE_CHANNEL = "HamsterBall:PlayerInfo"; /** * API 实例 */ @Getter protected static BallAPI instance; @NotNull - protected final Map allServerInfo; + private final BallConfig ballConfig; @NotNull - protected final Map allPlayerInfo; + private final EventBus eventBus; @NotNull - private final BallServerInfo localServerInfo; - @Nullable - private final DataSource datasource; + private final Map allServerInfo; @NotNull - private final RedisClient redisClient; + private final Map allPlayerInfo; @NotNull private final StatefulRedisPubSubConnection subConnection; @NotNull private final StatefulRedisPubSubConnection pubConnection; - @NotNull - private final EventBus eventBus; - public BallAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { - this.localServerInfo = localServerInfo; - this.datasource = datasource; - this.redisClient = redisClient; - subConnection = redisClient.connectPubSub(BallMessage.CODEC); - pubConnection = redisClient.connectPubSub(BallMessage.CODEC); + public BallAPI(@NotNull BallConfig ballConfig) { + this.ballConfig = ballConfig; + subConnection = ballConfig.getRedisClient().connectPubSub(BallMessage.CODEC); + pubConnection = ballConfig.getRedisClient().connectPubSub(BallMessage.CODEC); allServerInfo = new ConcurrentHashMap<>(); allPlayerInfo = new ConcurrentHashMap<>(); eventBus = new AsyncEventBus("HamsterBall - EventBus", CoreAPI.getInstance().getExecutorService()); eventBus.register(BallCommonListener.INSTANCE); - if (debug) { + if (ballConfig.isDebug()) { getLogger().warning("已启用调试模式"); - subConnection.addListener(BallDebugListener.INSTANCE); + eventBus.register(BallDebugListener.INSTANCE); } } @@ -141,11 +140,13 @@ public abstract class BallAPI { } } subConnection.addListener(BallRedisListener.INSTANCE); - subscribe(BALL_CHANNEL); + subConnection.sync().subscribe(BALL_CHANNEL); } protected void disable() throws SQLException, InterruptedException { - sendBallMessage(BALL_CHANNEL, new BallMessage(BallActions.ServerOffline.name(), new ServerOfflineEvent(localServerInfo)), true); + sendBallMessage(BallAPI.BALL_CHANNEL, new BallMessage( + BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerInfo()) + ), false, true); try (Connection connection = getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( @@ -163,7 +164,7 @@ public abstract class BallAPI { } } getLogger().info("正在关闭 redission"); - redisClient.close(); + ballConfig.getRedisClient().close(); getLogger().info("已关闭 redission"); } @@ -205,10 +206,8 @@ public abstract class BallAPI { sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.PROXY, BallActions.BroadcastPlayerMessage.name(), - CoreAPI.getInstance().getGson().toJsonTree( - new BroadcastPlayerMessageEvent(message) - ) - )); + CoreAPI.getInstance().getGson().toJsonTree(new BroadcastPlayerMessageEvent(message)) + ), false); } /** @@ -222,10 +221,9 @@ public abstract class BallAPI { sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.GAME, BallActions.DispatchConsoleCommand.name(), - CoreAPI.getInstance().getGson().toJsonTree( - new DispatchConsoleCommandEvent(type, serverID, command) - ) - )); + CoreAPI.getInstance().getGson().toJsonTree(new DispatchConsoleCommandEvent(type, serverID, command)) + ), false); + } /** @@ -239,10 +237,8 @@ public abstract class BallAPI { sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.GAME, BallActions.DispatchPlayerCommand.name(), - CoreAPI.getInstance().getGson().toJsonTree( - new DispatchPlayerCommandEvent(type, uuid, command) - ) - )); + CoreAPI.getInstance().getGson().toJsonTree(new DispatchPlayerCommandEvent(type, uuid, command)) + ), false); } /** @@ -265,10 +261,8 @@ public abstract class BallAPI { sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.PROXY, BallActions.KickPlayer.name(), - CoreAPI.getInstance().getGson().toJsonTree( - new KickPlayerEvent(uuid, reason) - ) - )); + CoreAPI.getInstance().getGson().toJsonTree(new KickPlayerEvent(uuid, reason)) + ), false); } /** @@ -312,10 +306,8 @@ public abstract class BallAPI { sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.PROXY, BallActions.SendMessageToPlayer.name(), - CoreAPI.getInstance().getGson().toJsonTree( - new SendMessageToPlayerEvent(new HashSet<>(receivers), message) - ) - )); + CoreAPI.getInstance().getGson().toJsonTree(new SendMessageToPlayerEvent(new HashSet<>(receivers), message)) + ), false); } /** @@ -346,7 +338,7 @@ public abstract class BallAPI { */ public void sendPlayerToLocation(@NotNull Collection sendPlayerUUID, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { sendBallMessage(BALL_CHANNEL, BallActions.SendPlayerToLocation.name(), - new SendPlayerToLocationEvent(new HashSet<>(sendPlayerUUID), location, doneMessage) + new SendPlayerToLocationEvent(new HashSet<>(sendPlayerUUID), location, doneMessage), false ); } @@ -375,25 +367,39 @@ public abstract class BallAPI { * @param doneTargetMessage 传送完成后目标玩家显示的消息,自动将 %player_name% 替换成被传送者的名称 */ public void sendPlayerToPlayer(@NotNull Collection sendPlayerUUID, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { - sendBallMessage(BALL_CHANNEL, BallActions.SendPlayerToPlayer.name(), - new SendPlayerToPlayerEvent(new HashSet<>(sendPlayerUUID), toPlayer, doneMessage, doneTargetMessage) + sendBallMessage( + BALL_CHANNEL, + BallActions.SendPlayerToPlayer.name(), + new SendPlayerToPlayerEvent(new HashSet<>(sendPlayerUUID), toPlayer, doneMessage, doneTargetMessage), + false ); } /** * 发送一条服务消息 * - * @param channel 消息标签 + * @param channel 消息频道 * @param action 执行动作 */ public void sendBallMessage(@NotNull String channel, @NotNull String action) { sendBallMessage(channel, new BallMessage(action)); } + /** + * 发送一条服务消息 + * + * @param channel 消息频道 + * @param action 执行动作 + * @param prefix 是否自动为消息频道添加分组前缀 + */ + public void sendBallMessage(@NotNull String channel, @NotNull String action, boolean prefix) { + sendBallMessage(channel, new BallMessage(action), prefix); + } + /** * 发送一条有附加参数的服务消息 * - * @param channel 消息标签 + * @param channel 消息频道 * @param action 执行动作 * @param content 附加参数 */ @@ -401,37 +407,67 @@ public abstract class BallAPI { sendBallMessage(channel, new BallMessage(action, content)); } + /** + * 发送一条有附加参数的服务消息 + * + * @param channel 消息频道 + * @param action 执行动作 + * @param content 附加参数 + * @param prefix 是否自动为消息频道添加分组前缀 + */ + public void sendBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content, boolean prefix) { + sendBallMessage(channel, new BallMessage(action, content), prefix); + } + /** * 发送自定义消息 * * @param message 消息内容 */ public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message) { - sendBallMessage(channel, message, false); + sendBallMessage(channel, message, true, false); + } + + /** + * 发送自定义消息 + * + * @param message 消息内容 + * @param prefix 是否自动为消息频道添加分组前缀 + */ + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean prefix) { + sendBallMessage(channel, message, prefix, false); } /** * 自定义服务消息信息并发送 * - * @param channel 消息标签 + * @param channel 消息频道 * @param message 消息内容 + * @param prefix 是否自动为消息频道添加分组前缀 * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) */ - public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean block) { + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean prefix, boolean block) { + if (prefix) { + channel = ballConfig.getChannelPrefix() + ":" + channel; + } if (block) { pubConnection.sync().publish(channel, message); eventBus.post(new MessageSentEvent(channel, message)); } else { + @NotNull String finalChannel = channel; pubConnection.async().publish(channel, message).whenComplete((aLong, throwable) -> { if (throwable != null) { return; } - eventBus.post(new MessageSentEvent(channel, message)); + eventBus.post(new MessageSentEvent(finalChannel, message)); }); } } public void subscribe(@NotNull String... channel) { + for (int i = 0; i < channel.length; i++) { + channel[i] = ballConfig.getChannelPrefix() + ":" + channel[i]; + } subConnection.sync().subscribe(channel); } @@ -440,6 +476,9 @@ public abstract class BallAPI { } public void unsubscribe(@NotNull String... channel) { + for (int i = 0; i < channel.length; i++) { + channel[i] = ballConfig.getChannelPrefix() + ":" + channel[i]; + } subConnection.sync().unsubscribe(channel); } @@ -454,12 +493,12 @@ public abstract class BallAPI { */ @NotNull public BallServerInfo getLocalServerInfo() { - return localServerInfo; + return ballConfig.getServerInfo(); } @NotNull public String getLocalServerId() { - return localServerInfo.getId(); + return ballConfig.getServerInfo().getId(); } /** @@ -579,6 +618,11 @@ public abstract class BallAPI { @NotNull public DataSource getDatasource() { - return datasource == null ? CoreAPI.getInstance().getDataSource() : datasource; + return ballConfig.getDatasource() == null ? CoreAPI.getInstance().getDataSource() : ballConfig.getDatasource(); + } + + @NotNull + public RedisClient getRedisClient() { + return ballConfig.getRedisClient(); } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java index c6e08bc..1940e98 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java @@ -1,17 +1,25 @@ package cn.hamster3.mc.plugin.ball.common.config; import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import io.lettuce.core.RedisClient; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -@Data +import javax.sql.DataSource; + +@Getter @AllArgsConstructor public class BallConfig { + private boolean debug; @NotNull - private BallServerInfo localInfo; + private RedisClient redisClient; @NotNull - private String host; - private int port; - private int eventLoopThread; + private String channelPrefix; + private boolean gameServerUpdatePlayerInfo; + @NotNull + private BallServerInfo serverInfo; + @Nullable + private DataSource datasource; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java index 80b6d51..45cd33a 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java @@ -1,38 +1,23 @@ package cn.hamster3.mc.plugin.ball.common.listener; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessage; -import io.lettuce.core.pubsub.RedisPubSubListener; +import cn.hamster3.mc.plugin.ball.common.event.message.MessageReceivedEvent; +import cn.hamster3.mc.plugin.ball.common.event.message.MessageSentEvent; +import com.google.common.eventbus.Subscribe; -public class BallDebugListener implements RedisPubSubListener { +public class BallDebugListener { public static final BallDebugListener INSTANCE = new BallDebugListener(); private BallDebugListener() { } - @Override - public void message(String channel, BallMessage event) { - BallAPI.getInstance().getLogger().info("从 " + channel + " 收到了一条消息: " + event); + @Subscribe + public void onMessageReceived(MessageReceivedEvent event) { + BallAPI.getInstance().getLogger().info("从 " + event.getChannel() + " 收到了一条消息: " + event.getMessage()); } - @Override - public void message(String pattern, String channel, BallMessage event) { - BallAPI.getInstance().getLogger().info("从 " + pattern + "(" + channel + ") 收到了一条消息: " + event); - } - - @Override - public void subscribed(String channel, long count) { - } - - @Override - public void psubscribed(String pattern, long count) { - } - - @Override - public void unsubscribed(String channel, long count) { - } - - @Override - public void punsubscribed(String pattern, long count) { + @Subscribe + public void onMessageSent(MessageSentEvent event) { + BallAPI.getInstance().getLogger().info("从 " + event.getChannel() + " 发送了了一条消息: " + event.getMessage()); } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java index 66e806b..4ccfae0 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java @@ -129,21 +129,21 @@ public class BallRedisListener implements RedisPubSubListener Date: Mon, 20 Nov 2023 14:44:36 +0800 Subject: [PATCH 11/12] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=A2=91?= =?UTF-8?q?=E9=81=93=E5=88=86=E7=BB=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/ball/bukkit/HamsterBallPlugin.java | 12 ++++++ .../listener/UpdatePlayerInfoListener.java | 37 ++----------------- .../ball/bukkit/util/BallBukkitUtils.java | 33 +++++++++++++++++ .../plugin/core/bungee/HamsterBallPlugin.java | 6 +-- .../core/bungee/util/BallBungeeCordUtils.java | 13 ++++--- .../common/listener/BallDebugListener.java | 2 +- 6 files changed, 58 insertions(+), 45 deletions(-) diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java index 6905bad..f62aa93 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java @@ -4,7 +4,9 @@ import cn.hamster3.mc.plugin.ball.bukkit.api.BallBukkitAPI; import cn.hamster3.mc.plugin.ball.bukkit.hook.PlaceholderHook; import cn.hamster3.mc.plugin.ball.bukkit.listener.BallBukkitListener; import cn.hamster3.mc.plugin.ball.bukkit.listener.UpdatePlayerInfoListener; +import cn.hamster3.mc.plugin.ball.bukkit.util.BallBukkitUtils; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import org.bukkit.Bukkit; @@ -65,6 +67,16 @@ public class HamsterBallPlugin extends JavaPlugin { Bukkit.getPluginManager().registerEvents(UpdatePlayerInfoListener.INSTANCE, this); BallAPI.getInstance().getEventBus().register(UpdatePlayerInfoListener.INSTANCE); logger.info("已注册监听器 UpdatePlayerInfoListener"); + + // 移除失效的在线玩家 + BallAPI.getInstance().getAllPlayerInfo().values() + .stream() + .filter(BallPlayerInfo::isOnline) + .filter(o -> BallAPI.getInstance().isLocalServer(o.getGameServer())) + .forEach(playerInfo -> { + playerInfo.setOnline(false); + BallBukkitUtils.uploadPlayerInfo(playerInfo); + }); } sync(() -> { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java index bfc0133..048f9ef 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java @@ -1,22 +1,16 @@ package cn.hamster3.mc.plugin.ball.bukkit.listener; +import cn.hamster3.mc.plugin.ball.bukkit.util.BallBukkitUtils; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; -import cn.hamster3.mc.plugin.ball.common.event.BallActions; -import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLoginEvent; import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLogoutEvent; -import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import com.google.common.eventbus.Subscribe; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.jetbrains.annotations.NotNull; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -29,31 +23,6 @@ public class UpdatePlayerInfoListener implements Listener { private UpdatePlayerInfoListener() { } - public static void uploadPlayerInfo(@NotNull BallPlayerInfo playerInfo) { - CoreAPI.getInstance().getExecutorService().execute(() -> { - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { - try (PreparedStatement statement = connection.prepareStatement( - "REPLACE INTO `hamster_ball_player_info` VALUES(?, ?, ?, ?, ?);" - )) { - statement.setString(1, playerInfo.getUuid().toString()); - statement.setString(2, playerInfo.getName()); - statement.setString(3, playerInfo.getGameServer()); - statement.setString(4, playerInfo.getProxyServer()); - statement.setBoolean(5, playerInfo.isOnline()); - statement.executeUpdate(); - } - } catch (SQLException e) { - e.printStackTrace(); - } - BallAPI.getInstance().sendBallMessage( - BallAPI.PLAYER_INFO_UPDATE_CHANNEL, - BallActions.BallPlayerInfoUpdate.name(), - new BallPlayerInfoUpdateEvent(playerInfo), - false - ); - }); - } - @EventHandler(ignoreCancelled = true) public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); @@ -64,7 +33,7 @@ public class UpdatePlayerInfoListener implements Listener { PLAYER_PROXY_SERVER.getOrDefault(player.getUniqueId(), "unknown"), true ); - uploadPlayerInfo(playerInfo); + BallBukkitUtils.uploadPlayerInfo(playerInfo); } @Subscribe @@ -80,6 +49,6 @@ public class UpdatePlayerInfoListener implements Listener { return; } playerInfo.setOnline(false); - uploadPlayerInfo(playerInfo); + BallBukkitUtils.uploadPlayerInfo(playerInfo); } } diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/util/BallBukkitUtils.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/util/BallBukkitUtils.java index 4dd5d4b..cc7b838 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/util/BallBukkitUtils.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/util/BallBukkitUtils.java @@ -1,11 +1,20 @@ package cn.hamster3.mc.plugin.ball.bukkit.util; +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariConfig; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariDataSource; import org.bukkit.configuration.ConfigurationSection; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; public final class BallBukkitUtils { private BallBukkitUtils() { @@ -38,4 +47,28 @@ public final class BallBukkitUtils { return null; } } + + public static void uploadPlayerInfo(@NotNull BallPlayerInfo playerInfo) { + CoreAPI.getInstance().getExecutorService().execute(() -> { + try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (PreparedStatement statement = connection.prepareStatement( + "REPLACE INTO `hamster_ball_player_info` VALUES(?, ?, ?, ?, ?);" + )) { + statement.setString(1, playerInfo.getUuid().toString()); + statement.setString(2, playerInfo.getName()); + statement.setString(3, playerInfo.getGameServer()); + statement.setString(4, playerInfo.getProxyServer()); + statement.setBoolean(5, playerInfo.isOnline()); + statement.executeUpdate(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + BallAPI.getInstance().sendBallMessage( + BallAPI.PLAYER_INFO_UPDATE_CHANNEL, + BallActions.BallPlayerInfoUpdate.name(), + new BallPlayerInfoUpdateEvent(playerInfo) + ); + }); + } } diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java index 8e0b111..cc5e9d8 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java @@ -52,10 +52,8 @@ public class HamsterBallPlugin extends Plugin { logger.info("已注册监听器 BallBungeeListener"); BallAPI.getInstance().getEventBus().register(BallBungeeListenerV2.INSTANCE); logger.info("已注册监听器 BallBungeeListenerV2"); - if (!BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { - ProxyServer.getInstance().getPluginManager().registerListener(this, UpdatePlayerInfoListener.INSTANCE); - logger.info("已注册监听器 UpdatePlayerInfoListener"); - } + ProxyServer.getInstance().getPluginManager().registerListener(this, UpdatePlayerInfoListener.INSTANCE); + logger.info("已注册监听器 UpdatePlayerInfoListener"); BallAPI.getInstance().sendBallMessage( BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java index 00af80e..deed911 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java @@ -50,12 +50,13 @@ public final class BallBungeeCordUtils { } catch (SQLException e) { e.printStackTrace(); } - BallAPI.getInstance().sendBallMessage( - BallAPI.PLAYER_INFO_UPDATE_CHANNEL, - BallActions.BallPlayerInfoUpdate.name(), - new BallPlayerInfoUpdateEvent(playerInfo), - false - ); + if (!BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { + BallAPI.getInstance().sendBallMessage( + BallAPI.PLAYER_INFO_UPDATE_CHANNEL, + BallActions.BallPlayerInfoUpdate.name(), + new BallPlayerInfoUpdateEvent(playerInfo) + ); + } }); } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java index 45cd33a..10ae469 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java @@ -18,6 +18,6 @@ public class BallDebugListener { @Subscribe public void onMessageSent(MessageSentEvent event) { - BallAPI.getInstance().getLogger().info("从 " + event.getChannel() + " 发送了了一条消息: " + event.getMessage()); + BallAPI.getInstance().getLogger().info("向 " + event.getChannel() + " 发送了一条消息: " + event.getMessage()); } } From 3409b35356d21d3316bc6676cf3ac6b43c79a97a Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Mon, 20 Nov 2023 14:45:03 +0800 Subject: [PATCH 12/12] =?UTF-8?q?build:=20=E4=BF=AE=E6=94=B9=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3a13c60..319cbca 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "cn.hamster3.mc.plugin" -version = "1.3.0" +version = "1.4.0" subprojects { apply {