第31批:web关闭时本地兑换失败直接返回(不进远端查询);被拉黑玩家不进入口令监听流程
Check Source / check (push) Successful in 1s
Auto Release / build (push) Successful in 1m37s
Simple Test / test (push) Successful in 2s
Test Env / test (push) Successful in 1s

This commit is contained in:
ypsdf1
2026-10-21 12:25:26 +08:00
parent f216373c08
commit a5de5fd797
+42
View File
@@ -1908,7 +1908,32 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor {
}
return false;
}
/**
* ★ 第31批(#202):反射查询 Sdf1_login 的拉黑状态。
* Sdf1_login 未安装/未启用/异常时一律视为未拉黑,不拦正常玩家。
*/
private boolean isLoginBlacklisted(Player p) {
try {
org.bukkit.plugin.Plugin login =
Bukkit.getPluginManager()
.getPlugin("Sdf1_login");
if (login == null || !login.isEnabled()) return false;
java.lang.reflect.Method m = login.getClass()
.getMethod("isBlacklisted",
org.bukkit.entity.Player.class);
return Boolean.TRUE.equals(m.invoke(login, p));
} catch (Throwable t) {
return false;
}
}
private void startListening(Player p) {
// ★ 第31批(#202):被拉黑用户不进入口令监听流程
if (isLoginBlacklisted(p)) {
p.sendMessage(colorize(
"&c[SDF1] 你已被拉黑,无法使用口令兑换"));
return;
}
listening.put(p.getUniqueId(), System.currentTimeMillis());
p.sendMessage(colorize("&a[SDF1] &f已开启口令监听 (15秒)"));
final UUID uuid = p.getUniqueId();
@@ -1935,6 +1960,12 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor {
if (msg.isEmpty() || !listening.containsKey(u)) return;
event.setCancelled(true);
stopListening(u, true);
// ★ 第31批(#202):监听期间被拉黑 → 退出监听,不进入兑换流程
if (isLoginBlacklisted(p)) {
p.sendMessage(colorize(
"&c[SDF1] 你已被拉黑,无法使用口令兑换"));
return;
}
p.sendMessage(colorize("&a[SDF1] &f已拦截,比对中..."));
Long last = chatCd.get(u);
if (last != null && System.currentTimeMillis() - last < 500) return;
@@ -2302,6 +2333,17 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor {
return true;
}
// ★ 第31批(#202):sdf1_login 的 web通信关闭 → 本地失败直接返回,
// 不进入「正在查询远程验证」流程(否则玩家干等45秒超时)
if ("fail:web_disabled".equals(res)) {
p.sendMessage(colorize(
"&c[债券] 远程验证未开启(web通信已关闭),"
+ "本地也没有这个兑换码"));
log("[债券] web关闭跳过远程验证: "
+ p.getName() + " code=" + code);
return true;
}
if ("fail:not_found".equals(res)) {
// ★ 本地未找到 → 存入pending队列,Sdf1_login轮询统一调度
log("[债券] 本地CDK未找到,提交远程验证: " + code);