diff --git a/litecommands-bukkit/src/main/java/dev/rollczi/litecommands/bukkit/LiteBukkitFactory.java b/litecommands-bukkit/src/main/java/dev/rollczi/litecommands/bukkit/LiteBukkitFactory.java index 7835d7467..af84453f1 100644 --- a/litecommands-bukkit/src/main/java/dev/rollczi/litecommands/bukkit/LiteBukkitFactory.java +++ b/litecommands-bukkit/src/main/java/dev/rollczi/litecommands/bukkit/LiteBukkitFactory.java @@ -12,8 +12,8 @@ private LiteBukkitFactory() { } - public static LiteCommandsBuilder builder(Server server, String fallbackPrefix) { - return LiteFactory.builder() + public static LiteCommandsBuilder builder(Server server, String fallbackPrefix) { + return LiteFactory.builder() .bind(Server.class, server) .bind(CommandSender.class, new OriginalSenderBind()) .platform(new LiteBukkitPlatformManager(server, fallbackPrefix)); diff --git a/litecommands-bungee/src/main/java/dev/rollczi/litecommands/bungee/LiteBungeeFactory.java b/litecommands-bungee/src/main/java/dev/rollczi/litecommands/bungee/LiteBungeeFactory.java index 547cb98cd..4ff0a2032 100644 --- a/litecommands-bungee/src/main/java/dev/rollczi/litecommands/bungee/LiteBungeeFactory.java +++ b/litecommands-bungee/src/main/java/dev/rollczi/litecommands/bungee/LiteBungeeFactory.java @@ -13,8 +13,8 @@ private LiteBungeeFactory() { } - public static LiteCommandsBuilder builder(Plugin plugin) { - return LiteFactory.builder() + public static LiteCommandsBuilder builder(Plugin plugin) { + return LiteFactory.builder() .bind(Plugin.class, plugin) .bind(ProxyServer.class, plugin.getProxy()) .bind(CommandSender.class, new OriginalSenderBind()) diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommands.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommands.java index 829b17295..7b23fdcfa 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommands.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommands.java @@ -9,12 +9,12 @@ public class LiteCommands { private final LiteRegisterResolvers registerResolvers; - private final LitePlatformManager platformManager; + private final LitePlatformManager platformManager; private final MessagesService messagesService; private final Injector injector; private final Logger logger; - LiteCommands(LiteRegisterResolvers registerResolvers, LitePlatformManager platformManager, MessagesService messagesService, Injector injector, Logger logger) { + LiteCommands(LiteRegisterResolvers registerResolvers, LitePlatformManager platformManager, MessagesService messagesService, Injector injector, Logger logger) { this.registerResolvers = registerResolvers; this.platformManager = platformManager; this.messagesService = messagesService; @@ -26,8 +26,8 @@ public LiteRegisterResolvers getRegisterResolvers() { return registerResolvers; } - public LitePlatformManager getPlatformManager() { - return platformManager; + public > P getPlatformManager() { + return (P) platformManager; } public MessagesService getMessagesService() { diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java index c5d049bf0..5952b0388 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java @@ -1,5 +1,7 @@ package dev.rollczi.litecommands; +import dev.rollczi.litecommands.argument.OptionArgumentHandler; +import dev.rollczi.litecommands.bind.NativeBind; import dev.rollczi.litecommands.component.ExecutionResult; import dev.rollczi.litecommands.argument.ArgumentHandler; import dev.rollczi.litecommands.argument.ArgumentName; @@ -12,7 +14,6 @@ import dev.rollczi.litecommands.valid.messages.ContextualMessage; import dev.rollczi.litecommands.valid.messages.LiteMessage; import dev.rollczi.litecommands.valid.messages.MessagesService; -import dev.rollczi.litecommands.annotations.Arg; import dev.rollczi.litecommands.annotations.parser.AnnotationParser; import dev.rollczi.litecommands.annotations.parser.LiteAnnotationParser; import dev.rollczi.litecommands.component.LiteComponent; @@ -24,6 +25,7 @@ import dev.rollczi.litecommands.valid.messages.UseSchemeFormatting; import org.panda_lang.utilities.inject.DependencyInjection; import org.panda_lang.utilities.inject.Injector; +import panda.std.Option; import panda.utilities.text.Formatter; import java.util.ArrayList; @@ -37,113 +39,126 @@ import java.util.function.Supplier; import java.util.logging.Logger; -public class LiteCommandsBuilder { +public class LiteCommandsBuilder> { private final Set> commandClasses = new HashSet<>(); private final Set commandInstances = new HashSet<>(); - private final Set binds = new HashSet<>(); - private final Map, ArgumentHandler> argumentHandlers = new HashMap<>(); + private final Set binds = new HashSet<>(); + private final Map, Set>> argumentHandlers = new HashMap<>(); private final MessagesService messagesService = new MessagesService(); private final LiteRegisterResolvers registerResolvers = new LiteRegisterResolvers(); private final Formatter placeholders = new Formatter(); private ExecutionResultHandler executionResultHandler; - private LitePlatformManager platformManager; + private P platformManager; private Injector baseInjector = DependencyInjection.createInjector(); private Logger logger = Logger.getLogger("LiteCommands"); public LiteCommandsBuilder() { } - public LiteCommandsBuilder command(Collection> commands) { + public LiteCommandsBuilder command(Collection> commands) { this.commandClasses.addAll(commands); return this; } - public LiteCommandsBuilder command(Class... commands) { + public LiteCommandsBuilder command(Class... commands) { return this.command(Arrays.asList(commands)); } - public LiteCommandsBuilder commandInstance(Collection commands) { + public LiteCommandsBuilder commandInstance(Collection commands) { this.commandInstances.addAll(commands); return this; } - public LiteCommandsBuilder commandInstance(Object... commands) { + public LiteCommandsBuilder commandInstance(Object... commands) { return this.commandInstance(Arrays.asList(commands)); } - public LiteCommandsBuilder bind(Collection binds) { - this.binds.addAll(binds); + public LiteCommandsBuilder baseInjector(Injector baseInjector) { + this.baseInjector = baseInjector; return this; } - public LiteCommandsBuilder baseInjector(Injector baseInjector) { - this.baseInjector = baseInjector; + public LiteCommandsBuilder bind(Collection binds) { + this.binds.addAll(binds); return this; } - public LiteCommandsBuilder bind(Bind... bind) { + public LiteCommandsBuilder bind(NativeBind... bind) { + return this.bind(Arrays.asList(bind)); + } + + public LiteCommandsBuilder bind(Bind... bind) { return this.bind(Arrays.asList(bind)); } - public LiteCommandsBuilder bind(Class on, LiteBind liteBind) { + public LiteCommandsBuilder bind(Class on, LiteBind liteBind) { this.bind((resources) -> resources.on(on) .assignHandler((property, annotation, objects) -> liteBind.apply(InjectUtils.getContextFromObjects(objects).getInvocation()))); return this; } - public LiteCommandsBuilder bind(Class on, Object instance) { + public LiteCommandsBuilder bind(Class on, Object instance) { this.bind((resources) -> resources.on(on).assignInstance(instance)); return this; } - public LiteCommandsBuilder bind(Class on, Supplier supplier) { + public LiteCommandsBuilder bind(Class on, Supplier supplier) { this.bind((resources) -> resources.on(on).assignInstance(supplier)); return this; } - public LiteCommandsBuilder argument(Class on, ArgumentHandler argumentHandler) { - this.argumentHandlers.put(on, argumentHandler); + public LiteCommandsBuilder argument(Class on, ArgumentHandler argumentHandler) { + Set> handlers = this.argumentHandlers.computeIfAbsent(on, key -> new HashSet<>()); + + handlers.add(argumentHandler); + return this; + } + + public > LiteCommandsBuilder argument(Class optionalClass, OptionArgumentHandler argumentHandler) { + Set> handlers = this.argumentHandlers.computeIfAbsent(optionalClass, key -> new HashSet<>()); + + handlers.add(argumentHandler); return this; } @Deprecated - public LiteCommandsBuilder message(ValidationInfo validationInfo, ContextualMessage message) { + public LiteCommandsBuilder message(ValidationInfo validationInfo, ContextualMessage message) { this.messagesService.registerMessage(validationInfo, message); return this; } - public LiteCommandsBuilder message(ValidationInfo validationInfo, LiteMessage message) { + public LiteCommandsBuilder message(ValidationInfo validationInfo, LiteMessage message) { this.messagesService.registerMessage(validationInfo, message); return this; } - public LiteCommandsBuilder formatting(UseSchemeFormatting formatting) { + public LiteCommandsBuilder formatting(UseSchemeFormatting formatting) { this.messagesService.setUseSchemeFormatting(formatting); return this; } - public LiteCommandsBuilder placeholder(String key, Supplier supplier) { + public LiteCommandsBuilder placeholder(String key, Supplier supplier) { this.placeholders.register(key, supplier); return this; } - public LiteCommandsBuilder placeholder(String key, String text) { + public LiteCommandsBuilder placeholder(String key, String text) { this.placeholders.register(key, text); return this; } - public LiteCommandsBuilder placeholders(Map> placeholders) { + public LiteCommandsBuilder placeholders(Map> placeholders) { placeholders.forEach(this.placeholders::register); return this; } - public LiteCommandsBuilder platform(LitePlatformManager platformManager) { + public LiteCommandsBuilder platform(P platformManager) { this.platformManager = platformManager; return this; } - public LiteCommandsBuilder logger(Logger logger) { + public LiteCommandsBuilder logger(Logger logger) { this.logger = logger; return this; } @@ -157,39 +172,25 @@ public LiteCommands register() { executionResultHandler = new LiteExecutionResultHandler(messagesService); } + AnnotationParser parser = new LiteAnnotationParser(argumentHandlers, placeholders); + Injector injector = baseInjector.fork(resources -> { - for (Bind bind : binds) { - bind.bind(resources); + for (NativeBind bind : binds) { + bind.bind(parser, resources); } - - resources.annotatedWith(Arg.class).assignHandler((property, arg, objects) -> { - LiteComponent.ContextOfResolving context = InjectUtils.getContextFromObjects(objects); - - for (Map.Entry, ArgumentHandler> entry : argumentHandlers.entrySet()) { - Class on = entry.getKey(); - ArgumentHandler argumentHandler = entry.getValue(); - - if (!on.isAssignableFrom(property.getType())) { - continue; - } - - return argumentHandler.parse(context, arg.value()); - } - - return null; - }); }); // Checks for legacy implementations - for (ArgumentHandler handler : argumentHandlers.values()) { - if (handler.getClass().isAnnotationPresent(ArgumentName.class)) { - continue; - } + for (Set> handlers : argumentHandlers.values()) { + for (ArgumentHandler handler : handlers) { + if (handler.getClass().isAnnotationPresent(ArgumentName.class)) { + continue; + } - logger.warning( "annotation @ArgumentName isn't present before class " + handler.getClass()); + logger.warning( "annotation @ArgumentName isn't present before class " + handler.getClass()); + } } - AnnotationParser parser = new LiteAnnotationParser(argumentHandlers, placeholders); LiteComponentFactory factory = new LiteComponentFactory(logger, injector, parser); for (Object instance : commandInstances) { @@ -212,8 +213,8 @@ public LiteCommands register() { return new LiteCommands(registerResolvers, platformManager, messagesService, injector, logger); } - public static LiteCommandsBuilder builder() { - return new LiteCommandsBuilder(); + public static > LiteCommandsBuilder builder() { + return new LiteCommandsBuilder<>(); } private static class DefaultExecutor implements Executor { diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteFactory.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteFactory.java index d75508316..6f0f9952d 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteFactory.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteFactory.java @@ -1,14 +1,17 @@ package dev.rollczi.litecommands; +import dev.rollczi.litecommands.bind.basic.ArgAnnotationBind; import dev.rollczi.litecommands.bind.basic.LiteInvocationBind; import dev.rollczi.litecommands.bind.basic.ArgumentsBind; import dev.rollczi.litecommands.bind.basic.LiteSenderBind; +import dev.rollczi.litecommands.platform.LitePlatformManager; import dev.rollczi.litecommands.platform.LiteSender; public class LiteFactory { - public static LiteCommandsBuilder builder() { - return LiteCommandsBuilder.builder() + public static > LiteCommandsBuilder builder() { + return LiteCommandsBuilder.builder() + .bind(new ArgAnnotationBind()) .bind(String[].class, new ArgumentsBind()) .bind(LiteSender.class, new LiteSenderBind()) .bind(LiteInvocation.class, new LiteInvocationBind()); diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/Arg.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/Arg.java index ac13b8418..9b995ae58 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/Arg.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/Arg.java @@ -1,6 +1,5 @@ package dev.rollczi.litecommands.annotations; -import dev.rollczi.litecommands.argument.ArgumentHandler; import org.panda_lang.utilities.inject.annotations.Injectable; import java.lang.annotation.ElementType; @@ -15,10 +14,4 @@ int value(); - //TODO: Add option to use only one handler. - // public void execute1(@Arg(0) String custom) { ... } - // public void execute2(@Arg(value = 0, only = Handler1.class) String custom) { ... } - // public void execute3(@Arg(value = 0, only = Handler2.class) String custom) { ... } - Class only() default ArgumentHandler.class; - } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/Handler.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/Handler.java new file mode 100644 index 000000000..81f4c0734 --- /dev/null +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/Handler.java @@ -0,0 +1,16 @@ +package dev.rollczi.litecommands.annotations; + +import dev.rollczi.litecommands.argument.ArgumentHandler; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Handler { + + Class value() default ArgumentHandler.class; + +} diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/parser/AnnotationParser.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/parser/AnnotationParser.java index 42cedfe7e..74fa92750 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/parser/AnnotationParser.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/parser/AnnotationParser.java @@ -8,6 +8,8 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; +import java.util.Map; +import java.util.Set; public interface AnnotationParser { @@ -21,6 +23,8 @@ public interface AnnotationParser { */ Option parse(AnnotatedElement annotatedElement); - Option> getArgumentHandler(Class argumentClass); + Set> getArgumentHandler(Class argumentClass); + + Map, Set>> getArgumentHandlers(); } \ No newline at end of file diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/parser/LiteAnnotationParser.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/parser/LiteAnnotationParser.java index 84ec75719..b2032c509 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/parser/LiteAnnotationParser.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/annotations/parser/LiteAnnotationParser.java @@ -24,21 +24,23 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; public class LiteAnnotationParser implements AnnotationParser { - private final Map, ArgumentHandler> argumentHandlers; + private final Map, Set>> argumentHandlers; private final Formatter placeholders; - public LiteAnnotationParser(Map, ArgumentHandler> argumentHandlers) { + public LiteAnnotationParser(Map, Set>> argumentHandlers) { this.argumentHandlers = argumentHandlers; this.placeholders = new Formatter(); } - public LiteAnnotationParser(Map, ArgumentHandler> argumentHandlers, Formatter placeholders) { + public LiteAnnotationParser(Map, Set>> argumentHandlers, Formatter placeholders) { this.argumentHandlers = argumentHandlers; this.placeholders = placeholders; } @@ -152,7 +154,7 @@ public Option parse(AnnotatedElement annotatedElement) { if (annotation instanceof Between) { Between between = (Between) annotation; - builder.amountValidator(validator -> validator.min(between.min()).min(between.max())); + builder.amountValidator(validator -> validator.min(between.min()).max(between.max())); } } @@ -160,8 +162,13 @@ public Option parse(AnnotatedElement annotatedElement) { } @Override - public Option> getArgumentHandler(Class argumentClass) { - return Option.of(argumentHandlers.get(argumentClass)); + public Set> getArgumentHandler(Class argumentClass) { + return Collections.unmodifiableSet(argumentHandlers.get(argumentClass)); + } + + @Override + public Map, Set>> getArgumentHandlers() { + return Collections.unmodifiableMap(argumentHandlers); } } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/ArgumentHandler.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/ArgumentHandler.java index 55265852b..344bf259f 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/ArgumentHandler.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/ArgumentHandler.java @@ -17,4 +17,8 @@ default Option getName() { .map(ArgumentName::value); } + default Class getNativeClass() { + return this.getClass(); + } + } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/OptionArgumentHandler.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/OptionArgumentHandler.java new file mode 100644 index 000000000..c9e61e0d9 --- /dev/null +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/OptionArgumentHandler.java @@ -0,0 +1,30 @@ +package dev.rollczi.litecommands.argument; + +import dev.rollczi.litecommands.LiteInvocation; +import dev.rollczi.litecommands.component.LiteComponent; +import dev.rollczi.litecommands.valid.ValidationCommandException; +import panda.std.Option; + +public interface OptionArgumentHandler extends SingleArgumentHandler> { + + @Override + default Option parse(LiteComponent.ContextOfResolving context, int rawIndex) throws ValidationCommandException { + LiteInvocation invocation = context.getInvocation(); + int index = context.getArgsMargin() + rawIndex; + String[] arguments = invocation.arguments(); + + if (arguments.length <= index) { + return Option.none(); + } + + return parse(invocation, arguments[index]); + } + + @Override + default Option parse(LiteInvocation invocation, String argument) throws ValidationCommandException { + return Option.of(parseIfPresent(invocation, argument)); + } + + T parseIfPresent(LiteInvocation invocation, String argument) throws ValidationCommandException; + +} diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/SingleArgumentHandler.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/SingleArgumentHandler.java index f216de2db..53de04909 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/SingleArgumentHandler.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/argument/SingleArgumentHandler.java @@ -1,9 +1,9 @@ package dev.rollczi.litecommands.argument; import dev.rollczi.litecommands.LiteInvocation; -import dev.rollczi.litecommands.argument.ArgumentHandler; import dev.rollczi.litecommands.component.LiteComponent; import dev.rollczi.litecommands.valid.ValidationCommandException; +import panda.std.Option; import java.util.List; @@ -12,9 +12,14 @@ public interface SingleArgumentHandler extends ArgumentHandler { @Override default T parse(LiteComponent.ContextOfResolving context, int rawIndex) throws ValidationCommandException { LiteInvocation invocation = context.getInvocation(); - String argument = invocation.arguments()[context.getArgsMargin() + rawIndex]; + int index = context.getArgsMargin() + rawIndex; + String[] arguments = invocation.arguments(); - return parse(invocation, argument); + if (arguments.length <= index) { + throw new IllegalStateException("Missing arguments! Did you add @Required/@MinArgs/@MaxArgs/@Between annotations correctly before the execute method?"); + } + + return parse(invocation, arguments[index]); } T parse(LiteInvocation invocation, String argument) throws ValidationCommandException; @@ -28,4 +33,28 @@ default List tabulation(LiteComponent.ContextOfResolving context) { List tabulation(String command, String[] args); + default OptionArgumentHandler toOptionHandler() { + return new OptionArgumentHandler() { + @Override + public T parseIfPresent(LiteInvocation invocation, String argument) throws ValidationCommandException { + return SingleArgumentHandler.this.parse(invocation, argument); + } + + @Override + public List tabulation(String command, String[] args) { + return SingleArgumentHandler.this.tabulation(command, args); + } + + @Override + public Class getNativeClass() { + return SingleArgumentHandler.this.getNativeClass(); + } + + @Override + public Option getName() { + return SingleArgumentHandler.this.getName(); + } + }; + } + } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/Bind.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/Bind.java index db3fdf9e2..cc46dee3a 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/Bind.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/Bind.java @@ -1,9 +1,15 @@ package dev.rollczi.litecommands.bind; +import dev.rollczi.litecommands.annotations.parser.AnnotationParser; import org.panda_lang.utilities.inject.Resources; -public interface Bind { +public interface Bind extends NativeBind { void bind(Resources resources); + @Override + default void bind(AnnotationParser annotationParser, Resources resources) { + this.bind(resources); + } + } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/NativeBind.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/NativeBind.java new file mode 100644 index 000000000..dd4e9983b --- /dev/null +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/NativeBind.java @@ -0,0 +1,10 @@ +package dev.rollczi.litecommands.bind; + +import dev.rollczi.litecommands.annotations.parser.AnnotationParser; +import org.panda_lang.utilities.inject.Resources; + +public interface NativeBind { + + void bind(AnnotationParser annotationParser, Resources resources); + +} diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/basic/ArgAnnotationBind.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/basic/ArgAnnotationBind.java new file mode 100644 index 000000000..131ea6df0 --- /dev/null +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/bind/basic/ArgAnnotationBind.java @@ -0,0 +1,46 @@ +package dev.rollczi.litecommands.bind.basic; + +import dev.rollczi.litecommands.annotations.Arg; +import dev.rollczi.litecommands.annotations.Handler; +import dev.rollczi.litecommands.annotations.parser.AnnotationParser; +import dev.rollczi.litecommands.argument.ArgumentHandler; +import dev.rollczi.litecommands.bind.NativeBind; +import dev.rollczi.litecommands.component.LiteComponent; +import dev.rollczi.litecommands.utils.InjectUtils; +import org.panda_lang.utilities.inject.Resources; + +import java.util.Map; +import java.util.Set; + +public class ArgAnnotationBind implements NativeBind { + + @Override + public void bind(AnnotationParser annotationParser, Resources resources) { + resources.annotatedWith(Arg.class).assignHandler((property, arg, objects) -> { + LiteComponent.ContextOfResolving context = InjectUtils.getContextFromObjects(objects); + int value = arg.value(); + + for (Map.Entry, Set>> entry : annotationParser.getArgumentHandlers().entrySet()) { + Class on = entry.getKey(); + Set> handlers = entry.getValue(); + + if (!on.isAssignableFrom(property.getType())) { + continue; + } + + Handler handler = property.getAnnotation(Handler.class); + + for (ArgumentHandler argumentHandler : handlers) { + if (handler != null && !handler.value().equals(ArgumentHandler.class) && !handler.value().equals(argumentHandler.getNativeClass())) { + continue; + } + + return argumentHandler.parse(context, value); + } + } + + return null; + }); + } + +} diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteComponentFactory.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteComponentFactory.java index 4605edf8f..66dbfbd59 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteComponentFactory.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteComponentFactory.java @@ -35,8 +35,7 @@ public Result createSection(Object sectionInstance) { Set innerSections = PandaStream.of(sectionClass.getClasses()) .concat(sectionClass.getDeclaredClasses()) .distinct() - .map(innerClass -> createSection(innerClass) - .orElseThrow(error -> new RuntimeException("Can't create inner class " + innerClass, error))) + .mapOpt(innerClass -> createSection(innerClass).toOption()) .toSet(); return LiteSection.builder() diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/MethodExecutor.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/MethodExecutor.java index 95651174a..f33c37d65 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/MethodExecutor.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/MethodExecutor.java @@ -1,6 +1,7 @@ package dev.rollczi.litecommands.component; import dev.rollczi.litecommands.annotations.Arg; +import dev.rollczi.litecommands.annotations.Handler; import dev.rollczi.litecommands.annotations.parser.AnnotationParser; import dev.rollczi.litecommands.argument.ArgumentHandler; import dev.rollczi.litecommands.utils.ReflectUtils; @@ -29,8 +30,14 @@ public MethodExecutor(Method method, Object instance, Injector injector, Annotat this.injector = injector; this.cachedArguments = PandaStream.of(method.getParameters()) .filter(parameter -> parameter.isAnnotationPresent(Arg.class)) - .toMap(parameter -> parameter.getAnnotation(Arg.class).value(), parameter -> annotationParser.getArgumentHandler(parameter.getType()) - .orThrow(() -> new RuntimeException("Can't index parameters of " + ReflectUtils.formatMethodParams(method)))); + .toMap(parameter -> parameter.getAnnotation(Arg.class).value(), parameter -> { + Handler handler = parameter.getAnnotation(Handler.class); + + return PandaStream.of(annotationParser.getArgumentHandler(parameter.getType())) + .filter(argumentHandler -> !parameter.isAnnotationPresent(Handler.class) || handler.value().equals(argumentHandler.getNativeClass())) + .any() + .orThrow(() -> new RuntimeException("Can't index parameters of " + ReflectUtils.formatMethodParams(method))); + }); } public Option> getArgumentHandler(int currentArgsCount) { diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/EmptyTestSender.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/EmptyTestSender.java deleted file mode 100644 index 987e67554..000000000 --- a/litecommands-core/src/test/java/dev/rollczi/litecommands/EmptyTestSender.java +++ /dev/null @@ -1,16 +0,0 @@ -package dev.rollczi.litecommands; - -import dev.rollczi.litecommands.platform.LiteSender; - -public class EmptyTestSender implements LiteSender { - - @Override - public boolean hasPermission(String permission) { return true; } - - @Override - public void sendMessage(String message) { } - - @Override - public Object getSender() { return null; } - -} diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteCommandsSpec.kt b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteCommandsSpec.kt index 52e263005..3f6cb890b 100644 --- a/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteCommandsSpec.kt +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteCommandsSpec.kt @@ -13,14 +13,18 @@ import java.util.logging.Logger open class LiteCommandsSpec { protected var contextCreator : BiFunction, LiteComponent.ContextOfResolving> = BiFunction { - command, args -> LiteComponent.ContextOfResolving.create(LiteInvocation(command, EmptyTestSender(), args)) + command, args -> LiteComponent.ContextOfResolving.create(LiteInvocation(command, + LiteTestSender(), args)) } protected var injector: Injector = DependencyInjection.createInjector() protected var factory = LiteComponentFactory( Logger.getLogger("LiteCommandsSpec"), injector, - LiteAnnotationParser(mapOf(Pair(EmptyTestSender::class.java, EmptyTestSenderArgument()))) + LiteAnnotationParser(mapOf(Pair( + LiteTestSender::class.java, + setOf(LiteTestSenderArgument()) + ))) ) } diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestCommand.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestCommand.java new file mode 100644 index 000000000..ff52db357 --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestCommand.java @@ -0,0 +1,36 @@ +package dev.rollczi.litecommands; + +import dev.rollczi.litecommands.platform.Executor; +import dev.rollczi.litecommands.platform.LiteSenderCreator; +import dev.rollczi.litecommands.platform.Suggester; +import dev.rollczi.litecommands.scope.ScopeMetaData; + +import java.util.List; + +public class LiteTestCommand { + + private final ScopeMetaData scope; + private final Executor executor; + private final Suggester suggester; + private final LiteSenderCreator liteSenderCreator; + + public LiteTestCommand(ScopeMetaData scope, Executor executor, Suggester suggester, LiteSenderCreator creator) { + this.scope = scope; + this.executor = executor; + this.suggester = suggester; + this.liteSenderCreator = creator; + } + + public void execute(String name, String alias, String[] arguments) { + executor.execute(new LiteInvocation(name, alias, liteSenderCreator.create(null), arguments)); + } + + public List suggest(String name, String alias, String[] arguments) { + return suggester.suggest(new LiteInvocation(name, alias, liteSenderCreator.create(null), arguments)); + } + + public ScopeMetaData getScope() { + return scope; + } + +} diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestFactory.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestFactory.java new file mode 100644 index 000000000..414ccb0f7 --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestFactory.java @@ -0,0 +1,12 @@ +package dev.rollczi.litecommands; + +public final class LiteTestFactory { + + private LiteTestFactory() {} + + public static LiteCommandsBuilder builder() { + return LiteFactory.builder() + .platform(new LiteTestPlatform()); + } + +} diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestPlatform.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestPlatform.java new file mode 100644 index 000000000..88fb1c78c --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestPlatform.java @@ -0,0 +1,45 @@ +package dev.rollczi.litecommands; + +import dev.rollczi.litecommands.platform.Executor; +import dev.rollczi.litecommands.platform.LiteAbstractPlatformManager; +import dev.rollczi.litecommands.platform.Suggester; +import dev.rollczi.litecommands.scope.ScopeMetaData; + +import java.util.HashMap; +import java.util.Map; + +public class LiteTestPlatform extends LiteAbstractPlatformManager { + + private final Map commands = new HashMap<>(); + + public LiteTestPlatform() { + super(none -> new LiteTestSender()); + } + + @Override + public void registerCommand(ScopeMetaData scope, Executor execute, Suggester suggester) { + LiteTestCommand liteTestCommand = new LiteTestCommand(scope, execute, suggester, this.liteSenderCreator); + + for (String alias : scope.getAliases()) { + commands.put(alias, liteTestCommand); + } + + commands.put(scope.getName(), liteTestCommand); + } + + @Override + public void unregisterCommands() { + commands.clear(); + } + + public void invocation(String command, String[] args) { + LiteTestCommand liteTestCommand = commands.get(command); + + if (liteTestCommand == null) { + return; + } + + liteTestCommand.execute(liteTestCommand.getScope().getName(), command, args); + } + +} diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestSender.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestSender.java new file mode 100644 index 000000000..3aa96961f --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestSender.java @@ -0,0 +1,20 @@ +package dev.rollczi.litecommands; + +import dev.rollczi.litecommands.platform.LiteSender; + +public class LiteTestSender implements LiteSender { + + @Override + public boolean hasPermission(String permission) { return true; } + + @Override + public void sendMessage(String message) { + throw new UnsupportedOperationException("Can't send message on TestSender! content: " + message); + } + + @Override + public Object getSender() { + throw new UnsupportedOperationException("Can't get origin sender of TestSender!"); + } + +} diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/EmptyTestSenderArgument.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestSenderArgument.java similarity index 61% rename from litecommands-core/src/test/java/dev/rollczi/litecommands/EmptyTestSenderArgument.java rename to litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestSenderArgument.java index dcbbc589b..7f30961a1 100644 --- a/litecommands-core/src/test/java/dev/rollczi/litecommands/EmptyTestSenderArgument.java +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/LiteTestSenderArgument.java @@ -6,11 +6,11 @@ import java.util.Arrays; import java.util.List; -public class EmptyTestSenderArgument implements SingleArgumentHandler { +public class LiteTestSenderArgument implements SingleArgumentHandler { @Override - public EmptyTestSender parse(LiteInvocation invocation, String argument) throws ValidationCommandException { - return new EmptyTestSender(); + public LiteTestSender parse(LiteInvocation invocation, String argument) throws ValidationCommandException { + return new LiteTestSender(); } @Override diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/ArgumentCommandTest.kt b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/ArgumentCommandTest.kt new file mode 100644 index 000000000..a6bacece1 --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/ArgumentCommandTest.kt @@ -0,0 +1,41 @@ +package dev.rollczi.litecommands.argument + +import dev.rollczi.litecommands.LiteCommandsSpec +import dev.rollczi.litecommands.LiteTestFactory +import dev.rollczi.litecommands.LiteTestPlatform +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import panda.std.Option + +class ArgumentCommandTest : LiteCommandsSpec() { + + @Test + fun `test correctness of component executing`() { + val testCommand = TestCommand() + + val liteCommands = LiteTestFactory.builder() + .argument(String::class.java, StringArg()) + .argument(String::class.java, CustomStringArg()) + .argument(Option::class.java, StringArg().toOptionHandler()) + .argument(Option::class.java, DoubleArg().toOptionHandler()) + .commandInstance(testCommand) + .register() + + val platform: LiteTestPlatform = liteCommands.getPlatformManager() + + platform.invocation("test", arrayOf("option", "test")) + platform.invocation("test", arrayOf("value_option", "test")) + platform.invocation("test", arrayOf("option_option", "0.0", "test")) + platform.invocation("test", arrayOf("customstring_string", "test", "test")) + platform.invocation("test", arrayOf("string_customstring", "test", "test")) + + assertEquals(1, testCommand.resultOption.executions) + assertEquals(1, testCommand.resultValueOption.executions) + assertEquals(1, testCommand.resultOptionOption.executions) + assertEquals("test", testCommand.resultCustom1.string) + assertEquals("", testCommand.resultCustom1.customString) + assertEquals("test", testCommand.resultCustom2.string) + assertEquals("", testCommand.resultCustom2.customString) + } + +} \ No newline at end of file diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/CustomStringArg.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/CustomStringArg.java new file mode 100644 index 000000000..586ec5d86 --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/CustomStringArg.java @@ -0,0 +1,22 @@ +package dev.rollczi.litecommands.argument; + +import dev.rollczi.litecommands.LiteInvocation; +import dev.rollczi.litecommands.valid.ValidationCommandException; + +import java.util.Collections; +import java.util.List; + +@ArgumentName("text") +public class CustomStringArg implements SingleArgumentHandler { + + @Override + public String parse(LiteInvocation invocation, String argument) throws ValidationCommandException { + return "<" + argument + ">"; + } + + @Override + public List tabulation(String command, String[] args) { + return Collections.emptyList(); + } + +} diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/DoubleArg.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/DoubleArg.java new file mode 100644 index 000000000..36abf182a --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/DoubleArg.java @@ -0,0 +1,23 @@ +package dev.rollczi.litecommands.argument; + +import dev.rollczi.litecommands.LiteInvocation; +import dev.rollczi.litecommands.valid.ValidationCommandException; +import panda.std.Option; + +import java.util.Collections; +import java.util.List; + +public class DoubleArg implements SingleArgumentHandler { + + @Override + public Double parse(LiteInvocation invocation, String argument) throws ValidationCommandException { + return Option.attempt(NumberFormatException.class, () -> Double.parseDouble(argument)) + .orThrow(() -> new ValidationCommandException(argument + " is not double!")); + } + + @Override + public List tabulation(String command, String[] args) { + return Collections.emptyList(); + } + +} diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/StringArg.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/StringArg.java new file mode 100644 index 000000000..e848d10e3 --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/StringArg.java @@ -0,0 +1,22 @@ +package dev.rollczi.litecommands.argument; + +import dev.rollczi.litecommands.LiteInvocation; +import dev.rollczi.litecommands.valid.ValidationCommandException; + +import java.util.Collections; +import java.util.List; + +@ArgumentName("text") +public class StringArg implements SingleArgumentHandler { + + @Override + public String parse(LiteInvocation invocation, String argument) throws ValidationCommandException { + return argument; + } + + @Override + public List tabulation(String command, String[] args) { + return Collections.emptyList(); + } + +} diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/TestCommand.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/TestCommand.java new file mode 100644 index 000000000..41622c722 --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/argument/TestCommand.java @@ -0,0 +1,117 @@ +package dev.rollczi.litecommands.argument; + +import dev.rollczi.litecommands.annotations.Arg; +import dev.rollczi.litecommands.annotations.Between; +import dev.rollczi.litecommands.annotations.Execute; +import dev.rollczi.litecommands.annotations.Handler; +import dev.rollczi.litecommands.annotations.IgnoreClass; +import dev.rollczi.litecommands.annotations.Section; +import panda.std.Option; + +@Section(route = "test") +public class TestCommand { + + public Result resultOption = new Result(); + public Result resultValueOption = new Result(); + public Result resultOptionOption = new Result(); + public ResultCustom resultCustom1 = new ResultCustom(); + public ResultCustom resultCustom2 = new ResultCustom(); + + @Execute(route = "option", required = 1) + public void execute(@Arg(0) @Handler(StringArg.class) Option first) { + resultOption.update(first.isEmpty()); + } + + @Execute(route = "value_option") @Between(min = 1, max = 2) + public void execute(@Arg(0) String first, @Arg(1) @Handler(StringArg.class) Option second) { + resultValueOption.update(first == null, second.isEmpty()); + } + + @Execute(route = "option_option") @Between(min = 0, max = 2) + public void execute(@Arg(0) @Handler(DoubleArg.class) Option first, @Arg(1) @Handler(StringArg.class) Option second) { + resultOptionOption.update(first == null, second.isEmpty()); + } + + @Execute(route = "customstring_string") @Between(min = 0, max = 2) + public void executeCustom1(@Arg(0) @Handler(CustomStringArg.class) String custom, @Arg(1) @Handler(StringArg.class) String string) { + resultCustom1.setString(string); + resultCustom1.setCustomString(custom); + } + + @Execute(route = "string_customstring") @Between(min = 0, max = 2) + public void executeCustom2(@Arg(0) @Handler(StringArg.class) String string, @Arg(1) @Handler(CustomStringArg.class) String custom) { + resultCustom2.setString(string); + resultCustom2.setCustomString(custom); + } + + @IgnoreClass + public static class ResultCustom { + private String string = null; + private String customString = null; + + public void setString(String string) { + this.string = string; + } + + public void setCustomString(String customString) { + this.customString = customString; + } + + public String getString() { + if (string == null) { + throw new NullPointerException(); + } + + return string; + } + + public String getCustomString() { + if (customString == null) { + throw new NullPointerException(); + } + + return customString; + } + + } + + + @IgnoreClass + public static class Result { + private int executions = 0; + private int firstIsNull = 0; + private int secondIsNull = 0; + + public void update(boolean firstIsNull, boolean secondIsNull) { + executions++; + + if (firstIsNull) { + this.firstIsNull++; + } + + if (secondIsNull) { + this.secondIsNull++; + } + } + + public void update(boolean firstIsNull) { + this.update(firstIsNull, false); + this.secondIsNull = -1; + } + + public int getExecutions() { + return executions; + } + + public int getFirstIsNull() { + return firstIsNull; + } + + public int getSecondIsNull() { + return secondIsNull; + } + } + +} + + diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/complete/TestSuggestionCommand.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/complete/TestSuggestionCommand.java index a4b4c2080..0d0e53769 100644 --- a/litecommands-core/src/test/java/dev/rollczi/litecommands/complete/TestSuggestionCommand.java +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/complete/TestSuggestionCommand.java @@ -1,6 +1,6 @@ package dev.rollczi.litecommands.complete; -import dev.rollczi.litecommands.EmptyTestSender; +import dev.rollczi.litecommands.LiteTestSender; import dev.rollczi.litecommands.annotations.Arg; import dev.rollczi.litecommands.annotations.Execute; import dev.rollczi.litecommands.annotations.Required; @@ -23,7 +23,7 @@ public void execute() {} @Execute(route = "move") @Required(1) - public void executeMove(@Arg(0) EmptyTestSender sender) { + public void executeMove(@Arg(0) LiteTestSender sender) { } diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/component/LiteComponentContextOfResolvingTest.kt b/litecommands-core/src/test/java/dev/rollczi/litecommands/component/LiteComponentContextOfResolvingTest.kt index 7e595d5b9..66283ec55 100644 --- a/litecommands-core/src/test/java/dev/rollczi/litecommands/component/LiteComponentContextOfResolvingTest.kt +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/component/LiteComponentContextOfResolvingTest.kt @@ -1,6 +1,6 @@ package dev.rollczi.litecommands.component -import dev.rollczi.litecommands.EmptyTestSender +import dev.rollczi.litecommands.LiteTestSender import dev.rollczi.litecommands.LiteCommandsSpec import dev.rollczi.litecommands.LiteInvocation import dev.rollczi.litecommands.scope.ScopeMetaData @@ -16,19 +16,19 @@ class LiteComponentContextOfResolvingTest : LiteCommandsSpec() { private var dataAc : LiteComponent.ContextOfResolving = LiteComponent.ContextOfResolving.create( LiteInvocation( "ac", - EmptyTestSender(), arrayOf() + LiteTestSender(), arrayOf() ) ) private var dataAcWithArgs : LiteComponent.ContextOfResolving = LiteComponent.ContextOfResolving.create( LiteInvocation( "ac", - EmptyTestSender(), arrayOf("test") + LiteTestSender(), arrayOf("test") ) ) private var dataAcHelp : LiteComponent.ContextOfResolving = LiteComponent.ContextOfResolving.create( LiteInvocation( "ac", - EmptyTestSender(), arrayOf("help") + LiteTestSender(), arrayOf("help") ) ) diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/component/LiteComponentImplementationsTest.kt b/litecommands-core/src/test/java/dev/rollczi/litecommands/component/LiteComponentImplementationsTest.kt index 40d799b77..eadd643ba 100644 --- a/litecommands-core/src/test/java/dev/rollczi/litecommands/component/LiteComponentImplementationsTest.kt +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/component/LiteComponentImplementationsTest.kt @@ -1,6 +1,6 @@ package dev.rollczi.litecommands.component -import dev.rollczi.litecommands.EmptyTestSender +import dev.rollczi.litecommands.LiteTestSender import dev.rollczi.litecommands.LiteCommandsSpec import dev.rollczi.litecommands.LiteInvocation import org.junit.jupiter.api.Assertions.assertEquals @@ -12,21 +12,21 @@ class LiteComponentImplementationsTest : LiteCommandsSpec() { private var invocationAc : LiteComponent.ContextOfResolving = LiteComponent.ContextOfResolving.create( LiteInvocation( "ac", - EmptyTestSender(), arrayOf() + LiteTestSender(), arrayOf() ) ) // on command invocation /ac test private var invocationAcWithArgs : LiteComponent.ContextOfResolving = LiteComponent.ContextOfResolving.create( LiteInvocation( "ac", - EmptyTestSender(), arrayOf("test") + LiteTestSender(), arrayOf("test") ) ) // on command invocation /ac help private var invocationAcHelp : LiteComponent.ContextOfResolving = LiteComponent.ContextOfResolving.create( LiteInvocation( "ac", - EmptyTestSender(), arrayOf("help") + LiteTestSender(), arrayOf("help") ) ) diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/permssion/TestPermissionSender.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/permssion/TestPermissionSender.java index 22e5899ab..4acd03be4 100644 --- a/litecommands-core/src/test/java/dev/rollczi/litecommands/permssion/TestPermissionSender.java +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/permssion/TestPermissionSender.java @@ -1,12 +1,12 @@ package dev.rollczi.litecommands.permssion; -import dev.rollczi.litecommands.EmptyTestSender; +import dev.rollczi.litecommands.LiteTestSender; import java.util.Arrays; import java.util.HashSet; import java.util.Set; -public class TestPermissionSender extends EmptyTestSender { +public class TestPermissionSender extends LiteTestSender { private final Set permissions = new HashSet<>(); diff --git a/litecommands-velocity/src/main/java/dev/rollczi/litecommands/velocity/LiteVelocityFactory.java b/litecommands-velocity/src/main/java/dev/rollczi/litecommands/velocity/LiteVelocityFactory.java index 603f1dfa1..5e216f347 100644 --- a/litecommands-velocity/src/main/java/dev/rollczi/litecommands/velocity/LiteVelocityFactory.java +++ b/litecommands-velocity/src/main/java/dev/rollczi/litecommands/velocity/LiteVelocityFactory.java @@ -12,8 +12,8 @@ private LiteVelocityFactory() { } - public static LiteCommandsBuilder builder(ProxyServer proxy) { - return LiteFactory.builder() + public static LiteCommandsBuilder builder(ProxyServer proxy) { + return LiteFactory.builder() .bind(ProxyServer.class, proxy) .bind(CommandSource.class, new OriginalSenderBind()) .platform(new LiteVelocityPlatformManager(proxy));