diff --git a/src/main/java/Sdf1_login/LoginManager.java b/src/main/java/Sdf1_login/LoginManager.java index 39f2c3a..89b5d41 100644 --- a/src/main/java/Sdf1_login/LoginManager.java +++ b/src/main/java/Sdf1_login/LoginManager.java @@ -343,6 +343,10 @@ public class LoginManager { // ★ 记录Java手动登录:5分钟内重连可直接放行(检查点1) if (plugin.webManager != null) { plugin.webManager.recordJavaLogin(name, plugin.getPlayerIP(p)); + // ★ 第57批续3:/login 成功后推送 login_verified=1 给 PHP(统一收口) + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + plugin.webManager.pushLoginVerified(name); + }); } plugin.getDb().setLoggedIn(name, true); if (!tempPassword) { diff --git a/src/main/java/Sdf1_login/Main.java b/src/main/java/Sdf1_login/Main.java index 7bd9133..a176120 100644 --- a/src/main/java/Sdf1_login/Main.java +++ b/src/main/java/Sdf1_login/Main.java @@ -10064,10 +10064,19 @@ public class Main extends JavaPlugin return true; } + // ★ 第57批续3:/delete ban 拦截(ban 不作为待删除玩家账号的名字) + if (sub.equals("delete") && args.length >= 2 && args[1].equalsIgnoreCase("ban")) { + sender.sendMessage("§cban 是封禁缺口确认命令,不是玩家账号名"); + sender.sendMessage("§7确认拉回封禁:§a/sdf1_login confirm ban"); + sender.sendMessage("§7确认解封:§a/sdf1_login cancel ban"); + return true; + } + // ★ 第57批:confirm ban 确认封禁缺口拉回 if (sub.equals("confirm") && args.length >= 2 && args[1].equalsIgnoreCase("ban")) { if (!isAdmin(sender)) { sender.sendMessage("\u00a7c权限不足"); return true; } if (webManager == null) { sender.sendMessage("\u00a7cWeb通信未初始化"); return true; } + if (!webManager.hasBanPending()) { sender.sendMessage("§c当前没有待确认的封禁缺口"); return true; } webManager.confirmBanGap(sender); return true; } @@ -10075,6 +10084,7 @@ public class Main extends JavaPlugin if (sub.equals("cancel") && args.length >= 2 && args[1].equalsIgnoreCase("ban")) { if (!isAdmin(sender)) { sender.sendMessage("\u00a7c权限不足"); return true; } if (webManager == null) { sender.sendMessage("\u00a7cWeb通信未初始化"); return true; } + if (!webManager.hasBanPending()) { sender.sendMessage("§c当前没有待确认的封禁缺口"); return true; } webManager.cancelBanGap(sender); return true; } diff --git a/src/main/java/Sdf1_login/WebManager.java b/src/main/java/Sdf1_login/WebManager.java index 642e9f5..be40e0d 100644 --- a/src/main/java/Sdf1_login/WebManager.java +++ b/src/main/java/Sdf1_login/WebManager.java @@ -5878,6 +5878,24 @@ public class WebManager { syncBans(); syncAdmins(); } + // ★ 第57批续3:给所有在线管理员发消息 + private void broadcastToAdmins(String msg) { + String adminTag = plugin.getConfigMgr().areaProtectAdminTag; + if (adminTag == null || adminTag.isEmpty()) adminTag = "admin"; + for (org.bukkit.entity.Player p : Bukkit.getOnlinePlayers()) { + if (p.hasPermission("group." + adminTag) || p.isOp()) { + p.sendMessage(msg); + continue; + } + for (String tag : p.getScoreboardTags()) { + if (tag.equalsIgnoreCase(adminTag)) { + p.sendMessage(msg); + break; + } + } + } + } + // ★ 第57批:封禁缺口确认/取消 + 登录验证推送 /** 进入封禁缺口待确认模式:写bak备份,等管理员确认 */ private void enterBanPendingMode(List> rows) { @@ -5890,6 +5908,9 @@ public class WebManager { plugin.getLogger().warning("[封禁-缺口] 服主可能批量解封删了 banned-players.json"); plugin.getLogger().warning("[封禁-缺口] 执行 /sdf1_login confirm ban 拉回封禁"); plugin.getLogger().warning("[封禁-缺口] 执行 /sdf1_login cancel ban 确认解封"); + broadcastToAdmins("§c§l[封禁-缺口] §f检测到 " + rows.size() + " 条封禁数据缺口待确认"); + broadcastToAdmins("§7执行 §a/sdf1_login confirm ban §7拉回封禁数据"); + broadcastToAdmins("§7或 §a/sdf1_login cancel ban §7确认解封(清空PHP数据)"); } /** 管理员确认拉回封禁缺口 */