From ff9164714c4d9f3a55f24cd47215c5a0f89b2242 Mon Sep 17 00:00:00 2001 From: StevenLawson Date: Fri, 19 Sep 2014 19:59:29 -0400 Subject: [PATCH] Restructured /saconfig. Resolves #322. Resolves #303. --- .../Commands/Command_saconfig.java | 374 +++++++++++------- .../TotalFreedomMod/TFM_Admin.java | 5 + 2 files changed, 226 insertions(+), 153 deletions(-) diff --git a/src/me/StevenLawson/TotalFreedomMod/Commands/Command_saconfig.java b/src/me/StevenLawson/TotalFreedomMod/Commands/Command_saconfig.java index 95fe139..1ea3b12 100644 --- a/src/me/StevenLawson/TotalFreedomMod/Commands/Command_saconfig.java +++ b/src/me/StevenLawson/TotalFreedomMod/Commands/Command_saconfig.java @@ -14,206 +14,274 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = AdminLevel.OP, source = SourceType.BOTH) -@CommandParameters(description = "Manage superadmins.", - usage = "/ >") +@CommandParameters(description = "Manage superadmins.", usage = "/ >") public class Command_saconfig extends TFM_Command { @Override public boolean run(CommandSender sender, Player sender_p, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { - if (args.length == 0 || args.length > 2) + final SAConfigMode mode; + try { + mode = SAConfigMode.findMode(args, sender, senderIsConsole); + } + catch (final PermissionsException ex) + { + playerMsg(ex.getMessage()); + return true; + } + catch (final FormatException ex) + { + playerMsg(ex.getMessage()); return false; } - if (args.length == 1) + switch (mode) { - if (args[0].equals("list")) + case LIST: { playerMsg("Superadmins: " + StringUtils.join(TFM_AdminList.getSuperNames(), ", "), ChatColor.GOLD); - return true; + + break; } - - if (args[0].equals("clean")) + case CLEAN: { - if (!TFM_AdminList.isSeniorAdmin(sender, true)) - { - playerMsg(TFM_Command.MSG_NO_PERMS); - return true; - } - TFM_Util.adminAction(sender.getName(), "Cleaning superadmin list", true); TFM_AdminList.cleanSuperadminList(true); playerMsg("Superadmins: " + StringUtils.join(TFM_AdminList.getSuperNames(), ", "), ChatColor.YELLOW); - return true; + + break; } - } - - // All commands below are superadmin+ commands. - if (!TFM_AdminList.isSuperAdmin(sender)) - { - playerMsg(TFM_Command.MSG_NO_PERMS); - return true; - } - - if (args[0].equals("clearme")) - { - if (senderIsConsole) + case CLEARME: { - playerMsg(TFM_Command.NOT_FROM_CONSOLE); - return true; - } + final TFM_Admin admin = TFM_AdminList.getEntry(sender_p); - final TFM_Admin admin = TFM_AdminList.getEntry(sender_p); + final String ip = TFM_Util.getIp(sender_p); - final String ip = TFM_Util.getIp(sender_p); - - if (args.length == 1) - { - TFM_Util.adminAction(sender.getName(), "Cleaning my supered IPs", true); - - int counter = 0; - for (int i = 0; i < admin.getIps().size(); i++) + if (args.length == 1) { - if (admin.getIps().get(i).equals(ip)) + TFM_Util.adminAction(sender.getName(), "Cleaning my supered IPs", true); + + int counter = admin.getIps().size() - 1; + admin.clearIPs(); + admin.addIp(ip); + + TFM_AdminList.saveAll(); + + playerMsg(counter + " IPs removed."); + playerMsg(admin.getIps().get(0) + " is now your only IP address"); + } + else + { + if (!admin.getIps().contains(args[1])) { - continue; + playerMsg("That IP is not registered to you."); } + else if (ip.equals(args[1])) + { + playerMsg("You cannot remove your current IP."); + } + else + { + TFM_Util.adminAction(sender.getName(), "Removing a supered IP", true); - admin.removeIp(admin.getIps().get(i)); - counter++; + admin.removeIp(args[1]); + + TFM_AdminList.saveAll(); + + playerMsg("Removed IP " + args[1]); + playerMsg("Current IPs: " + StringUtils.join(admin.getIps(), ", ")); + } } - TFM_AdminList.saveAll(); - - playerMsg(counter + " IPs removed."); - playerMsg(admin.getIps().get(0) + " is now your only IP address"); - return true; + break; } - - // args.length == 2 - if (!admin.getIps().contains(args[1])) + case INFO: { - playerMsg("That IP is not registered to you."); - return true; - } - - if (ip.equals(args[1])) - { - playerMsg("You cannot remove your current IP."); - return true; - } - - TFM_Util.adminAction(sender.getName(), "Removing a supered IP", true); - - admin.removeIp(args[1]); - TFM_AdminList.saveAll(); - - playerMsg("Removed IP " + args[1]); - playerMsg("Current IPs: " + StringUtils.join(admin.getIps(), ", ")); - return true; - } - - if (args[0].equals("info")) - { - - TFM_Admin superadmin = TFM_AdminList.getEntry(args[1].toLowerCase()); - - if (superadmin == null) - { - - final Player player = getPlayer(args[1]); - - if (player != null) - { - superadmin = TFM_AdminList.getEntry(player.getName().toLowerCase()); - } - } - - if (superadmin == null) - { - playerMsg("Superadmin not found: " + args[1]); - return true; - } - - playerMsg(superadmin.toString()); - return true; - } - - if (!senderIsConsole) - { - playerMsg("This command may only be used from the console."); - return true; - } - - if (args[0].equals("add")) - { - OfflinePlayer player = getPlayer(args[1]); - - if (player == null) - { - final TFM_Admin superadmin = TFM_AdminList.getEntry(args[1]); + TFM_Admin superadmin = TFM_AdminList.getEntry(args[1].toLowerCase()); if (superadmin == null) { - playerMsg(TFM_Command.PLAYER_NOT_FOUND); + final Player player = getPlayer(args[1]); + if (player != null) + { + superadmin = TFM_AdminList.getEntry(player.getName().toLowerCase()); + } + } + + if (superadmin == null) + { + playerMsg("Superadmin not found: " + args[1]); + } + else + { + playerMsg(superadmin.toString()); + } + + break; + } + case ADD: + { + OfflinePlayer player = getPlayer(args[1], true); // Exact case-insensitive match. + + if (player == null) + { + final TFM_Admin superadmin = TFM_AdminList.getEntry(args[1]); + + if (superadmin == null) + { + playerMsg(TFM_Command.PLAYER_NOT_FOUND); + return true; + } + + player = me.StevenLawson.TotalFreedomMod.TFM_DepreciationAggregator.getOfflinePlayer(server, superadmin.getLastLoginName()); + } + + TFM_Util.adminAction(sender.getName(), "Adding " + player.getName() + " to the superadmin list", true); + TFM_AdminList.addSuperadmin(player); + + if (player.isOnline()) + { + final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player.getPlayer()); + + if (playerdata.isFrozen()) + { + playerdata.setFrozen(false); + playerMsg(player.getPlayer(), "You have been unfrozen."); + } + } + + break; + } + case DELETE: + { + String targetName = args[1]; + + final Player player = getPlayer(targetName, true); // Exact case-insensitive match. + + if (player != null) + { + targetName = player.getName(); + } + + if (!TFM_AdminList.getLowerSuperNames().contains(targetName.toLowerCase())) + { + playerMsg("Superadmin not found: " + targetName); return true; } - player = me.StevenLawson.TotalFreedomMod.TFM_DepreciationAggregator.getOfflinePlayer(server, superadmin.getLastLoginName()); + TFM_Util.adminAction(sender.getName(), "Removing " + targetName + " from the superadmin list", true); + TFM_AdminList.removeSuperadmin(me.StevenLawson.TotalFreedomMod.TFM_DepreciationAggregator.getOfflinePlayer(server, targetName)); + + // Twitterbot + if (TFM_ConfigEntry.TWITTERBOT_ENABLED.getBoolean()) + { + TFM_TwitterHandler.delTwitterVerbose(targetName, sender); + } + + break; + } + } + + return true; + } + + private static enum SAConfigMode + { + LIST("list", AdminLevel.OP, SourceType.BOTH, 1, 1), + CLEAN("clean", AdminLevel.SENIOR, SourceType.BOTH, 1, 1), + CLEARME("clearme", AdminLevel.SUPER, SourceType.ONLY_IN_GAME, 1, 2), + INFO("info", AdminLevel.SUPER, SourceType.BOTH, 2, 2), + ADD("add", AdminLevel.SUPER, SourceType.ONLY_CONSOLE, 2, 2), + DELETE("delete", AdminLevel.SENIOR, SourceType.ONLY_CONSOLE, 2, 2); + + private final String modeName; + private final AdminLevel adminLevel; + private final SourceType sourceType; + private final int minArgs; + private final int maxArgs; + + private SAConfigMode(String modeName, AdminLevel adminLevel, SourceType sourceType, int minArgs, int maxArgs) + { + this.modeName = modeName; + this.adminLevel = adminLevel; + this.sourceType = sourceType; + this.minArgs = minArgs; + this.maxArgs = maxArgs; + } + + private static SAConfigMode findMode(final String[] args, final CommandSender sender, final boolean senderIsConsole) throws PermissionsException, FormatException + { + if (args.length == 0) + { + throw new FormatException("Invalid number of arguments."); } - TFM_Util.adminAction(sender.getName(), "Adding " + player.getName() + " to the superadmin list", true); - TFM_AdminList.addSuperadmin(player); + boolean isSuperAdmin = TFM_AdminList.isSuperAdmin(sender); + boolean isSeniorAdmin = isSuperAdmin ? TFM_AdminList.isSeniorAdmin(sender, false) : false; - if (player.isOnline()) + for (final SAConfigMode mode : values()) { - final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player.getPlayer()); - - if (playerdata.isFrozen()) + if (mode.modeName.equalsIgnoreCase(args[0])) { - playerdata.setFrozen(false); - playerMsg(player.getPlayer(), "You have been unfrozen."); + if (mode.adminLevel == AdminLevel.SUPER) + { + if (!isSuperAdmin) + { + throw new PermissionsException(TFM_Command.MSG_NO_PERMS); + } + } + else if (mode.adminLevel == AdminLevel.SENIOR) + { + if (!isSeniorAdmin) + { + throw new PermissionsException(TFM_Command.MSG_NO_PERMS); + } + } + + if (mode.sourceType == SourceType.ONLY_IN_GAME) + { + if (senderIsConsole) + { + throw new PermissionsException("This command may only be used in-game."); + } + } + else if (mode.sourceType == SourceType.ONLY_CONSOLE) + { + if (!senderIsConsole) + { + throw new PermissionsException("This command may only be used from the console."); + } + } + + if (args.length >= mode.minArgs && args.length <= mode.maxArgs) + { + return mode; + } + else + { + throw new FormatException("Invalid number of arguments for mode: " + mode.modeName); + } } } - return true; + throw new FormatException("Invalid mode."); } + } - if ("delete".equals(args[0])) + private static class PermissionsException extends Exception + { + public PermissionsException(final String message) { - if (!TFM_AdminList.isSeniorAdmin(sender)) - { - playerMsg(TFM_Command.MSG_NO_PERMS); - return true; - } - - String targetName = args[1]; - - final Player player = getPlayer(targetName); - - if (player != null) - { - targetName = player.getName(); - } - - if (!TFM_AdminList.getLowerSuperNames().contains(targetName.toLowerCase())) - { - playerMsg("Superadmin not found: " + targetName); - return true; - } - - TFM_Util.adminAction(sender.getName(), "Removing " + targetName + " from the superadmin list", true); - TFM_AdminList.removeSuperadmin(me.StevenLawson.TotalFreedomMod.TFM_DepreciationAggregator.getOfflinePlayer(server, targetName)); - - // Twitterbot - if (TFM_ConfigEntry.TWITTERBOT_ENABLED.getBoolean()) - { - TFM_TwitterHandler.delTwitterVerbose(targetName, sender); - } - return true; + super(message); } - return false; + } + private static class FormatException extends Exception + { + public FormatException(final String message) + { + super(message); + } } } diff --git a/src/me/StevenLawson/TotalFreedomMod/TFM_Admin.java b/src/me/StevenLawson/TotalFreedomMod/TFM_Admin.java index ecbed26..be097f9 100644 --- a/src/me/StevenLawson/TotalFreedomMod/TFM_Admin.java +++ b/src/me/StevenLawson/TotalFreedomMod/TFM_Admin.java @@ -108,6 +108,11 @@ public class TFM_Admin } } + public void clearIPs() + { + ips.clear(); + } + public Date getLastLogin() { return lastLogin;