Component stuff, command stuff
Made the components return correctly-typed plugins Added support for showing commands Moved the subcommands and paramconverters to the base class
This commit is contained in:
parent
d19936309f
commit
e4f5850ad6
6 changed files with 29 additions and 30 deletions
|
@ -12,6 +12,8 @@
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
|
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
|
||||||
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
|
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
|
||||||
<orderEntry type="library" name="Maven: org.javassist:javassist:3.20.0-GA" level="project" />
|
<orderEntry type="library" name="Maven: org.javassist:javassist:3.20.0-GA" level="project" />
|
||||||
|
|
|
@ -54,7 +54,7 @@ public class ComponentCommand extends ICommand2MC {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Optional<Component> getComponentOrError(Plugin plugin, String arg, CommandSender sender) {
|
private Optional<Component<?>> getComponentOrError(Plugin plugin, String arg, CommandSender sender) {
|
||||||
val oc = Component.getComponents().values().stream()
|
val oc = Component.getComponents().values().stream()
|
||||||
.filter(c -> plugin.getName().equals(c.getPlugin().getName()))
|
.filter(c -> plugin.getName().equals(c.getPlugin().getName()))
|
||||||
.filter(c -> c.getClass().getSimpleName().equalsIgnoreCase(arg)).findAny();
|
.filter(c -> c.getClass().getSimpleName().equalsIgnoreCase(arg)).findAny();
|
||||||
|
|
|
@ -25,7 +25,7 @@ public class TBMCCommandPreprocessEvent extends Event implements Cancellable {
|
||||||
|
|
||||||
public TBMCCommandPreprocessEvent(CommandSender sender, String message) {
|
public TBMCCommandPreprocessEvent(CommandSender sender, String message) {
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
this.message = message; //TODO: Actually call from Discord as well
|
this.message = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -20,14 +20,14 @@ import java.util.Map;
|
||||||
/**
|
/**
|
||||||
* Configuration is based on class name
|
* Configuration is based on class name
|
||||||
*/
|
*/
|
||||||
public abstract class Component {
|
public abstract class Component<TP extends JavaPlugin> {
|
||||||
private static HashMap<Class<? extends Component>, Component> components = new HashMap<>();
|
private static HashMap<Class<? extends Component>, Component<? extends JavaPlugin>> components = new HashMap<>();
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private boolean enabled = false;
|
private boolean enabled = false;
|
||||||
@Getter
|
@Getter
|
||||||
@NonNull
|
@NonNull
|
||||||
private JavaPlugin plugin;
|
private TP plugin;
|
||||||
@NonNull
|
@NonNull
|
||||||
private @Getter
|
private @Getter
|
||||||
IHaveConfig config;
|
IHaveConfig config;
|
||||||
|
@ -46,7 +46,7 @@ public abstract class Component {
|
||||||
* @param component The component to register
|
* @param component The component to register
|
||||||
* @return Whether the component is registered successfully (it may have failed to enable)
|
* @return Whether the component is registered successfully (it may have failed to enable)
|
||||||
*/
|
*/
|
||||||
public static boolean registerComponent(JavaPlugin plugin, Component component) {
|
public static <T extends JavaPlugin> boolean registerComponent(T plugin, Component<T> component) {
|
||||||
return registerUnregisterComponent(plugin, component, true);
|
return registerUnregisterComponent(plugin, component, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,11 +58,11 @@ public abstract class Component {
|
||||||
* @param component The component to unregister
|
* @param component The component to unregister
|
||||||
* @return Whether the component is unregistered successfully (it also got disabled)
|
* @return Whether the component is unregistered successfully (it also got disabled)
|
||||||
*/
|
*/
|
||||||
public static boolean unregisterComponent(JavaPlugin plugin, Component component) {
|
public static <T extends JavaPlugin> boolean unregisterComponent(T plugin, Component<T> component) {
|
||||||
return registerUnregisterComponent(plugin, component, false);
|
return registerUnregisterComponent(plugin, component, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean registerUnregisterComponent(JavaPlugin plugin, Component component, boolean register) {
|
public static <T extends JavaPlugin> boolean registerUnregisterComponent(T plugin, Component<T> component, boolean register) {
|
||||||
try {
|
try {
|
||||||
val metaAnn = component.getClass().getAnnotation(ComponentMetadata.class);
|
val metaAnn = component.getClass().getAnnotation(ComponentMetadata.class);
|
||||||
if (metaAnn != null) {
|
if (metaAnn != null) {
|
||||||
|
@ -153,7 +153,7 @@ public abstract class Component {
|
||||||
*
|
*
|
||||||
* @return The currently registered components
|
* @return The currently registered components
|
||||||
*/
|
*/
|
||||||
public static Map<Class<? extends Component>, Component> getComponents() {
|
public static Map<Class<? extends Component>, Component<? extends JavaPlugin>> getComponents() {
|
||||||
return Collections.unmodifiableMap(components);
|
return Collections.unmodifiableMap(components);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ import java.util.function.Function;
|
||||||
*/
|
*/
|
||||||
public abstract class Command2<TC extends ICommand2, TP extends Command2Sender> {
|
public abstract class Command2<TC extends ICommand2, TP extends Command2Sender> {
|
||||||
protected Command2() {
|
protected Command2() {
|
||||||
|
commandHelp.add("§6---- Commands ----");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,6 +66,11 @@ public abstract class Command2<TC extends ICommand2, TP extends Command2Sender>
|
||||||
public final String errormsg;
|
public final String errormsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private HashMap<String, SubcommandData<TC>> subcommands = new HashMap<>();
|
||||||
|
private HashMap<Class<?>, ParamConverter<?>> paramConverters = new HashMap<>();
|
||||||
|
|
||||||
|
private ArrayList<String> commandHelp = new ArrayList<>(); //Mainly needed by Discord
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a param converter that obtains a specific object from a string parameter.
|
* Adds a param converter that obtains a specific object from a string parameter.
|
||||||
* The converter may return null.
|
* The converter may return null.
|
||||||
|
@ -73,17 +79,11 @@ public abstract class Command2<TC extends ICommand2, TP extends Command2Sender>
|
||||||
* @param converter The converter to use
|
* @param converter The converter to use
|
||||||
* @param <T> The type of the result
|
* @param <T> The type of the result
|
||||||
*/
|
*/
|
||||||
public abstract <T> void addParamConverter(Class<T> cl, Function<String, T> converter, String errormsg);
|
public <T> void addParamConverter(Class<T> cl, Function<String, T> converter, String errormsg) {
|
||||||
|
paramConverters.put(cl, new ParamConverter<>(converter, errormsg));
|
||||||
protected <T> void addParamConverter(Class<T> cl, Function<String, T> converter, String errormsg, HashMap<Class<?>, ParamConverter<?>> map) {
|
|
||||||
map.put(cl, new ParamConverter<>(converter, errormsg));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract boolean handleCommand(TP sender, String commandLine) throws Exception;
|
public boolean handleCommand(TP sender, String commandline) throws Exception {
|
||||||
|
|
||||||
protected boolean handleCommand(TP sender, String commandline,
|
|
||||||
HashMap<String, SubcommandData<TC>> subcommands,
|
|
||||||
HashMap<Class<?>, ParamConverter<?>> paramConverters) throws Exception {
|
|
||||||
for (int i = commandline.length(); i != -1; i = commandline.lastIndexOf(' ', i - 1)) {
|
for (int i = commandline.length(); i != -1; i = commandline.lastIndexOf(' ', i - 1)) {
|
||||||
String subcommand = commandline.substring(0, i).toLowerCase();
|
String subcommand = commandline.substring(0, i).toLowerCase();
|
||||||
SubcommandData<TC> sd = subcommands.get(subcommand); //O(1)
|
SubcommandData<TC> sd = subcommands.get(subcommand); //O(1)
|
||||||
|
@ -161,7 +161,7 @@ public abstract class Command2<TC extends ICommand2, TP extends Command2Sender>
|
||||||
|
|
||||||
public abstract void registerCommand(TC command);
|
public abstract void registerCommand(TC command);
|
||||||
|
|
||||||
protected void registerCommand(TC command, HashMap<String, SubcommandData<TC>> subcommands, char commandChar) {
|
protected void registerCommand(TC command, char commandChar) {
|
||||||
val path = command.getCommandPath();
|
val path = command.getCommandPath();
|
||||||
int x = path.indexOf(' ');
|
int x = path.indexOf(' ');
|
||||||
val mainPath = commandChar + path.substring(0, x == -1 ? path.length() : x);
|
val mainPath = commandChar + path.substring(0, x == -1 ? path.length() : x);
|
||||||
|
@ -177,6 +177,8 @@ public abstract class Command2<TC extends ICommand2, TP extends Command2Sender>
|
||||||
ht[0] = "§6---- " + ht[0] + " ----";
|
ht[0] = "§6---- " + ht[0] + " ----";
|
||||||
scmdHelpList.addAll(Arrays.asList(ht));
|
scmdHelpList.addAll(Arrays.asList(ht));
|
||||||
scmdHelpList.add("§6Subcommands:");
|
scmdHelpList.add("§6Subcommands:");
|
||||||
|
if (!commandHelp.contains(mainPath))
|
||||||
|
commandHelp.add(mainPath);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
TBMCCoreAPI.SendException("Could not register default handler for command /" + path, e);
|
TBMCCoreAPI.SendException("Could not register default handler for command /" + path, e);
|
||||||
}
|
}
|
||||||
|
@ -232,4 +234,8 @@ public abstract class Command2<TC extends ICommand2, TP extends Command2Sender>
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract boolean hasPermission(TP sender, TC command);
|
public abstract boolean hasPermission(TP sender, TC command);
|
||||||
|
|
||||||
|
public String[] getCommandsText() {
|
||||||
|
return commandHelp.toArray(new String[0]);
|
||||||
|
}
|
||||||
} //TODO: Test support of Player instead of CommandSender
|
} //TODO: Test support of Player instead of CommandSender
|
||||||
|
|
|
@ -2,21 +2,12 @@ package buttondevteam.lib.chat;
|
||||||
|
|
||||||
import buttondevteam.core.MainPlugin;
|
import buttondevteam.core.MainPlugin;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class Command2MC extends Command2<ICommand2MC, Command2MCSender> {
|
public class Command2MC extends Command2<ICommand2MC, Command2MCSender> {
|
||||||
private HashMap<String, SubcommandData<ICommand2MC>> subcommands = new HashMap<>();
|
|
||||||
private HashMap<Class<?>, ParamConverter<?>> paramConverters = new HashMap<>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handleCommand(Command2MCSender sender, String commandLine) throws Exception {
|
|
||||||
return handleCommand(sender, commandLine, subcommands, paramConverters);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerCommand(ICommand2MC command) {
|
public void registerCommand(ICommand2MC command) {
|
||||||
registerCommand(command, subcommands, '/');
|
super.registerCommand(command, '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -30,6 +21,6 @@ public class Command2MC extends Command2<ICommand2MC, Command2MCSender> {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public <T> void addParamConverter(Class<T> cl, Function<String, T> converter, String errormsg) {
|
public <T> void addParamConverter(Class<T> cl, Function<String, T> converter, String errormsg) {
|
||||||
addParamConverter(cl, converter, "§c" + errormsg, paramConverters);
|
super.addParamConverter(cl, converter, "§c" + errormsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue