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:
Norbi Peti 2019-02-22 00:40:11 +01:00
parent d19936309f
commit e4f5850ad6
No known key found for this signature in database
GPG key ID: DBA4C4549A927E56
6 changed files with 29 additions and 30 deletions

View file

@ -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" />

View file

@ -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();

View file

@ -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

View file

@ -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);
} }

View file

@ -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

View file

@ -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);
} }
} }