geforkt von Mirrors/FastAsyncWorldEdit
Added a registration method that returns information about successfully registered commands
Dieser Commit ist enthalten in:
Ursprung
256897f473
Commit
c29856f5a8
@ -27,7 +27,6 @@ import java.util.logging.Level;
|
|||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import com.sk89q.util.StringUtil;
|
import com.sk89q.util.StringUtil;
|
||||||
import static com.sk89q.util.ArrayUtil.removePortionOfArray;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Manager for handling commands. This allows you to easily process commands,
|
* <p>Manager for handling commands. This allows you to easily process commands,
|
||||||
@ -103,21 +102,38 @@ public abstract class CommandsManager<T> {
|
|||||||
registerMethods(cls, null);
|
registerMethods(cls, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register an class that contains commands (denoted by {@link Command}.
|
||||||
|
* If no dependency injector is specified, then the methods of the
|
||||||
|
* class will be registered to be called statically. Otherwise, new
|
||||||
|
* instances will be created of the command classes and methods will
|
||||||
|
* not be called statically. A List of {@link Command} annotations from
|
||||||
|
* registered commands is returned.
|
||||||
|
*
|
||||||
|
* @param cls
|
||||||
|
* @return A List of {@link Command} annotations from registered commands,
|
||||||
|
* for use in eg. a dynamic command registration system.
|
||||||
|
*/
|
||||||
|
public List<Command> registerAndReturn(Class<?> cls) {
|
||||||
|
return registerMethods(cls, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register the methods of a class. This will automatically construct
|
* Register the methods of a class. This will automatically construct
|
||||||
* instances as necessary.
|
* instances as necessary.
|
||||||
*
|
*
|
||||||
* @param cls
|
* @param cls
|
||||||
* @param parent
|
* @param parent
|
||||||
|
* @return Commands Registered
|
||||||
*/
|
*/
|
||||||
private void registerMethods(Class<?> cls, Method parent) {
|
private List<Command> registerMethods(Class<?> cls, Method parent) {
|
||||||
try {
|
try {
|
||||||
if (getInjector() == null) {
|
if (getInjector() == null) {
|
||||||
registerMethods(cls, parent, null);
|
return registerMethods(cls, parent, null);
|
||||||
} else {
|
} else {
|
||||||
Object obj = null;
|
Object obj = null;
|
||||||
obj = getInjector().getInstance(cls);
|
obj = getInjector().getInstance(cls);
|
||||||
registerMethods(cls, parent, obj);
|
return registerMethods(cls, parent, obj);
|
||||||
}
|
}
|
||||||
} catch (InvocationTargetException e) {
|
} catch (InvocationTargetException e) {
|
||||||
logger.log(Level.SEVERE, "Failed to register commands", e);
|
logger.log(Level.SEVERE, "Failed to register commands", e);
|
||||||
@ -126,6 +142,7 @@ public abstract class CommandsManager<T> {
|
|||||||
} catch (InstantiationException e) {
|
} catch (InstantiationException e) {
|
||||||
logger.log(Level.SEVERE, "Failed to register commands", e);
|
logger.log(Level.SEVERE, "Failed to register commands", e);
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -134,8 +151,9 @@ public abstract class CommandsManager<T> {
|
|||||||
* @param cls
|
* @param cls
|
||||||
* @param parent
|
* @param parent
|
||||||
*/
|
*/
|
||||||
private void registerMethods(Class<?> cls, Method parent, Object obj) {
|
private List<Command> registerMethods(Class<?> cls, Method parent, Object obj) {
|
||||||
Map<String, Method> map;
|
Map<String, Method> map;
|
||||||
|
List<Command> registered = new ArrayList<Command>();
|
||||||
|
|
||||||
// Make a new hash map to cache the commands for this class
|
// Make a new hash map to cache the commands for this class
|
||||||
// as looking up methods via reflection is fairly slow
|
// as looking up methods via reflection is fairly slow
|
||||||
@ -180,6 +198,9 @@ public abstract class CommandsManager<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add the command to the registered command list for return
|
||||||
|
registered.add(cmd);
|
||||||
|
|
||||||
// Look for nested commands -- if there are any, those have
|
// Look for nested commands -- if there are any, those have
|
||||||
// to be cached too so that they can be quickly looked
|
// to be cached too so that they can be quickly looked
|
||||||
// up when processing commands
|
// up when processing commands
|
||||||
@ -191,6 +212,7 @@ public abstract class CommandsManager<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return registered;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -230,15 +252,21 @@ public abstract class CommandsManager<T> {
|
|||||||
command.append(args[i] + " ");
|
command.append(args[i] + " ");
|
||||||
}
|
}
|
||||||
if (cmd.flags().length() > 0) {
|
if (cmd.flags().length() > 0) {
|
||||||
|
List<Character> flagChars = new ArrayList<Character>();
|
||||||
char[] flags = cmd.flags().toCharArray();
|
char[] flags = cmd.flags().toCharArray();
|
||||||
for (int i = 0; i < flags.length; ++i) {
|
for (int i = 0; i < flags.length; ++i) {
|
||||||
if (flags.length > i + 1) {
|
if (flags.length > i + 1 && flags[i + 1] == ':') {
|
||||||
if (flags[i + 1] == ':') {
|
i++; continue;
|
||||||
flags = removePortionOfArray(flags, i, i + 1, null);
|
|
||||||
}
|
}
|
||||||
|
flagChars.add(flags[i]);
|
||||||
}
|
}
|
||||||
|
if (flagChars.size() > 0) {
|
||||||
|
command.append("[-");
|
||||||
|
for (char character : flagChars) {
|
||||||
|
command.append(character);
|
||||||
|
}
|
||||||
|
command.append("] ");
|
||||||
}
|
}
|
||||||
if (flags.length > 0) command.append("[-" + String.valueOf(flags) + "] ");
|
|
||||||
}
|
}
|
||||||
command.append(cmd.usage());
|
command.append(cmd.usage());
|
||||||
|
|
||||||
@ -391,13 +419,13 @@ public abstract class CommandsManager<T> {
|
|||||||
final Set<Character> valueFlags = new HashSet<Character>();
|
final Set<Character> valueFlags = new HashSet<Character>();
|
||||||
|
|
||||||
char[] flags = cmd.flags().toCharArray();
|
char[] flags = cmd.flags().toCharArray();
|
||||||
|
Set<Character> newFlags = new HashSet<Character>();
|
||||||
for (int i = 0; i < flags.length; ++i) {
|
for (int i = 0; i < flags.length; ++i) {
|
||||||
if (flags.length > i + 1) {
|
if (flags.length > i + 1 && flags[i + 1] == ':') {
|
||||||
if (flags[i + 1] == ':') {
|
|
||||||
valueFlags.add(flags[i]);
|
valueFlags.add(flags[i]);
|
||||||
flags = removePortionOfArray(flags, i + 1, i + 1, null);
|
++i;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
newFlags.add(flags[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandContext context = new CommandContext(newArgs, valueFlags);
|
CommandContext context = new CommandContext(newArgs, valueFlags);
|
||||||
@ -408,9 +436,8 @@ public abstract class CommandsManager<T> {
|
|||||||
if (cmd.max() != -1 && context.argsLength() > cmd.max())
|
if (cmd.max() != -1 && context.argsLength() > cmd.max())
|
||||||
throw new CommandUsageException("Too many arguments.", getUsage(args, level, cmd));
|
throw new CommandUsageException("Too many arguments.", getUsage(args, level, cmd));
|
||||||
|
|
||||||
String flagStr = String.valueOf(flags);
|
|
||||||
for (char flag : context.getFlags()) {
|
for (char flag : context.getFlags()) {
|
||||||
if (flagStr.indexOf(flag) == -1)
|
if (!newFlags.contains(flag))
|
||||||
throw new CommandUsageException("Unknown flag: " + flag, getUsage(args, level, cmd));
|
throw new CommandUsageException("Unknown flag: " + flag, getUsage(args, level, cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren