/* * Copyright (C) 2013-2016 Gonçalo Baltazar <me@goncalomb.com> * * This file is part of NBTEditor. * * NBTEditor is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * NBTEditor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NBTEditor. If not, see <http://www.gnu.org/licenses/>. */ package com.goncalomb.bukkit.mylib.command; import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; import com.goncalomb.bukkit.mylib.reflect.BukkitReflect; public final class MyCommandManager { public static void register(MyCommand command, Plugin plugin) { if (command.getOwner() != null) { throw new RuntimeException("Command " + command.getName() + " already registered by " + command.getOwner().getName() + "."); } // Process methods. HashMap<String, Method> tabMethods = new HashMap<String, Method>(); Method[] methods = command.getClass().getDeclaredMethods(); // Find all tab completion methods. for (Method method : methods) { MyCommand.TabComplete config = method.getAnnotation(MyCommand.TabComplete.class); if (config != null) { // Verify parameter types. Class<?>[] params = method.getParameterTypes(); if (params.length == 2 && method.getReturnType() == List.class && params[0] == CommandSender.class && params[1] == String[].class) { tabMethods.put(config.args().trim().toLowerCase(), method); } else { throw new RuntimeException("Invalid command tab completion method " + method.getName() + " on class " + command.getClass().getName() + "."); } } } // Find all execution methods. for (Method method : methods) { MyCommand.Command config = method.getAnnotation(MyCommand.Command.class); if (config != null) { // Verify parameter types. Class<?>[] params = method.getParameterTypes(); if (params.length == 2 && method.getReturnType() == boolean.class && params[0] == CommandSender.class && params[1] == String[].class) { String argsString = config.args().trim().toLowerCase(); String[] args = argsString.split("\\s+"); args = (args.length == 1 && args[0].isEmpty() ? new String[0] : args); // Register the (Sub-)Command. if(!command.addSubCommand(args, 0, config, command, method, tabMethods.remove(argsString))) { throw new RuntimeException("(Sub-)Command '" + command.getName() + " " + argsString + "' already registered."); } continue; } throw new RuntimeException("Invalid command execution method " + method.getName() + " on class " + command.getClass().getName() + "."); } } if (tabMethods.size() > 0) { throw new RuntimeException("Tab completion method " + tabMethods.get(0).getName() + " on class " + command.getClass().getName() + " has no execution method."); } command.setup(BukkitReflect.getCommandMap(), plugin); } public static boolean isVanillaCommand(String name) { Command mineCommand = BukkitReflect.getCommandMap().getCommand("minecraft:" + name); if (mineCommand != null) { Command command = BukkitReflect.getCommandMap().getCommand(name); return (mineCommand == command); } return false; } }