package net.obnoxint.mcdev.omclib; import java.util.Map; import java.util.TreeMap; import net.obnoxint.mcdev.omclib.command.DebugCommandHandler; import net.obnoxint.mcdev.omclib.command.FeatureCommandHandler; import net.obnoxint.mcdev.omclib.command.OmcCommandHandler; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.permissions.Permission; final class OmcCommandExecutor implements CommandExecutor { private enum DefaultHandler { DEBUG(DebugCommandHandler.class), FEATURE(FeatureCommandHandler.class); private final Class<? extends OmcCommandHandler> clazz; private DefaultHandler(final Class<? extends OmcCommandHandler> clazz) { this.clazz = clazz; } } private final Map<String, OmcCommandHandler> handlers = new TreeMap<>(); OmcCommandExecutor() { for (final DefaultHandler h : DefaultHandler.values()) { try { addHandler(h.clazz.newInstance()); } catch (InstantiationException | IllegalAccessException e) {} } } public void addHandler(final OmcCommandHandler handler) { final String id = handler.getId(); if (!handlers.containsKey(id)) { handlers.put(id, handler); } } public Map<String, OmcCommandHandler> getHandlers() { return new TreeMap<>(handlers); } @Override public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args) { final Permission perm = OmcLibPermission.COMMAND.getPermission(); if (sender.hasPermission(perm)) { if (args.length == 0) { final StringBuilder sb = new StringBuilder("Available commands:"); for (final String s : handlers.keySet()) { sb.append(" " + s); } sender.sendMessage(sb.toString()); } else { final String id = args[0].toLowerCase(); if (handlers.containsKey(id)) { final String[] args2 = new String[args.length - 1]; if (args2.length > 0) { System.arraycopy(args, 1, args2, 0, args2.length); } final OmcCommandHandler h = handlers.get(id); final boolean r = h.handleCommand(sender, args2); if (!r) { sender.sendMessage(id + " " + h.getUsage()); } } else { sender.sendMessage("Handler not available: " + id); } } } else { sender.sendMessage("Permission required: " + perm.getName()); } return true; } }