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