+ update basecommand
This commit is contained in:
parent
8b05ff6451
commit
fe0efbf297
@ -1,5 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module external.system.id="GRADLE" type="JAVA_MODULE" version="4">
|
<module external.system.id="GRADLE" type="JAVA_MODULE" version="4">
|
||||||
|
<component name="FacetManager">
|
||||||
|
<facet type="android-gradle" name="Android-Gradle">
|
||||||
|
<configuration>
|
||||||
|
<option name="GRADLE_PROJECT_PATH" value=":" />
|
||||||
|
</configuration>
|
||||||
|
</facet>
|
||||||
|
</component>
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
<exclude-output />
|
<exclude-output />
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
@ -16,10 +16,7 @@ import org.bukkit.scheduler.BukkitRunnable;
|
|||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -52,11 +49,42 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
|||||||
baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredMethods()).filter(method -> method.getAnnotation(SubCommand.class) != null).forEach(methods::add));
|
baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredMethods()).filter(method -> method.getAnnotation(SubCommand.class) != null).forEach(methods::add));
|
||||||
if (methods.size() > 0) {
|
if (methods.size() > 0) {
|
||||||
methods.sort(Comparator.comparingDouble(a -> a.getAnnotation(SubCommand.class).priority()));
|
methods.sort(Comparator.comparingDouble(a -> a.getAnnotation(SubCommand.class).priority()));
|
||||||
methods.forEach(x -> {
|
methods.forEach(method -> {
|
||||||
|
BaseSubCommand subCommand = null;
|
||||||
try {
|
try {
|
||||||
x.setAccessible(true);
|
method.setAccessible(true);
|
||||||
x.invoke(baseMainCommand);
|
// lite parameter
|
||||||
} catch (Exception ignored) {
|
if (Arrays.equals(method.getParameterTypes(), new Class[] {CommandSender.class, String[].class})) {
|
||||||
|
subCommand = new BaseSubCommand() {
|
||||||
|
@Override
|
||||||
|
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
try {
|
||||||
|
method.invoke(baseMainCommand, sender, args);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// fully parameter
|
||||||
|
else if (Arrays.equals(method.getParameterTypes(), new Class[] {CommandSender.class, Command.class, String.class, String[].class})) {
|
||||||
|
subCommand = new BaseSubCommand() {
|
||||||
|
@Override
|
||||||
|
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
try {
|
||||||
|
method.invoke(baseMainCommand, sender, command, label, args);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (subCommand != null) {
|
||||||
|
subCommand.setLabel(method.getName());
|
||||||
|
subCommand.setAnnotation(method.getAnnotation(SubCommand.class));
|
||||||
|
baseMainCommand.registerSubCommand(subCommand);
|
||||||
|
}
|
||||||
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -68,8 +96,9 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
|||||||
commandField.getField().setAccessible(true);
|
commandField.getField().setAccessible(true);
|
||||||
BaseSubCommand subCommand = (BaseSubCommand) commandField.getField().get(commandField.getParent().newInstance());
|
BaseSubCommand subCommand = (BaseSubCommand) commandField.getField().get(commandField.getParent().newInstance());
|
||||||
subCommand.setLabel(commandField.getField().getName());
|
subCommand.setLabel(commandField.getField().getName());
|
||||||
|
subCommand.setAnnotation(commandField.getField().getAnnotation(SubCommand.class));
|
||||||
baseMainCommand.registerSubCommand(subCommand);
|
baseMainCommand.registerSubCommand(subCommand);
|
||||||
} catch (Exception ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -230,7 +259,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasPermission(CommandSender sender, BaseSubCommand baseSubCommand) {
|
private boolean hasPermission(CommandSender sender, BaseSubCommand baseSubCommand) {
|
||||||
return baseSubCommand == null || baseSubCommand.getPermission() == null || sender.hasPermission(baseSubCommand.getPermission());
|
return baseSubCommand == null || Strings.isEmpty(baseSubCommand.getPermission()) || sender.hasPermission(baseSubCommand.getPermission());
|
||||||
}
|
}
|
||||||
|
|
||||||
private String[] removeFirst(String[] args) {
|
private String[] removeFirst(String[] args) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package io.izzel.taboolib.module.command.base;
|
package io.izzel.taboolib.module.command.base;
|
||||||
|
|
||||||
import io.izzel.taboolib.module.locale.TLocale;
|
import io.izzel.taboolib.module.locale.TLocale;
|
||||||
|
import io.izzel.taboolib.util.Strings;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
|
||||||
@ -15,6 +16,11 @@ import java.util.stream.IntStream;
|
|||||||
public abstract class BaseSubCommand {
|
public abstract class BaseSubCommand {
|
||||||
|
|
||||||
private String label;
|
private String label;
|
||||||
|
private SubCommand annotation;
|
||||||
|
|
||||||
|
public void setAnnotation(SubCommand annotation) {
|
||||||
|
this.annotation = annotation;
|
||||||
|
}
|
||||||
|
|
||||||
public void setLabel(String label) {
|
public void setLabel(String label) {
|
||||||
this.label = label;
|
this.label = label;
|
||||||
@ -25,35 +31,35 @@ public abstract class BaseSubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
return null;
|
return annotation.description();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] getAliases() {
|
public String[] getAliases() {
|
||||||
return new String[0];
|
return annotation.aliases();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Argument[] getArguments() {
|
public Argument[] getArguments() {
|
||||||
return new Argument[0];
|
return Arrays.stream(annotation.aliases()).map(a -> a.endsWith("?") ? new Argument(a.substring(0, a.length() - 1), false) : new Argument(a)).toArray(Argument[]::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommandType getType() {
|
public CommandType getType() {
|
||||||
return CommandType.ALL;
|
return annotation.type();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean ignoredLabel() {
|
public boolean ignoredLabel() {
|
||||||
return true;
|
return annotation.ignoredLabel();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean requiredPlayer() {
|
public boolean requiredPlayer() {
|
||||||
return false;
|
return annotation.requiredPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPermission() {
|
public String getPermission() {
|
||||||
return null;
|
return annotation.permission();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hideInHelp() {
|
public boolean hideInHelp() {
|
||||||
return false;
|
return annotation.hideInHelp();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isParameterConform(String[] args) {
|
public boolean isParameterConform(String[] args) {
|
||||||
@ -61,7 +67,7 @@ public abstract class BaseSubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getCommandString(String label) {
|
public String getCommandString(String label) {
|
||||||
return TLocale.asString(getDescription() == null ? "COMMANDS.INTERNAL.COMMAND-HELP-EMPTY" : "COMMANDS.INTERNAL.COMMAND-HELP", label, getLabel(), Arrays.stream(getArguments()).map(parameter -> parameter.toString() + " ").collect(Collectors.joining()), getDescription());
|
return TLocale.asString(Strings.isEmpty(getDescription()) ? "COMMANDS.INTERNAL.COMMAND-HELP-EMPTY" : "COMMANDS.INTERNAL.COMMAND-HELP", label, getLabel(), Arrays.stream(getArguments()).map(parameter -> parameter.toString() + " ").collect(Collectors.joining()), getDescription());
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract public void onCommand(CommandSender sender, Command command, String label, String[] args);
|
abstract public void onCommand(CommandSender sender, Command command, String label, String[] args);
|
||||||
|
@ -14,4 +14,20 @@ import java.lang.annotation.Target;
|
|||||||
public @interface SubCommand {
|
public @interface SubCommand {
|
||||||
|
|
||||||
double priority() default 0;
|
double priority() default 0;
|
||||||
|
|
||||||
|
String permission() default "";
|
||||||
|
|
||||||
|
String description() default "";
|
||||||
|
|
||||||
|
String[] aliases() default {};
|
||||||
|
|
||||||
|
String[] arguments() default {};
|
||||||
|
|
||||||
|
boolean ignoredLabel() default true;
|
||||||
|
|
||||||
|
boolean requiredPlayer() default false;
|
||||||
|
|
||||||
|
boolean hideInHelp() default false;
|
||||||
|
|
||||||
|
CommandType type() default CommandType.ALL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user