From 68ba0970332d55980d276e91302511ab294c9d44 Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Sat, 24 Feb 2024 16:38:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20load-player-info-f?= =?UTF-8?q?ilter=20=E9=85=8D=E7=BD=AE=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +-- ball-bukkit/build.gradle.kts | 4 +- .../plugin/ball/bukkit/api/BallBukkitAPI.java | 1 + ball-bukkit/src/main/resources/config.yml | 5 ++ .../ball/bungee/api/BallBungeeCordAPI.java | 1 + ball-bungee/src/main/resources/config.yml | 4 + .../mc/plugin/ball/common/api/BallAPI.java | 85 ++++++++++--------- .../plugin/ball/common/config/BallConfig.java | 2 + .../common/listener/BallDebugListener.java | 10 +++ .../common/listener/BallRedisListener.java | 44 +++++----- build.gradle.kts | 2 +- 11 files changed, 100 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 833f002..953972e 100644 --- a/README.md +++ b/README.md @@ -44,14 +44,16 @@ ```groovy // 添加仓库 repositories { - maven("https://maven.airgame.net/maven-public/") + maven { + url = uri("https://maven.airgame.net/maven-public/") + } } dependencies { // 对于 Bukkit 插件 - compileOnly("cn.hamster3.mc.plugin:ball-bukkit:1.5.1") + compileOnly("cn.hamster3.mc.plugin:ball-bukkit:1.5.2") // 对于 BungeeCord 插件 - compileOnly("cn.hamster3.mc.plugin:ball-bungee:1.5.1") + compileOnly("cn.hamster3.mc.plugin:ball-bungee:1.5.2") } ``` @@ -77,13 +79,13 @@ dependencies { cn.hamster3.mc.plugin ball-bukkit - 1.5.1 + 1.5.2 cn.hamster3.mc.plugin ball-bungee - 1.5.1 + 1.5.2 diff --git a/ball-bukkit/build.gradle.kts b/ball-bukkit/build.gradle.kts index f5a5e24..41e3490 100644 --- a/ball-bukkit/build.gradle.kts +++ b/ball-bukkit/build.gradle.kts @@ -1,10 +1,12 @@ +@file:Suppress("VulnerableLibrariesLocal") + evaluationDependsOn(":ball-common") dependencies { implementation(project(":ball-common")) { isTransitive = false } - compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") + compileOnly("org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT") compileOnly("cn.hamster3.mc.plugin:core-bukkit:1.2.2") compileOnly("me.clip:placeholderapi:2.11.5") { 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 3de934a..d228404 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 @@ -59,6 +59,7 @@ public class BallBukkitAPI extends BallAPI { config.getBoolean("debug", false), config.getString("channel-prefix", "") + ":", config.getBoolean("game-server-update-player-info", false), + config.getStringList("load-player-info-filter"), serverInfo, datasource ); diff --git a/ball-bukkit/src/main/resources/config.yml b/ball-bukkit/src/main/resources/config.yml index b2fd6ea..c13f1bd 100644 --- a/ball-bukkit/src/main/resources/config.yml +++ b/ball-bukkit/src/main/resources/config.yml @@ -14,6 +14,11 @@ channel-prefix: "" # 则可以启用该功能以防止 UUID 紊乱的问题 game-server-update-player-info: false +# 该选项仅在 game-server-update-player-info 为 true 时有效 +# 服务器在启动时只会从数据库中加载 proxy_server 为下列的字符串的玩家信息 +load-player-info-filter: + - "BungeeCord" + # 本服务器信息 server-info: # 服务器唯一识别码,最长 32 字符 diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/api/BallBungeeCordAPI.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/api/BallBungeeCordAPI.java index c42cbff..a806208 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/api/BallBungeeCordAPI.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/api/BallBungeeCordAPI.java @@ -56,6 +56,7 @@ public class BallBungeeCordAPI extends BallAPI { config.getBoolean("debug", false), config.getString("channel-prefix", "") + ":", config.getBoolean("game-server-update-player-info", false), + config.getStringList("load-player-info-filter"), serverInfo, datasource ); diff --git a/ball-bungee/src/main/resources/config.yml b/ball-bungee/src/main/resources/config.yml index 4903825..2740318 100644 --- a/ball-bungee/src/main/resources/config.yml +++ b/ball-bungee/src/main/resources/config.yml @@ -14,6 +14,10 @@ channel-prefix: "" # 则可以启用该功能以防止 UUID 紊乱的问题 game-server-update-player-info: false +# 服务器在启动时只会从数据库中加载 proxy_server 为下列的字符串的玩家信息 +load-player-info-filter: + "BungeeCord" + # 本服务器信息 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 dd5e85b..e98ad47 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 @@ -122,24 +122,45 @@ public abstract class BallAPI { } } } - try (PreparedStatement statement = connection.prepareStatement( - "SELECT * FROM `hamster_ball_player_info`;" - )) { - try (ResultSet set = statement.executeQuery()) { - while (set.next()) { - UUID uuid = UUID.fromString(set.getString("uuid")); - allPlayerInfo.put(uuid, new BallPlayerInfo(uuid, - set.getString("name"), - set.getString("game_server"), - set.getString("proxy_server"), - set.getBoolean("online") - )); + if (getBallConfig().isGameServerUpdatePlayerInfo()) { + try (PreparedStatement statement = connection.prepareStatement( + "SELECT * FROM `hamster_ball_player_info` WHERE `proxy_server` IN (?);" + )) { + statement.setString(1, String.join(",", getBallConfig().getLoadPlayerInfoFilter())); + try (ResultSet set = statement.executeQuery()) { + while (set.next()) { + UUID uuid = UUID.fromString(set.getString("uuid")); + allPlayerInfo.put(uuid, new BallPlayerInfo(uuid, + set.getString("name"), + set.getString("game_server"), + set.getString("proxy_server"), + set.getBoolean("online") + )); + } + } + } + } else { + try (PreparedStatement statement = connection.prepareStatement( + "SELECT * FROM `hamster_ball_player_info`;" + )) { + try (ResultSet set = statement.executeQuery()) { + while (set.next()) { + UUID uuid = UUID.fromString(set.getString("uuid")); + allPlayerInfo.put(uuid, new BallPlayerInfo(uuid, + set.getString("name"), + set.getString("game_server"), + set.getString("proxy_server"), + set.getBoolean("online") + )); + } } } } } + getLogger().info("从数据库中加载了 " + allServerInfo.size() + " 条服务器信息"); + getLogger().info("从数据库中加载了 " + allPlayerInfo.size() + " 条玩家信息"); redisPub.addListener(BallRedisListener.INSTANCE); - redisPub.sync().subscribe(BALL_CHANNEL); + subscribeIgnorePrefix(BALL_CHANNEL); } protected void disable() throws SQLException, InterruptedException { @@ -462,6 +483,8 @@ public abstract class BallAPI { /** * 订阅 redis 消息频道 + *

+ * 会自动加上 config 中设置的频道前缀 * * @param channel 频道名称 */ @@ -473,7 +496,7 @@ public abstract class BallAPI { } /** - * 忽略仓鼠球频道前缀配置,订阅 redis 消息频道 + * 忽略频道前缀配置,订阅 redis 消息频道 * * @param channel 频道名称 */ @@ -562,20 +585,9 @@ public abstract class BallAPI { * @return 玩家信息 */ public BallPlayerInfo getPlayerInfo(@NotNull String playerName) { - if (getBallConfig().isGameServerUpdatePlayerInfo()) { - for (BallPlayerInfo info : allPlayerInfo.values()) { - if (!info.getProxyServer().startsWith(BallAPI.getInstance().getBallConfig().getChannelPrefix())) { - continue; - } - if (info.getName().equalsIgnoreCase(playerName)) { - return info; - } - } - } else { - for (BallPlayerInfo info : allPlayerInfo.values()) { - if (info.getName().equalsIgnoreCase(playerName)) { - return info; - } + for (BallPlayerInfo info : allPlayerInfo.values()) { + if (info.getName().equalsIgnoreCase(playerName)) { + return info; } } return null; @@ -588,20 +600,9 @@ public abstract class BallAPI { * @return 玩家信息 */ public BallPlayerInfo getPlayerInfoExact(@NotNull String playerName) { - if (getBallConfig().isGameServerUpdatePlayerInfo()) { - for (BallPlayerInfo info : allPlayerInfo.values()) { - if (!info.getProxyServer().startsWith(BallAPI.getInstance().getBallConfig().getChannelPrefix())) { - continue; - } - if (info.getName().equals(playerName)) { - return info; - } - } - } else { - for (BallPlayerInfo info : allPlayerInfo.values()) { - if (info.getName().equals(playerName)) { - return info; - } + for (BallPlayerInfo info : allPlayerInfo.values()) { + if (info.getName().equals(playerName)) { + return info; } } return null; 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 123cad3..d35a099 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 @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; +import java.util.List; @Getter @AllArgsConstructor @@ -15,6 +16,7 @@ public class BallConfig { @NotNull private String channelPrefix; private boolean gameServerUpdatePlayerInfo; + private List loadPlayerInfoFilter; @NotNull private BallServerInfo serverInfo; @Nullable 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 3f80bdc..434dc2a 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,8 +1,11 @@ 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.event.message.MessageReceivedEvent; import cn.hamster3.mc.plugin.ball.common.event.message.MessageSentEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import com.google.common.eventbus.Subscribe; public class BallDebugListener { @@ -20,4 +23,11 @@ public class BallDebugListener { public void onMessageSent(MessageSentEvent event) { BallAPI.getInstance().getLogger().info("发送了一条消息: " + event); } + + @Subscribe + public void onBallPlayerInfoUpdate(BallPlayerInfoUpdateEvent event) { + BallPlayerInfo playerInfo = event.getPlayerInfo(); + String json = CoreAPI.getInstance().getGson().toJson(playerInfo); + BallAPI.getInstance().getLogger().info("更新了玩家 " + playerInfo.getName() + " 的信息: " + json); + } } 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 73a96ff..07abcda 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 @@ -10,6 +10,7 @@ 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 cn.hamster3.mc.plugin.core.lib.io.lettuce.core.pubsub.RedisPubSubListener; +import com.google.common.eventbus.EventBus; public class BallRedisListener implements RedisPubSubListener { public static final BallRedisListener INSTANCE = new BallRedisListener(); @@ -22,104 +23,105 @@ public class BallRedisListener implements RedisPubSubListener