package net.aufdemrand.denizen.scripts.commands.server; import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizencore.exceptions.CommandExecutionException; import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException; import net.aufdemrand.denizencore.objects.Duration; import net.aufdemrand.denizencore.objects.Element; import net.aufdemrand.denizencore.objects.aH; import net.aufdemrand.denizencore.objects.dList; import net.aufdemrand.denizencore.scripts.ScriptEntry; import net.aufdemrand.denizencore.scripts.commands.AbstractCommand; import org.bukkit.BanList; import org.bukkit.Bukkit; import java.util.Date; import java.util.List; public class BanCommand extends AbstractCommand { public enum Actions { ADD, REMOVE } @Override public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { for (aH.Argument arg : aH.interpret(scriptEntry.getArguments())) { if (!scriptEntry.hasObject("action") && (arg.matchesPrefix("action") || arg.matchesEnum(Actions.values()))) { scriptEntry.addObject("action", arg.asElement()); } else if (!scriptEntry.hasObject("targets") && (arg.matchesPrefix("targets", "target") || arg.matchesArgumentList(dPlayer.class))) { scriptEntry.addObject("targets", arg.asType(dList.class).filter(dPlayer.class)); } else if (!scriptEntry.hasObject("reason") && arg.matchesPrefix("reason")) { scriptEntry.addObject("reason", arg.asElement()); } else if (!scriptEntry.hasObject("duration") && (arg.matchesPrefix("duration", "time", "d", "expiration") || arg.matchesArgumentType(Duration.class))) { scriptEntry.addObject("duration", arg.asType(Duration.class)); } else { arg.reportUnhandled(); } } scriptEntry.defaultObject("action", new Element("add")) .defaultObject("reason", new Element("Banned.")); if (Actions.valueOf(scriptEntry.getObject("action").toString().toUpperCase()) == null) { throw new IllegalArgumentException("Invalid action specified."); } if (!scriptEntry.hasObject("targets") || ((List<dPlayer>) scriptEntry.getObject("targets")).isEmpty()) { throw new IllegalArgumentException("Must specify a valid target!"); } } @Override public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { Element action = scriptEntry.getElement("action"); List<dPlayer> targets = (List<dPlayer>) scriptEntry.getObject("targets"); Element reason = scriptEntry.getElement("reason"); Duration duration = scriptEntry.getdObject("duration"); Date expiration = null; if (duration != null && duration.getTicks() != 0) { expiration = new Date(new Duration(System.currentTimeMillis() / 50 + duration.getTicks()).getTicks() * 50); } dB.report(scriptEntry, getName(), action.debug() + aH.debugObj("targets", targets) + reason.debug() + (duration != null ? duration.debug() : "")); Actions banAction = Actions.valueOf(action.toString().toUpperCase()); switch (banAction) { case ADD: for (dPlayer player : targets) { if (player.isValid()) { Bukkit.getBanList(BanList.Type.NAME).addBan(player.getName(), reason.toString(), expiration, null); if (player.isOnline()) { player.getPlayerEntity().kickPlayer(reason.toString()); } } } break; case REMOVE: for (dPlayer player : targets) { if (player.isValid()) { if (player.getOfflinePlayer().isBanned()) { Bukkit.getBanList(BanList.Type.NAME).pardon(player.getName()); } } } break; } } }