diff --git a/src/me/StevenLawson/TotalFreedomMod/Commands/Command_adminworld.java b/src/me/StevenLawson/TotalFreedomMod/Commands/Command_adminworld.java index 5650c68b..ccf0057c 100644 --- a/src/me/StevenLawson/TotalFreedomMod/Commands/Command_adminworld.java +++ b/src/me/StevenLawson/TotalFreedomMod/Commands/Command_adminworld.java @@ -10,7 +10,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = AdminLevel.OP, source = SourceType.ONLY_IN_GAME) -@CommandParameters(description = "Go to the AdminWorld.", usage = "/ [guest < list | add | remove > | time ]") +@CommandParameters(description = "Go to the AdminWorld.", usage = "/ [guest < list | purge | add | remove > | time | weather ]") public class Command_adminworld extends TFM_Command { private enum CommandMode @@ -48,105 +48,150 @@ public class Command_adminworld extends TFM_Command return false; } - switch (commandMode) + try { - case TELEPORT: + switch (commandMode) { -// /adminworld - World adminWorld = null; - try + case TELEPORT: { - adminWorld = TFM_AdminWorld.getInstance().getWorld(); - } - catch (Exception ex) - { - } - - if (adminWorld == null || sender_p.getWorld() == adminWorld) - { - playerMsg("Going to the main world."); - sender_p.teleport(server.getWorlds().get(0).getSpawnLocation()); - } - else - { - playerMsg("Going to the AdminWorld."); - TFM_AdminWorld.getInstance().sendToWorld(sender_p); - } - - break; - } - case GUEST: - { -// /adminworld guest list -// /adminworld guest add -// /adminworld guest remove - if (args.length == 2) - { - if ("list".equalsIgnoreCase(args[1])) + World adminWorld = null; + try { - //list + adminWorld = TFM_AdminWorld.getInstance().getWorld(); } - } - else if (args.length == 3) - { - if (!(sender instanceof Player) || sender_p == null || !TFM_SuperadminList.isUserSuperadmin(sender)) + catch (Exception ex) { - sender.sendMessage(TotalFreedomMod.MSG_NO_PERMS); - return true; } - if ("add".equalsIgnoreCase(args[1])) + if (adminWorld == null || sender_p.getWorld() == adminWorld) { - //add args[2] + playerMsg("Going to the main world."); + sender_p.teleport(server.getWorlds().get(0).getSpawnLocation()); } - else if (TFM_Util.isRemoveCommand(args[1])) + else { - //remove args[2] + playerMsg("Going to the AdminWorld."); + TFM_AdminWorld.getInstance().sendToWorld(sender_p); } + + break; } - - break; - } - case TIME: - { -// /adminworld time - - if (!(sender instanceof Player) || sender_p == null || !TFM_SuperadminList.isUserSuperadmin(sender)) + case GUEST: { - sender.sendMessage(TotalFreedomMod.MSG_NO_PERMS); - return true; - } + if (args.length == 2) + { + if ("list".equalsIgnoreCase(args[1])) + { + playerMsg("AdminWorld Guest List: " + TFM_AdminWorld.getInstance().guestListToString()); + } + else if ("purge".equalsIgnoreCase(args[1])) + { + assertCommandPerms(sender, sender_p); + TFM_AdminWorld.getInstance().purgeGuestList(); + playerMsg("AdminWorld guest list purged."); + } + else + { + return false; + } + } + else if (args.length == 3) + { + assertCommandPerms(sender, sender_p); - if (args.length == 2) + if ("add".equalsIgnoreCase(args[1])) + { + try + { + TFM_AdminWorld.getInstance().addGuest(getPlayer(args[2]), sender_p); + } + catch (PlayerNotFoundException ex) + { + sender.sendMessage(ex.getMessage()); + return true; + } + } + else if (TFM_Util.isRemoveCommand(args[1])) + { + Player player = TFM_AdminWorld.getInstance().removeGuest(args[2]); + if (player != null) + { + playerMsg("Guest removed: " + player.getName()); + } + else + { + playerMsg("Can't find guest entry for: " + args[2]); + } + } + else + { + return false; + } + } + + break; + } + case TIME: { - //set time = args[1] + assertCommandPerms(sender, sender_p); + + if (args.length == 2) + { + //set time = args[1] : + + playerMsg("Feature not implemented."); + } + else + { + return false; + } + + break; } - - break; - } - case WEATHER: - { -// /adminworld weather - - if (!(sender instanceof Player) || sender_p == null || !TFM_SuperadminList.isUserSuperadmin(sender)) + case WEATHER: { - sender.sendMessage(TotalFreedomMod.MSG_NO_PERMS); - return true; - } + assertCommandPerms(sender, sender_p); - if (args.length == 2) + if (args.length == 2) + { + //set weather = args[1] : + + playerMsg("Feature not implemented."); + } + else + { + return false; + } + + break; + } + default: { - //set weather = args[1] + return false; } - - break; - } - default: - { - return false; } } + catch (PermissionDeniedException ex) + { + sender.sendMessage(ex.getMessage()); + } return true; } + + private void assertCommandPerms(CommandSender sender, Player sender_p) throws PermissionDeniedException + { + if (!(sender instanceof Player) || sender_p == null || !TFM_SuperadminList.isUserSuperadmin(sender)) + { + throw new PermissionDeniedException(TotalFreedomMod.MSG_NO_PERMS); + } + } + + private class PermissionDeniedException extends Exception + { + public PermissionDeniedException(String string) + { + super(string); + } + } } diff --git a/src/me/StevenLawson/TotalFreedomMod/TFM_AdminWorld.java b/src/me/StevenLawson/TotalFreedomMod/TFM_AdminWorld.java index eb7e2188..8a0a295f 100644 --- a/src/me/StevenLawson/TotalFreedomMod/TFM_AdminWorld.java +++ b/src/me/StevenLawson/TotalFreedomMod/TFM_AdminWorld.java @@ -1,7 +1,11 @@ package me.StevenLawson.TotalFreedomMod; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; +import org.apache.commons.lang3.StringUtils; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -75,12 +79,50 @@ public final class TFM_AdminWorld extends TFM_CustomWorld if (TFM_SuperadminList.isUserSuperadmin(supervisor)) { guestList.put(guest, supervisor); + wipeAccessCache(); } } - public void removeGuest(Player guest) + public Player removeGuest(Player guest) { - guestList.remove(guest); + Player player = guestList.remove(guest); + wipeAccessCache(); + return player; + } + + public Player removeGuest(String partialName) + { + partialName = partialName.toLowerCase().trim(); + Iterator it = guestList.values().iterator(); + while (it.hasNext()) + { + Player player = it.next(); + if (player.getName().toLowerCase().trim().contains(partialName)) + { + return removeGuest(player); + } + } + return null; + } + + public String guestListToString() + { + List output = new ArrayList(); + Iterator> it = guestList.entrySet().iterator(); + while (it.hasNext()) + { + Map.Entry entry = it.next(); + Player player = entry.getKey(); + Player supervisor = entry.getValue(); + output.add(player.getName() + " (Supervisor: " + supervisor.getName() + ")"); + } + return StringUtils.join(output, ", "); + } + + public void purgeGuestList() + { + guestList.clear(); + wipeAccessCache(); } public boolean validateMovement(PlayerMoveEvent event) @@ -129,7 +171,7 @@ public final class TFM_AdminWorld extends TFM_CustomWorld accessCache.clear(); } - public boolean canAccessWorld(Player player) + public boolean canAccessWorld(final Player player) { long currentTimeMillis = System.currentTimeMillis(); if (cacheLastCleared == null || cacheLastCleared.longValue() + CACHE_CLEAR_FREQUENCY <= currentTimeMillis) @@ -146,6 +188,10 @@ public final class TFM_AdminWorld extends TFM_CustomWorld { Player supervisor = guestList.get(player); canAccess = supervisor != null && supervisor.isOnline() && TFM_SuperadminList.isUserSuperadmin(supervisor); + if (!canAccess) + { + guestList.remove(player); + } } cached = canAccess; accessCache.put(player, cached);