diff --git a/README.md b/README.md index 2f233d1..87009e4 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,15 @@ Whitelist4QQ 是一个基于 [MiraiMC](https://github.com/DreamVoid/MiraiMC) 的 默认配置文件可以在这里找到:https://github.com/DreamVoid/Whitelist4QQ/blob/main/src/main/resources/config.yml ## 指令和权限 ### 指令 -| 命令 | 描述 | 权限 | 别名 | -| ---------------------------- | ---------------------- | ---------- | ------- | -| /whitelist4qq | 插件主命令 | whitelist4qq.command.whitelist4qq | qwl, qwhitelist | -| /whitelist4qq reload | 重新加载配置文件 | whitelist4qq.command.whitelist4qq.reload | +| 命令 | 描述 | 权限 | 别名 | +|----------------------------|----------|------------------------------------------| ------- | +| /whitelist4qq | 插件主命令 | whitelist4qq.command.whitelist4qq | qwl, qwhitelist | +| /whitelist4qq reload | 重新加载配置文件 | whitelist4qq.command.whitelist4qq.reload | +| /whitelist4qq remove <玩家名> | 移除玩家的绑定 | whitelist4qq.command.whitelist4qq.remove | ### 权限 -| 权限节点 | 描述 | 默认 | -| ---------------------------- | ---------------------- | ---------- | -| whitelist4qq.command.whitelist4qq | 允许使用 /whitelist4qq | YES | +| 权限节点 | 描述 | 默认 | +| ---------------------------- |---------------------------| ---------- | +| whitelist4qq.command.whitelist4qq | 允许使用 /whitelist4qq | YES | | whitelist4qq.command.whitelist4qq.reload | 允许使用 /whitelist4qq reload | OP | +| whitelist4qq.command.whitelist4qq.remove | 允许使用 /whitelist4qq remove | OP | diff --git a/src/main/java/me/dreamvoid/whitelist4qq/bukkit/BukkitPlugin.java b/src/main/java/me/dreamvoid/whitelist4qq/bukkit/BukkitPlugin.java index c5679eb..366291e 100644 --- a/src/main/java/me/dreamvoid/whitelist4qq/bukkit/BukkitPlugin.java +++ b/src/main/java/me/dreamvoid/whitelist4qq/bukkit/BukkitPlugin.java @@ -7,8 +7,10 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -16,18 +18,23 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; -import java.util.HashMap; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.NoSuchElementException; import static me.dreamvoid.whitelist4qq.bukkit.Config.*; public class BukkitPlugin extends JavaPlugin implements Listener { private Config config; - private final HashMap cache = new HashMap<>(); + private final ArrayList cache = new ArrayList<>(); + private static File whitelist; @Override public void onLoad() { this.config = new Config(this); + whitelist = new File(getDataFolder(),"whitelist.yml"); } @Override @@ -35,13 +42,19 @@ public void onEnable() { config.loadConfig(); Bukkit.getPluginManager().registerEvents(new PlayerLogin(), this); Bukkit.getPluginManager().registerEvents(new PlayerJoin(), this); - if(GEN_CheckRange_ACTION) { - Bukkit.getPluginManager().registerEvents(new PlayerActions(), this); - } + if(GEN_CheckRange_ACTION) Bukkit.getPluginManager().registerEvents(new PlayerActions(), this); Bukkit.getPluginManager().registerEvents(new BotEvent(), this); Bukkit.getScheduler().runTaskTimerAsynchronously(this, new AsyncCheckBind(this), 0L, 60L); - if (GEN_bStats) { - new Metrics(this, 13112); + if (GEN_bStats) new Metrics(this, 13112); + + if(GEN_UseSelfData){ + if(!whitelist.exists()) { + try { + whitelist.createNewFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } } @@ -52,10 +65,43 @@ public void onDisable() { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if(args.length>0 && args[0].equalsIgnoreCase("reload") && sender.hasPermission("whitelist4qq.command.whitelist4qq.reload")){ - config.loadConfig(); - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a配置文件已经重新加载!")); - } else sender.sendMessage("This server is running "+getDescription().getName()+" version "+getDescription().getVersion()+" by "+ getDescription().getAuthors().toString().replace("[","").replace("]","")+" (MiraiMC version "+Bukkit.getPluginManager().getPlugin("MiraiMC").getDescription().getVersion()+")"); + if (args.length > 0) { + if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("whitelist4qq.command.whitelist4qq.reload")) { + config.loadConfig(); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a配置文件已经重新加载!")); + } else if(args[0].equalsIgnoreCase("remove") && sender.hasPermission("whitelist4qq.command.whitelist4qq.remove")){ + if(args.length>=2){ + if(!GEN_UseSelfData){ + OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]); + MiraiMC.removeBind(player.getUniqueId()); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a已移除指定玩家的绑定!")); + } else { + YamlConfiguration white = YamlConfiguration.loadConfiguration(whitelist); + if(GEN_UsePlayerName){ + try { + List names = white.getStringList("name"); + names.remove(args[1]); + white.set("name",names); + white.save(whitelist); + } catch (IOException e) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c保存文件时出现异常,原因:"+e)); + } + } else try { + List uuids = white.getStringList("uuid"); + uuids.remove(Bukkit.getOfflinePlayer(args[1]).getUniqueId().toString()); + white.set("uuid",uuids); + white.save(whitelist); + } catch (IOException e) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c保存文件时出现异常,原因:"+e)); + } + } + } else sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c用法:/whitelist4qq remove <玩家名>")); + } else { + sender.sendMessage("This server is running " + getDescription().getName() + " version " + getDescription().getVersion() + " by " + getDescription().getAuthors().toString().replace("[", "").replace("]", "") + " (MiraiMC version " + Bukkit.getPluginManager().getPlugin("MiraiMC").getDescription().getVersion() + ")"); + } + } else { + sender.sendMessage("This server is running " + getDescription().getName() + " version " + getDescription().getVersion() + " by " + getDescription().getAuthors().toString().replace("[", "").replace("]", "") + " (MiraiMC version " + Bukkit.getPluginManager().getPlugin("MiraiMC").getDescription().getVersion() + ")"); + } return true; } @@ -68,24 +114,37 @@ public void onPlayerJoin(AsyncPlayerPreLoginEvent e) { boolean allow = false; if(GEN_CheckRange_JOIN) { // 加入服务器的时候检测 - long binder = MiraiMC.getBind(e.getUniqueId()); - if(binder != 0) { - // 是否需要进一步检测是否在群内 - if(BOT_CheckQQInGroup) { - for(long group : BOT_UsedGroupAccounts) { - if(allow) break; // 如果下面的代码已经检测到在群里了,就不继续检测 - - for(long bot : BOT_UsedBotAccounts) { - try { // 加个try防止服主忘记登录机器人然后尝试获取的时候报错的问题 - if(MiraiBot.getBot(bot).getGroup(group).contains(binder)) { - allow = true; - break; - } - } catch (NoSuchElementException ignored) { } // 不需要处理报错,直接ignored + if (!(GEN_UseSelfData)) { + long binder = MiraiMC.getBind(e.getUniqueId()); + if (binder != 0) { + // 是否需要进一步检测是否在群内 + if (BOT_CheckQQInGroup) { + for (long group : BOT_UsedGroupAccounts) { + if (allow) break; // 如果下面的代码已经检测到在群里了,就不继续检测 + + for (long bot : BOT_UsedBotAccounts) { + try { // 加个try防止服主忘记登录机器人然后尝试获取的时候报错的问题 + if (MiraiBot.getBot(bot).getGroup(group).contains(binder)) { + allow = true; + break; + } + } catch (NoSuchElementException ignored) { + } // 不需要处理报错,直接ignored + } } - } - } else allow = true; // 不需要则直接true + } else allow = true; // 不需要则直接true + } + } else { + YamlConfiguration white = YamlConfiguration.loadConfiguration(whitelist); + if(GEN_UsePlayerName){ + List names = white.getStringList("name"); + allow = names.contains(e.getName()); + } else { + List uuids = white.getStringList("uuid"); + allow = uuids.contains(e.getUniqueId().toString()); + } } + } else allow = true; // 如果不在加入服务器的时候检测,直接放行 if(allow){ @@ -105,11 +164,27 @@ public void onPlayerJoin(AsyncPlayerPreLoginEvent e) { public class PlayerJoin implements Listener { @EventHandler public void onPlayerJoined(PlayerJoinEvent e) { - if (MiraiMC.getBind(e.getPlayer().getUniqueId()) == 0) { - cache.put(e.getPlayer(), false); + boolean whitelisted = true; + if(!GEN_UseSelfData){ + if (MiraiMC.getBind(e.getPlayer().getUniqueId()) == 0) { + whitelisted = false; + } + } else { + YamlConfiguration white = YamlConfiguration.loadConfiguration(whitelist); + if(GEN_UsePlayerName){ + List names = white.getStringList("name"); + whitelisted = names.contains(e.getPlayer().getName()); + } else { + List uuids = white.getStringList("uuid"); + whitelisted = uuids.contains(e.getPlayer().getUniqueId().toString()); + } } - if (GEN_CheckRange_SPEC) { - e.getPlayer().setGameMode(GameMode.SPECTATOR); + + if(!whitelisted){ + cache.add(e.getPlayer()); + if (GEN_CheckRange_SPEC) { + e.getPlayer().setGameMode(GameMode.SPECTATOR); + } } } } @@ -120,55 +195,55 @@ public void onPlayerJoined(PlayerJoinEvent e) { public class PlayerActions implements Listener { @EventHandler public void onPlayerMove(PlayerMoveEvent e) { - if(cache.containsKey(e.getPlayer()) && !GEN_CheckRange_SPEC) + if(cache.contains(e.getPlayer()) && !GEN_CheckRange_SPEC) e.setCancelled(true); } @EventHandler public void onPlayerInteract(PlayerInteractEvent e) { - if(cache.containsKey(e.getPlayer())) + if(cache.contains(e.getPlayer())) e.setCancelled(true); } @EventHandler public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent e) { - if(cache.containsKey(e.getPlayer())) + if(cache.contains(e.getPlayer())) e.setCancelled(true); } @EventHandler public void onPlayerBedEnter(PlayerBedEnterEvent e) { - if(cache.containsKey(e.getPlayer())) + if(cache.contains(e.getPlayer())) e.setCancelled(true); } @EventHandler public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent e) { - if(cache.containsKey(e.getPlayer())) + if(cache.contains(e.getPlayer())) e.setCancelled(true); } @EventHandler public void onPlayerVelocity(PlayerVelocityEvent e) { - if(cache.containsKey(e.getPlayer())) + if(cache.contains(e.getPlayer())) e.setCancelled(true); } @EventHandler public void onPlayerChat(AsyncPlayerChatEvent e) { - if(cache.containsKey(e.getPlayer())) + if(cache.contains(e.getPlayer())) e.setCancelled(true); } @EventHandler public void onPlayerDropItem(PlayerDropItemEvent e) { - if(cache.containsKey(e.getPlayer())) + if(cache.contains(e.getPlayer())) e.setCancelled(true); } @EventHandler public void onPlayerFish(PlayerFishEvent e) { - if(cache.containsKey(e.getPlayer())) + if(cache.contains(e.getPlayer())) e.setCancelled(true); } } @@ -180,20 +255,53 @@ public static class BotEvent implements Listener { @EventHandler public void onGroupMessage(MiraiGroupMessageEvent e) { if (BOT_UsedBotAccounts.contains(e.getBotID()) && BOT_UsedGroupAccounts.contains(e.getGroupID()) && BOT_UseGroupMessageCommand && e.getMessage().startsWith(BOT_BindCommandPrefix)) { - if ((GEN_PreventIDRebind && MiraiMC.getBind(Bukkit.getOfflinePlayer(e.getMessage().replace(BOT_BindCommandPrefix, "")).getUniqueId()) != 0) || (GEN_PreventQQRebind && MiraiMC.getBind(e.getSenderID()) != null)) { - // 阻止绑定 - MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindFailed.replace("%id%", MiraiMC.getBind(e.getSenderID()).toString())); + String playerName = e.getMessage().replace(BOT_BindCommandPrefix, ""); + if(!GEN_UseSelfData){ + if ((GEN_PreventIDRebind && (MiraiMC.getBind(Bukkit.getOfflinePlayer(playerName).getUniqueId()) != 0)) || (GEN_PreventQQRebind && (MiraiMC.getBind(e.getSenderID()) != null))) { + // 阻止绑定 + MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindFailed.replace("%id%", Bukkit.getOfflinePlayer(MiraiMC.getBind(e.getSenderID())).getName())); + } else { + // 允许绑定 + MiraiMC.addBind(Bukkit.getOfflinePlayer(e.getMessage().replace(BOT_BindCommandPrefix, "")).getUniqueId(), e.getSenderID()); + MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindSuccess); + } } else { - // 允许绑定 - MiraiMC.addBind(Bukkit.getOfflinePlayer(e.getMessage().replace(BOT_BindCommandPrefix, "")).getUniqueId(), e.getSenderID()); - MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindSuccess); + YamlConfiguration white = YamlConfiguration.loadConfiguration(whitelist); + if(GEN_UsePlayerName){ + List names = white.getStringList("name"); + if (GEN_PreventIDRebind && names.contains(playerName)) { + MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindFailed); + } else try { + names.add(playerName); + white.set("name", names); + white.save(whitelist); + MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindSuccess); + } catch (IOException ex) { + MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindFailedSelfdata); + throw new RuntimeException(ex); + } + } else { + List uuids = white.getStringList("uuid"); + if (GEN_PreventIDRebind && uuids.contains(Bukkit.getOfflinePlayer(playerName).getUniqueId().toString())) { + MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindFailed); + } else try { + uuids.add(Bukkit.getOfflinePlayer(playerName).getUniqueId().toString()); + white.set("uuid", uuids); + white.save(whitelist); + MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindSuccess); + } catch (IOException ex) { + MiraiBot.getBot(e.getBotID()).getGroup(e.getGroupID()).sendMessage(BOT_Messages_BindFailedSelfdata); + throw new RuntimeException(ex); + } + + } } } } @EventHandler public void onGroupQuit(MiraiMemberLeaveEvent e) { - if (BOT_UsedBotAccounts.contains(e.getBotID()) && BOT_UsedGroupAccounts.contains(e.getGroupID()) && BOT_RemoveBindWhenQQQuit) { + if (!GEN_UseSelfData && BOT_UsedBotAccounts.contains(e.getBotID()) && BOT_UsedGroupAccounts.contains(e.getGroupID()) && BOT_RemoveBindWhenQQQuit) { MiraiMC.removeBind(e.getTargetID()); } } @@ -208,19 +316,51 @@ public class AsyncCheckBind implements Runnable { @Override public void run() { if(cache.size() > 0) { - for(Player player : cache.keySet()){ - if(MiraiMC.getBind(player.getUniqueId()) != 0) { - cache.remove(player); - if(GEN_CheckRange_SPEC) { - new BukkitRunnable() { - @Override - public void run() { - player.setGameMode(Bukkit.getDefaultGameMode()); + for(Player player : cache){ + if(!GEN_UseSelfData){ + if(MiraiMC.getBind(player.getUniqueId()) != 0) { + cache.remove(player); + if(GEN_CheckRange_SPEC) { + new BukkitRunnable() { + @Override + public void run() { + player.setGameMode(Bukkit.getDefaultGameMode()); + } + }.runTask(plugin); + } + player.sendMessage(ChatColor.translateAlternateColorCodes('&',GEN_BindSuccessMessage)); + } else player.sendMessage(ChatColor.translateAlternateColorCodes('&',GEN_NotifyMessage)); + } else { + YamlConfiguration white = YamlConfiguration.loadConfiguration(whitelist); + if(GEN_UsePlayerName){ + List names = white.getStringList("name"); + if(names.contains(player.getName())){ + cache.remove(player); + if(GEN_CheckRange_SPEC) { + new BukkitRunnable() { + @Override + public void run() { + player.setGameMode(Bukkit.getDefaultGameMode()); + } + }.runTask(plugin); } - }.runTask(plugin); + player.sendMessage(ChatColor.translateAlternateColorCodes('&',GEN_BindSuccessMessage)); + } + } else { + List uuids = white.getStringList("uuid"); + if(uuids.contains(player.getUniqueId().toString())){ + cache.remove(player); + if(GEN_CheckRange_SPEC) { + new BukkitRunnable() { + @Override + public void run() { + player.setGameMode(Bukkit.getDefaultGameMode()); + } + }.runTask(plugin); + } + } } - player.sendMessage(ChatColor.translateAlternateColorCodes('&',GEN_BindSuccessMessage)); - } else player.sendMessage(ChatColor.translateAlternateColorCodes('&',GEN_NotifyMessage)); + } } } } diff --git a/src/main/java/me/dreamvoid/whitelist4qq/bukkit/Config.java b/src/main/java/me/dreamvoid/whitelist4qq/bukkit/Config.java index 9259986..73ab2c3 100644 --- a/src/main/java/me/dreamvoid/whitelist4qq/bukkit/Config.java +++ b/src/main/java/me/dreamvoid/whitelist4qq/bukkit/Config.java @@ -16,6 +16,8 @@ public class Config { public static String GEN_KickMessage; public static String GEN_NotifyMessage; public static String GEN_BindSuccessMessage; + public static boolean GEN_UseSelfData; + public static boolean GEN_UsePlayerName; public static List BOT_UsedBotAccounts; public static List BOT_UsedGroupAccounts; @@ -25,6 +27,7 @@ public class Config { public static String BOT_BindCommandPrefix; public static String BOT_Messages_BindSuccess; public static String BOT_Messages_BindFailed; + public static String BOT_Messages_BindFailedSelfdata; Config(BukkitPlugin plugin) { this.plugin = plugin; @@ -43,6 +46,8 @@ public void loadConfig() { GEN_KickMessage = config.getString("general.kick-message", ""); GEN_NotifyMessage = config.getString("general.notify-message", ""); GEN_BindSuccessMessage = config.getString("general.bind-success-message", ""); + GEN_UseSelfData = config.getBoolean("general.use-self-data", false); + GEN_UsePlayerName = config.getBoolean("general.use-player-name", false); BOT_UsedBotAccounts = config.getLongList("bot.used-bot-accounts"); BOT_UsedGroupAccounts = config.getLongList("bot.used-group-numbers"); @@ -52,5 +57,6 @@ public void loadConfig() { BOT_BindCommandPrefix = config.getString("bot.bind-command-prefix"); BOT_Messages_BindSuccess = config.getString("bot.messages.bind-success"); BOT_Messages_BindFailed = config.getString("bot.messages.bind-failed"); + BOT_Messages_BindFailedSelfdata = config.getString("bot.messages.bind-failed-selfdata"); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2504212..5495d3e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -48,6 +48,13 @@ general: # 验证成功提示 bind-success-message: "&a你成功获取了白名单,现在可以正常游玩服务器了!" + + # 是否不使用MiraiMC的数据库而改为插件自存储 + use-self-data: false + + # 是否使用玩家名存储数据而非UUID + # 由于MiraiMC特性,此项只会在use-self-data为true时生效 + use-player-name: false # 机器人配置 bot: @@ -88,7 +95,13 @@ bot: # 绑定失败 # 无论绑定失败的原因是什么,都只会发这一条 - # 可用变量:%id% - QQ绑定的ID + # 可用变量:%id% - QQ绑定的ID(use-self-data为true时不可用) bind-failed: |- 绑定失败,此ID可能已经绑定另一个QQ,或你的QQ已经绑定了一个ID,请联系管理员处理! 此QQ绑定的ID:%id% + + # 由于数据库原因绑定失败 + # 只会出现在use-self-data为true时 + bind-failed-selfdata: |- + 绑定失败,在保存白名单文件时出现异常! + 请联系管理员查看控制台处理! diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f7f6d19..6f943a1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -16,9 +16,18 @@ commands: - qwhitelist - qwl permissions: - whitelist4qq.command.whitelist4qq: - description: Allow use /whitelist4qq - default: true - whitelist4qq.command.whitelist4qq.reload: + whitelist4qq.*: default: op - escription: Allow use /whitelist4qq reload + children: + whitelist4qq.command.*: + default: op + children: + whitelist4qq.command.whitelist4qq: + description: Allow use /whitelist4qq + default: true + whitelist4qq.command.whitelist4qq.reload: + default: op + description: Allow use /whitelist4qq reload + whitelist4qq.command.whitelist4qq.remove: + default: op + description: Allow use /whitelist4qq remove