package de.tobiyas.racesandclasses.commands; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import de.tobiyas.racesandclasses.RacesAndClasses; public abstract class AbstractCommand implements CommandInterface { /** * The Command names to check. */ protected final Collection<String> commandNames = new HashSet<String>(); /** * The Aliases to use for the Command */ protected final Collection<String> aliases = new HashSet<String>(); /** * THe plugin to use for post stuff. */ protected final RacesAndClasses plugin = RacesAndClasses.getPlugin(); /** * the Description of the Command. */ protected String description = "No description provided."; public AbstractCommand(String commandName) { this.commandNames.add(commandName); } public AbstractCommand(String commandName, String... aliases) { this.commandNames.add(commandName); this.aliases.addAll(Arrays.asList(aliases)); } /** * Returns the CommandName */ @Override public Collection<String> getCommandNames(){ return commandNames; } /** * Returns the aliases */ @Override public String[] getAliases(){ return aliases.toArray(new String[aliases.size()]); } /** * if the Command has aliases. * @return */ @Override public boolean hasAliases(){ return aliases != null && aliases.size() > 0; } @Override public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) { //stub method to not having to override in every impl. return new LinkedList<String>(); } @Override public final boolean onCommand(CommandSender sender, Command command, String label, String[] args) { try{ return onInternalCommand(sender, command, label, args); }catch(Throwable exp){ plugin.getDebugLogger().logStackTrace("Error on command '" + label + "' for '" + sender.getName() + "' args: '" + StringUtils.join(args, " ") + "'", exp); return true; } } /** * Command to override. */ protected abstract boolean onInternalCommand(CommandSender sender, Command command, String label, String[] args); @Override public void filterToDisabledCommands(Collection<String> disabled) { for(String name : disabled){ //filter aliases: Iterator<String> it = aliases.iterator(); while(it.hasNext()) { if(name.equalsIgnoreCase(it.next())) { it.remove(); } } //filter commands: it = commandNames.iterator(); while(it.hasNext()){ if(name.equalsIgnoreCase(it.next())){ it.remove(); } } } } @Override public boolean hasAnyCommand() { return !commandNames.isEmpty(); } @Override public String getDescription() { return description; } @Override public void applyRemapping(Map<String, String> remaps) { for(String key : remaps.keySet()){ String replacement = remaps.get(key); for(String command : commandNames){ if(command.equalsIgnoreCase(key)){ commandNames.remove(command); commandNames.add(replacement); break; } } for(String alias : aliases){ if(alias.equalsIgnoreCase(key)){ aliases.remove(alias); aliases.add(replacement); break; } } } } }