From 956918ac43531444ee8a64322b04a22bb5550771 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Thu, 7 Jul 2022 19:10:16 +0200 Subject: [PATCH] Handle merge commands classes, improve builder API and 2.3.3 Release --- README.md | 10 ++--- build.gradle.kts | 2 +- examples/bukkit/build.gradle.kts | 2 +- litecommands-bukkit-adventure/README.md | 4 +- litecommands-bukkit/README.md | 4 +- litecommands-bungee/README.md | 4 +- .../litecommands/LiteCommandsBuilder.java | 4 +- .../litecommands/LiteCommandsPostProcess.java | 11 +++++ ...ocess.java => LiteCommandsPreProcess.java} | 2 +- .../litecommands/command/CommandService.java | 8 ++++ .../litecommands/command/section/Section.java | 2 - .../LiteCommandsBuilderImpl.java | 43 +++++++++++++------ .../implementation/LiteCommandsImpl.java | 12 ++---- .../MergeCommandClassesTest.java | 34 +++++++++++++++ litecommands-velocity/README.md | 4 +- 15 files changed, 106 insertions(+), 40 deletions(-) create mode 100644 litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsPostProcess.java rename litecommands-core/src/main/java/dev/rollczi/litecommands/{LiteCommandsProcess.java => LiteCommandsPreProcess.java} (84%) create mode 100644 litecommands-core/src/test/java/dev/rollczi/litecommands/implementation/MergeCommandClassesTest.java diff --git a/README.md b/README.md index b55efb56d..6d05bf395 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Helpful links: - [Support Discord](https://discord.gg/6cUhkj6uZJ) - [GitHub issues](https://github.com/Rollczi/LiteCommands/issues) -- [Example (Modern 2.3.2)](https://github.com/Rollczi/LiteCommands/tree/master/examples/bukkit) +- [Example (Modern 2.3.3)](https://github.com/Rollczi/LiteCommands/tree/master/examples/bukkit) - [Docs (Legacy 1.7.2)](https://docs.rollczi.dev/) ### Panda Repository (Maven or Gradle) ❤️ @@ -25,11 +25,11 @@ Framework Core dev.rollczi.litecommands core - 2.3.2 + 2.3.3 ``` ```groovy -implementation 'dev.rollczi.litecommands:core:2.3.2' +implementation 'dev.rollczi.litecommands:core:2.3.3' ``` ### First Simple Command @@ -64,11 +64,11 @@ Add this to your dependencies if you want use ready-made implementation for velo dev.rollczi.litecommands velocity - 2.3.2 + 2.3.3 ``` ```groovy -implementation 'dev.rollczi.litecommands:velocity:2.3.2' +implementation 'dev.rollczi.litecommands:velocity:2.3.3' ``` #### All extensions: diff --git a/build.gradle.kts b/build.gradle.kts index 9adde83b7..117deb652 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ plugins { allprojects { group = "dev.rollczi.litecommands" - version = "2.3.2" + version = "2.3.3" apply(plugin = "java-library") apply(plugin = "maven-publish") diff --git a/examples/bukkit/build.gradle.kts b/examples/bukkit/build.gradle.kts index 155d2e3aa..211d6d85a 100644 --- a/examples/bukkit/build.gradle.kts +++ b/examples/bukkit/build.gradle.kts @@ -10,7 +10,7 @@ repositories { dependencies { compileOnly("org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT") - // implementation("dev.rollczi.litecommands:bukkit:2.3.2") // <-- uncomment in your project + // implementation("dev.rollczi.litecommands:bukkit:2.3.3") // <-- uncomment in your project implementation(project(":litecommands-bukkit")) // don't use this line in your build.gradle testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1") diff --git a/litecommands-bukkit-adventure/README.md b/litecommands-bukkit-adventure/README.md index c6a20931f..96bb16b6b 100644 --- a/litecommands-bukkit-adventure/README.md +++ b/litecommands-bukkit-adventure/README.md @@ -4,10 +4,10 @@ Maven dev.rollczi.litecommands bukkit-adventure - 2.3.2 + 2.3.3 ``` Gradle ```groovy -implementation 'dev.rollczi.litecommands:bukkit-adventure:2.3.2' +implementation 'dev.rollczi.litecommands:bukkit-adventure:2.3.3' ``` diff --git a/litecommands-bukkit/README.md b/litecommands-bukkit/README.md index 7c57be8d3..8bc697163 100644 --- a/litecommands-bukkit/README.md +++ b/litecommands-bukkit/README.md @@ -4,12 +4,12 @@ Maven dev.rollczi.litecommands bukkit - 2.3.2 + 2.3.3 ``` Gradle ```groovy -implementation 'dev.rollczi.litecommands:bukkit:2.3.2' +implementation 'dev.rollczi.litecommands:bukkit:2.3.3' ``` #### Examples: diff --git a/litecommands-bungee/README.md b/litecommands-bungee/README.md index d4cc19718..c601335b2 100644 --- a/litecommands-bungee/README.md +++ b/litecommands-bungee/README.md @@ -4,12 +4,12 @@ Maven dev.rollczi.litecommands bungee - 2.3.2 + 2.3.3 ``` Gradle ```groovy -implementation 'dev.rollczi.litecommands:bungee:2.3.2' +implementation 'dev.rollczi.litecommands:bungee:2.3.3' ``` #### Examples: 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 6261f2d18..8e1aa8021 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java @@ -73,9 +73,9 @@ public interface LiteCommandsBuilder { Class getSenderType(); - LiteCommandsBuilder beforeRegister(LiteCommandsProcess preProcess); + LiteCommandsBuilder beforeRegister(LiteCommandsPreProcess preProcess); - LiteCommandsBuilder afterRegister(LiteCommandsProcess postProcess); + LiteCommandsBuilder afterRegister(LiteCommandsPostProcess postProcess); LiteCommands register(); diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsPostProcess.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsPostProcess.java new file mode 100644 index 000000000..1079dc708 --- /dev/null +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsPostProcess.java @@ -0,0 +1,11 @@ +package dev.rollczi.litecommands; + +import dev.rollczi.litecommands.command.CommandService; +import dev.rollczi.litecommands.injector.Injector; +import dev.rollczi.litecommands.platform.RegistryPlatform; + +public interface LiteCommandsPostProcess { + + void process(LiteCommandsBuilder builder, RegistryPlatform platform, Injector injector, CommandService commandService); + +} diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsProcess.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsPreProcess.java similarity index 84% rename from litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsProcess.java rename to litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsPreProcess.java index 51f3584bb..006334c32 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsProcess.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsPreProcess.java @@ -3,7 +3,7 @@ import dev.rollczi.litecommands.injector.Injector; import dev.rollczi.litecommands.platform.RegistryPlatform; -public interface LiteCommandsProcess { +public interface LiteCommandsPreProcess { void process(LiteCommandsBuilder builder, RegistryPlatform platform, Injector injector); diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/command/CommandService.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/command/CommandService.java index 738f07136..351d976fa 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/command/CommandService.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/command/CommandService.java @@ -48,4 +48,12 @@ public void register(CommandSection section) { ); } + public RegistryPlatform getPlatform() { + return platform; + } + + public ExecuteResultHandler getHandler() { + return handler; + } + } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/command/section/Section.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/command/section/Section.java index 87cee5cbe..7572ab1e8 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/command/section/Section.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/command/section/Section.java @@ -15,8 +15,6 @@ String[] aliases() default {}; - int priority() default -1; - int required() default -1; FactoryAnnotationResolver
RESOLVER = new SectionAnnotationResolver(); diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/implementation/LiteCommandsBuilderImpl.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/implementation/LiteCommandsBuilderImpl.java index c97f330a9..6027a60eb 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/implementation/LiteCommandsBuilderImpl.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/implementation/LiteCommandsBuilderImpl.java @@ -2,7 +2,8 @@ import dev.rollczi.litecommands.LiteCommands; import dev.rollczi.litecommands.LiteCommandsBuilder; -import dev.rollczi.litecommands.LiteCommandsProcess; +import dev.rollczi.litecommands.LiteCommandsPostProcess; +import dev.rollczi.litecommands.LiteCommandsPreProcess; import dev.rollczi.litecommands.argument.Arg; import dev.rollczi.litecommands.argument.Argument; import dev.rollczi.litecommands.argument.simple.MultilevelArgument; @@ -33,8 +34,10 @@ import panda.std.Option; import java.lang.annotation.Annotation; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; @@ -49,8 +52,8 @@ class LiteCommandsBuilderImpl implements LiteCommandsBuilder { private RegistryPlatform registryPlatform; private CommandStateFactory commandStateFactory; - private LiteCommandsProcess preProcess = (builder, platform, injector) -> {}; - private LiteCommandsProcess postProcess = (builder, platform, injector) -> {}; + private LiteCommandsPreProcess preProcess = (builder, platform, injector) -> {}; + private LiteCommandsPostProcess postProcess = (builder, platform, injector, commandService) -> {}; private final Set>> commandStateFactoryEditors = new HashSet<>(); private final CommandEditorRegistry editorRegistry = new CommandEditorRegistry(); @@ -216,13 +219,13 @@ public Class getSenderType() { } @Override - public LiteCommandsBuilder beforeRegister(LiteCommandsProcess preProcess) { + public LiteCommandsBuilder beforeRegister(LiteCommandsPreProcess preProcess) { this.preProcess = preProcess; return this; } @Override - public LiteCommandsBuilder afterRegister(LiteCommandsProcess postProcess) { + public LiteCommandsBuilder afterRegister(LiteCommandsPostProcess postProcess) { this.postProcess = postProcess; return this; } @@ -233,10 +236,12 @@ public LiteCommands register() { throw new IllegalStateException("Registry platform is not set"); } + this.preProcess.process(this, this.registryPlatform, this.injectorSettings.create()); + CommandService commandService = new CommandService<>(this.registryPlatform, this.executeResultHandler); Injector injector = this.injectorSettings.create(); - LiteCommands commands = new LiteCommandsImpl<>(senderType, registryPlatform, executeResultHandler, injector); + LiteCommands liteCommands = new LiteCommandsImpl<>(commandService, senderType, injector); if (this.commandStateFactory == null) { this.commandStateFactory = new LiteCommandFactory<>(injector, this.argumentsRegistry, this.editorRegistry); @@ -252,12 +257,13 @@ public LiteCommands register() { this.commandsInstances.add(command); } - } catch (Throwable throwable) { - throw new RuntimeException(throwable); + } catch (Exception exception) { + throw new RuntimeException(exception); } - CommandService service = commands.getCommandService(); + List> commandSections = new ArrayList<>(); + root: for (Object instance : commandsInstances) { Option> option = this.commandStateFactory.create(instance); @@ -265,12 +271,25 @@ public LiteCommands register() { continue; } - service.register(option.get()); + CommandSection currentCommand = option.get(); + + for (CommandSection commandSection : commandSections) { + if (commandSection.isSimilar(currentCommand.getName())) { + commandSection.mergeSection(currentCommand); + continue root; + } + } + + commandSections.add(currentCommand); + } + + for (CommandSection commandSection : commandSections) { + commandService.register(commandSection); } - this.postProcess.process(this, this.registryPlatform, injector); + this.postProcess.process(this, this.registryPlatform, injector, commandService); - return commands; + return liteCommands; } public static LiteCommandsBuilder builder(Class senderType) { diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/implementation/LiteCommandsImpl.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/implementation/LiteCommandsImpl.java index 87521efc1..7b31f24da 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/implementation/LiteCommandsImpl.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/implementation/LiteCommandsImpl.java @@ -9,17 +9,13 @@ class LiteCommandsImpl implements LiteCommands { private final CommandService commandService; - private final RegistryPlatform platform; private final Injector injector; private final Class senderType; - private final ExecuteResultHandler executeResultHandler; - LiteCommandsImpl(Class senderType, RegistryPlatform platform, ExecuteResultHandler handler, Injector injector) { + LiteCommandsImpl(CommandService commandService, Class senderType,Injector injector) { + this.commandService = commandService; this.senderType = senderType; this.injector = injector; - this.commandService = new CommandService<>(platform, handler); - this.platform = platform; - this.executeResultHandler = handler; } @Override @@ -29,7 +25,7 @@ public CommandService getCommandService() { @Override public RegistryPlatform getPlatform() { - return this.platform; + return this.commandService.getPlatform(); } @Override @@ -44,7 +40,7 @@ public Class getSenderType() { @Override public ExecuteResultHandler getExecuteResultHandler() { - return executeResultHandler; + return this.commandService.getHandler(); } } diff --git a/litecommands-core/src/test/java/dev/rollczi/litecommands/implementation/MergeCommandClassesTest.java b/litecommands-core/src/test/java/dev/rollczi/litecommands/implementation/MergeCommandClassesTest.java new file mode 100644 index 000000000..ee7845e47 --- /dev/null +++ b/litecommands-core/src/test/java/dev/rollczi/litecommands/implementation/MergeCommandClassesTest.java @@ -0,0 +1,34 @@ +package dev.rollczi.litecommands.implementation; + +import dev.rollczi.litecommands.TestFactory; +import dev.rollczi.litecommands.TestPlatform; +import dev.rollczi.litecommands.argument.Arg; +import dev.rollczi.litecommands.command.execute.Execute; +import dev.rollczi.litecommands.command.section.Section; +import org.junit.jupiter.api.Test; + +class MergeCommandClassesTest { + + TestPlatform platform = TestFactory.withCommands(FirstCommandClass.class, SecondCommandClass.class); + + @Section(route = "test") + static class FirstCommandClass { + @Execute(route = "set") public static String set(@Arg String name, @Arg String value) { + return name + " -> " + value; + } + } + + @Section(route = "test") + static class SecondCommandClass { + @Execute(route = "unset") public static String get(@Arg String name) { + return name + " value"; + } + } + + @Test + void test() { + platform.execute("test", "unset", "Rollczi").assertResult("Rollczi value"); + platform.execute("test", "set", "Rollczi", "vip").assertResult("Rollczi -> vip"); + } + +} diff --git a/litecommands-velocity/README.md b/litecommands-velocity/README.md index a3ad832a5..58aff5c69 100644 --- a/litecommands-velocity/README.md +++ b/litecommands-velocity/README.md @@ -4,12 +4,12 @@ Maven dev.rollczi.litecommands velocity - 2.3.2 + 2.3.3 ``` Gradle ```groovy -implementation 'dev.rollczi.litecommands:velocity:2.3.2' +implementation 'dev.rollczi.litecommands:velocity:2.3.3' ``` #### Examples: