Skip to content

Commit 339d68c

Browse files
feat(plugin): 优化插件启动流程并增强白名单验证逻辑
- 调整命令和监听器注册时机,确保在白名单系统初始化完成后再进行注册 - 增强白名单验证日志输出,添加验证开始与结束标识,便于调试 - 补充白名单检查过程中的详细信息日志,包括缓存大小、严格模式状态等 - 修改默认配置中 strict-mode 为 true,提高调试阶段的安全性 - 优化踢出消息格式,移除不必要的占位符,保留核心提示内容
1 parent b846cf6 commit 339d68c

3 files changed

Lines changed: 52 additions & 25 deletions

File tree

src/main/java/com/xaoxiao/convenientaccess/ConvenientAccessPlugin.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,27 @@ public void onEnable() {
4141
dataCollector = new DataCollector(this, sparkIntegration, cacheManager);
4242
apiManager = new ApiManager(this, dataCollector);
4343

44+
// 注册命令
45+
if (getCommand("convenientaccess") != null) {
46+
getCommand("convenientaccess").setExecutor(new ConvenientAccessCommand(this));
47+
logger.info("命令处理器已注册");
48+
} else {
49+
logger.warn("无法注册命令处理器 - 命令未在plugin.yml中定义");
50+
}
51+
4452
// 初始化白名单管理系统
4553
whitelistSystem = new WhitelistSystem(this);
4654
whitelistSystem.initialize().thenAccept(success -> {
4755
if (success) {
4856
logger.info("白名单管理系统启动成功");
4957

58+
// 在白名单系统初始化完成后注册监听器
59+
getServer().getPluginManager().registerEvents(
60+
new com.xaoxiao.convenientaccess.listener.WhitelistListener(this),
61+
this
62+
);
63+
logger.info("白名单监听器已注册");
64+
5065
// 在白名单系统初始化完成后启动HTTP服务器
5166
if (configManager.isHttpEnabled()) {
5267
try {
@@ -67,16 +82,6 @@ public void onEnable() {
6782
return null;
6883
});
6984

70-
// 注册命令
71-
getCommand("convenientaccess").setExecutor(new ConvenientAccessCommand(this));
72-
73-
// 注册白名单监听器
74-
getServer().getPluginManager().registerEvents(
75-
new com.xaoxiao.convenientaccess.listener.WhitelistListener(this),
76-
this
77-
);
78-
logger.info("白名单监听器已注册");
79-
8085
logger.info("ConvenientAccess 插件启动完成!");
8186

8287
} catch (Exception e) {

src/main/java/com/xaoxiao/convenientaccess/listener/WhitelistListener.java

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,55 +42,79 @@ public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent event) {
4242
String playerName = event.getName();
4343
String playerUuid = event.getUniqueId().toString();
4444

45-
logger.debug("检查玩家白名单状态: {} ({})", playerName, playerUuid);
45+
logger.info("=== 白名单验证开始 ===");
46+
logger.info("玩家: {} ({})", playerName, playerUuid);
47+
logger.info("IP地址: {}", event.getAddress().getHostAddress());
4648

4749
try {
4850
// 检查白名单系统是否已初始化
49-
if (!plugin.getWhitelistSystem().isInitialized()) {
50-
logger.warn("白名单系统未初始化,允许玩家 {} 进入", playerName);
51+
boolean isSystemInitialized = plugin.getWhitelistSystem().isInitialized();
52+
logger.info("白名单系统初始化状态: {}", isSystemInitialized);
53+
54+
if (!isSystemInitialized) {
55+
logger.warn("❌ 白名单系统未初始化,允许玩家 {} 进入", playerName);
5156
return;
5257
}
5358

5459
// 检查配置是否启用白名单
55-
if (!plugin.getConfigManager().isWhitelistEnabled()) {
56-
logger.debug("白名单功能已禁用,允许玩家 {} 进入", playerName);
60+
boolean isWhitelistEnabled = plugin.getConfigManager().isWhitelistEnabled();
61+
logger.info("白名单功能启用状态: {}", isWhitelistEnabled);
62+
63+
if (!isWhitelistEnabled) {
64+
logger.info("✅ 白名单功能已禁用,允许玩家 {} 进入", playerName);
5765
return;
5866
}
5967

68+
// 检查玩家是否有绕过白名单的权限(需要提前在数据库或配置中设置)
69+
// 注意:在PreLoginEvent中无法直接检查权限,因为玩家还未完全加载
70+
// 这里可以通过其他方式实现,比如配置文件中的绕过列表
71+
72+
// 检查白名单管理器状态
73+
int cacheSize = whitelistManager.getCacheSize();
74+
logger.info("白名单缓存大小: {}", cacheSize);
75+
6076
// 异步检查玩家是否在白名单中
77+
logger.info("开始检查玩家白名单状态...");
6178
CompletableFuture<Boolean> whitelistCheck = whitelistManager.isPlayerWhitelisted(playerUuid);
6279

6380
// 等待结果(设置合理的超时时间)
6481
Boolean isWhitelisted = whitelistCheck.get(5, TimeUnit.SECONDS);
82+
logger.info("白名单检查结果: {}", isWhitelisted);
6583

6684
if (!isWhitelisted) {
6785
// 玩家不在白名单中,拒绝连接
6886
String kickMessage = getCustomKickMessage(playerName);
6987
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, kickMessage);
7088

71-
logger.info("拒绝玩家连接(未在白名单中): {} ({})", playerName, playerUuid);
89+
logger.warn("❌ 拒绝玩家连接(未在白名单中): {} ({})", playerName, playerUuid);
90+
logger.info("踢出消息: {}", kickMessage);
7291

7392
// 记录操作日志
7493
logUnauthorizedAccess(playerName, playerUuid, event.getAddress().getHostAddress());
7594
} else {
76-
logger.info("允许玩家连接(已在白名单中): {} ({})", playerName, playerUuid);
95+
logger.info("允许玩家连接(已在白名单中): {} ({})", playerName, playerUuid);
7796
}
7897

7998
} catch (java.util.concurrent.TimeoutException | java.util.concurrent.ExecutionException | InterruptedException e) {
80-
logger.error("检查玩家白名单状态时发生错误: {} ({})", playerName, playerUuid, e);
99+
logger.error("检查玩家白名单状态时发生错误: {} ({})", playerName, playerUuid, e);
81100

82101
// 发生错误时的处理策略
83-
if (plugin.getConfigManager().isWhitelistStrictMode()) {
102+
boolean strictMode = plugin.getConfigManager().isWhitelistStrictMode();
103+
logger.info("严格模式状态: {}", strictMode);
104+
105+
if (strictMode) {
84106
// 严格模式:发生错误时拒绝连接
85107
event.disallow(
86108
AsyncPlayerPreLoginEvent.Result.KICK_OTHER,
87109
"§c白名单验证失败,请稍后重试"
88110
);
89-
logger.warn("严格模式下拒绝玩家连接(白名单验证失败): {}", playerName);
111+
logger.warn("严格模式下拒绝玩家连接(白名单验证失败): {}", playerName);
90112
} else {
91113
// 宽松模式:发生错误时允许连接
92-
logger.warn("宽松模式下允许玩家连接(白名单验证失败): {}", playerName);
114+
logger.warn("⚠️ 宽松模式下允许玩家连接(白名单验证失败): {}", playerName);
93115
}
116+
} finally {
117+
logger.info("=== 白名单验证结束 ===");
94118
}
95119
}
96120

src/main/resources/config.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,12 @@ api:
3636
whitelist:
3737
# 是否启用白名单功能
3838
enabled: true
39-
# 严格模式(验证失败时拒绝连接)
40-
strict-mode: false
39+
# 严格模式(验证失败时拒绝连接,建议开启用于调试
40+
strict-mode: true
4141
# 踢出消息(支持颜色代码 &)
4242
kick-message: |
4343
&c您不在服务器白名单中!
4444
&7请联系管理员申请加入白名单
45-
&7服务器: {server}
46-
&7联系方式: {contact}
4745
# 联系方式信息
4846
contact-info: "请联系管理员"
4947
# 注册令牌默认过期时间 (小时)

0 commit comments

Comments
 (0)