From 19e917deabe33474daaf93d23ef9eaa025fc614c Mon Sep 17 00:00:00 2001 From: Voinea Radu Date: Sat, 7 Sep 2024 06:44:55 +0300 Subject: [PATCH] Updated a lot of features --- Common/build.gradle.kts | 77 ----- .../common/annotation/Command.java | 31 -- .../common/command/CommonCommandImpl.java | 30 -- .../command/ICommandAnnotationWrapper.java | 45 --- .../common/command/ICommonCommand.java | 171 ----------- .../common/dto/CommandLang.java | 10 - .../common/manager/CommonCommandManager.java | 156 ---------- .../common/utils/ListUtils.java | 21 -- Common/src/main/resources/plugin.yml | 5 - Fabric/build.gradle.kts | 71 ----- .../fabric/command/BaseCommand.java | 269 ------------------ .../fabric/manager/CommandManager.java | 43 --- Fabric/src/main/resources/fabric.mod.json | 20 -- Forge/build.gradle.kts | 89 ------ .../forge/command/BaseCommand.java | 176 ------------ .../forge/manager/CommandManager.java | 44 --- README.md | 164 +---------- Spigot/build.gradle.kts | 67 ----- .../spigot/command/BaseCommand.java | 215 -------------- .../spigot/manager/CommandManager.java | 43 --- Spigot/src/main/resources/plugin.yml | 5 - Velocity/build.gradle.kts | 71 ----- .../velocity/command/BaseCommand.java | 199 ------------- .../velocity/manager/CommandManager.java | 43 --- build.gradle.kts | 83 +++++- gradle/libs.versions.toml | 37 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- readme/description.md | 2 - readme/how.md | 80 ------ settings.gradle.kts | 25 +- src/common/build.gradle.kts | 5 + .../common/annotation/Command.java | 25 ++ .../common/command/CommonCommand.java | 193 +++++++++++++ .../common/exception/CommandNotAnnotated.java | 8 + .../common/manager/CommonCommandManager.java | 139 +++++++++ .../manager/CommonMiniMessageManager.java | 62 ++++ .../common/utils/CommonPermissionUtils.java | 12 +- .../common/utils/ListUtils.java | 13 + src/fabric_1_19/build.gradle.kts | 42 +++ .../fabric/command/FabricCommand.java | 178 ++++++++++++ .../fabric/manager/FabricCommandManager.java | 69 +++++ .../manager/FabricMiniMessageManager.java | 34 +++ .../resources/assets/command_manager/icon.png | Bin 0 -> 561 bytes .../src/main/resources/fabric.mod.json | 20 ++ src/velocity/build.gradle.kts | 11 + .../velocity/command/VelocityCommand.java | 144 ++++++++++ .../manager/VelocityCommandManager.java | 55 ++++ .../manager/VelocityMiniMessageManager.java | 20 ++ 48 files changed, 1128 insertions(+), 2196 deletions(-) delete mode 100644 Common/build.gradle.kts delete mode 100644 Common/src/main/java/dev/lightdream/commandmanager/common/annotation/Command.java delete mode 100644 Common/src/main/java/dev/lightdream/commandmanager/common/command/CommonCommandImpl.java delete mode 100644 Common/src/main/java/dev/lightdream/commandmanager/common/command/ICommandAnnotationWrapper.java delete mode 100644 Common/src/main/java/dev/lightdream/commandmanager/common/command/ICommonCommand.java delete mode 100644 Common/src/main/java/dev/lightdream/commandmanager/common/dto/CommandLang.java delete mode 100644 Common/src/main/java/dev/lightdream/commandmanager/common/manager/CommonCommandManager.java delete mode 100644 Common/src/main/java/dev/lightdream/commandmanager/common/utils/ListUtils.java delete mode 100644 Common/src/main/resources/plugin.yml delete mode 100644 Fabric/build.gradle.kts delete mode 100644 Fabric/src/main/java/dev/lightdream/commandmanager/fabric/command/BaseCommand.java delete mode 100644 Fabric/src/main/java/dev/lightdream/commandmanager/fabric/manager/CommandManager.java delete mode 100644 Fabric/src/main/resources/fabric.mod.json delete mode 100644 Forge/build.gradle.kts delete mode 100644 Forge/src/main/java/dev/lightdream/commandmanager/forge/command/BaseCommand.java delete mode 100644 Forge/src/main/java/dev/lightdream/commandmanager/forge/manager/CommandManager.java delete mode 100644 Spigot/build.gradle.kts delete mode 100644 Spigot/src/main/java/dev/lightdream/commandmanager/spigot/command/BaseCommand.java delete mode 100644 Spigot/src/main/java/dev/lightdream/commandmanager/spigot/manager/CommandManager.java delete mode 100644 Spigot/src/main/resources/plugin.yml delete mode 100644 Velocity/build.gradle.kts delete mode 100644 Velocity/src/main/java/dev/lightdream/commandmanager/velocity/command/BaseCommand.java delete mode 100644 Velocity/src/main/java/dev/lightdream/commandmanager/velocity/manager/CommandManager.java delete mode 100644 readme/description.md delete mode 100644 readme/how.md create mode 100644 src/common/build.gradle.kts create mode 100644 src/common/src/main/java/com/voinearadu/commandmanager/common/annotation/Command.java create mode 100644 src/common/src/main/java/com/voinearadu/commandmanager/common/command/CommonCommand.java create mode 100644 src/common/src/main/java/com/voinearadu/commandmanager/common/exception/CommandNotAnnotated.java create mode 100644 src/common/src/main/java/com/voinearadu/commandmanager/common/manager/CommonCommandManager.java create mode 100644 src/common/src/main/java/com/voinearadu/commandmanager/common/manager/CommonMiniMessageManager.java rename Common/src/main/java/dev/lightdream/commandmanager/common/utils/PermissionUtils.java => src/common/src/main/java/com/voinearadu/commandmanager/common/utils/CommonPermissionUtils.java (63%) create mode 100644 src/common/src/main/java/com/voinearadu/commandmanager/common/utils/ListUtils.java create mode 100644 src/fabric_1_19/build.gradle.kts create mode 100644 src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/command/FabricCommand.java create mode 100644 src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/manager/FabricCommandManager.java create mode 100644 src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/manager/FabricMiniMessageManager.java create mode 100644 src/fabric_1_19/src/main/resources/assets/command_manager/icon.png create mode 100644 src/fabric_1_19/src/main/resources/fabric.mod.json create mode 100644 src/velocity/build.gradle.kts create mode 100644 src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/command/VelocityCommand.java create mode 100644 src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/manager/VelocityCommandManager.java create mode 100644 src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/manager/VelocityMiniMessageManager.java diff --git a/Common/build.gradle.kts b/Common/build.gradle.kts deleted file mode 100644 index 1328e95..0000000 --- a/Common/build.gradle.kts +++ /dev/null @@ -1,77 +0,0 @@ -plugins { - id("java-library") - id("maven-publish") -} - -group = "dev.lightdream" -version = libs.versions.project.get() - -dependencies { - // LightDream - api(libs.lightdream.logger) - api(libs.lightdream.lambda) - api(libs.lightdream.filemanager) - api(libs.lightdream.messagebuilder) - - // Reflections - api(libs.reflections) - - // Lombok - compileOnly(libs.lombok) - annotationProcessor(libs.lombok) - - // JetBrains - api(libs.jetbrains.annotations) - annotationProcessor(libs.jetbrains.annotations) - - // Dependencies - api(libs.luckperms) -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - -publishing { - publications { - create("maven") { - from(components["java"]) - } - } - repositories { - val githubURL = project.findProperty("github.url") ?: "" - val githubUsername = project.findProperty("github.auth.username") ?: "" - val githubPassword = project.findProperty("github.auth.password") ?: "" - - val selfURL = project.findProperty("self.url") ?: "" - val selfUsername = project.findProperty("self.auth.username") ?: "" - val selfPassword = project.findProperty("self.auth.password") ?: "" - - maven(url = githubURL as String) { - name = "github" - credentials(PasswordCredentials::class) { - username = githubUsername as String - password = githubPassword as String - } - } - - maven(url = selfURL as String) { - name = "self" - credentials(PasswordCredentials::class) { - username = selfUsername as String - password = selfPassword as String - } - } - } -} - -tasks.register("publishGitHub") { - dependsOn("publishMavenPublicationToGithubRepository") - description = "Publishes to GitHub" -} - -tasks.register("publishSelf") { - dependsOn("publishMavenPublicationToSelfRepository") - description = "Publishes to Self hosted repository" -} diff --git a/Common/src/main/java/dev/lightdream/commandmanager/common/annotation/Command.java b/Common/src/main/java/dev/lightdream/commandmanager/common/annotation/Command.java deleted file mode 100644 index e9061a6..0000000 --- a/Common/src/main/java/dev/lightdream/commandmanager/common/annotation/Command.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.lightdream.commandmanager.common.annotation; - -import dev.lightdream.commandmanager.common.command.ICommonCommand; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface Command { - - String name(); - - String[] aliases() default {}; - - String permission() default ""; - - String usage() default ""; - - boolean onlyForPlayers() default false; - - boolean onlyForConsole() default false; - - int minimumArgs() default 0; - - Class parent() default ICommonCommand.class; - - boolean autoRegister() default false; -} diff --git a/Common/src/main/java/dev/lightdream/commandmanager/common/command/CommonCommandImpl.java b/Common/src/main/java/dev/lightdream/commandmanager/common/command/CommonCommandImpl.java deleted file mode 100644 index 314634d..0000000 --- a/Common/src/main/java/dev/lightdream/commandmanager/common/command/CommonCommandImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package dev.lightdream.commandmanager.common.command; - -import dev.lightdream.commandmanager.common.annotation.Command; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter @Setter -public abstract class CommonCommandImpl implements ICommonCommand { - - private Command commandAnnotation; - private ICommonCommand parentCommand; - private List subCommands; - private @Getter boolean enabled = true; - - public CommonCommandImpl() { - init(); - } - - @Override - public void disable() { - this.enabled = false; - } - - @Override - public void enable() { - this.enabled = true; - } -} diff --git a/Common/src/main/java/dev/lightdream/commandmanager/common/command/ICommandAnnotationWrapper.java b/Common/src/main/java/dev/lightdream/commandmanager/common/command/ICommandAnnotationWrapper.java deleted file mode 100644 index 1f1fbbc..0000000 --- a/Common/src/main/java/dev/lightdream/commandmanager/common/command/ICommandAnnotationWrapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package dev.lightdream.commandmanager.common.command; - -import dev.lightdream.commandmanager.common.annotation.Command; - -public interface ICommandAnnotationWrapper { - - Command getCommandAnnotation(); - - void setCommandAnnotation(Command commandAnnotation); - - default String[] getCommandAliases() { - return getCommandAnnotation().aliases(); - } - - default String[] getNames() { - String[] names = new String[getCommandAliases().length + 1]; - names[0] = getName(); - for (int i = 0; i < getCommandAliases().length; i++) { - names[i + 1] = getCommandAliases()[i]; - } - return names; - } - - default String getUsage() { - return getCommandAnnotation().usage(); - } - - default boolean onlyForPlayers() { - return getCommandAnnotation().onlyForPlayers(); - } - - default boolean onlyForConsole() { - return getCommandAnnotation().onlyForConsole(); - } - - default int getMinimumArgs() { - return getCommandAnnotation().minimumArgs(); - } - - default String getName() { - return getCommandAnnotation().name(); - } - - -} diff --git a/Common/src/main/java/dev/lightdream/commandmanager/common/command/ICommonCommand.java b/Common/src/main/java/dev/lightdream/commandmanager/common/command/ICommonCommand.java deleted file mode 100644 index 9599edd..0000000 --- a/Common/src/main/java/dev/lightdream/commandmanager/common/command/ICommonCommand.java +++ /dev/null @@ -1,171 +0,0 @@ -package dev.lightdream.commandmanager.common.command; - -import dev.lightdream.commandmanager.common.annotation.Command; -import dev.lightdream.commandmanager.common.manager.CommonCommandManager; -import dev.lightdream.logger.Logger; -import dev.lightdream.messagebuilder.MessageBuilder; -import org.reflections.Reflections; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public interface ICommonCommand extends ICommandAnnotationWrapper { - - default void init() { - if (!getClass().isAnnotationPresent(Command.class)) { - Logger.error("Class " + getClass().getName() + " is not annotated as @Command"); - return; - } - - Command command = getClass().getAnnotation(Command.class); - setCommandAnnotation(command); - - generateSubCommands(this); - - // If the command is a root command (has no parent) register it - if (command.parent() == ICommonCommand.class) { - for (String name : getNames()) { - if (registerCommand(name)) { - Logger.good("Command " + name + " initialized successfully"); - } else { - Logger.error("Command " + name + " could not be initialized"); - } - } - } - } - - default void generateSubCommands(ICommonCommand parentCommand) { - List subCommands = new ArrayList<>(); - - for (Class clazz : getSubCommandClasses()) { - subCommands.add( - CommonCommandManager.instance() - .initCommand(clazz, parentCommand) - ); - } - - setSubCommands(subCommands); - } - - // Platform specific - boolean registerCommand(String alias); - - void sendMessage(Object user, String message); - - boolean checkPermission(Object user, String permission); - - ICommonCommand getParentCommand(); - - // Utility methods - void setParentCommand(ICommonCommand parentCommandAnnotation); - - List getSubCommands(); - - void setSubCommands(List subCommands); - - - // Default utility methods - - default void sendUsage(Object user) { - StringBuilder helpCommandOutput = new StringBuilder(); - helpCommandOutput.append(getName()) - .append(" ") - .append(getUsage()); - helpCommandOutput.append("\n"); - - for (ICommonCommand subCommand : getSubCommands()) { - if (checkPermission(user, subCommand.getPermission())) { - helpCommandOutput.append(subCommand.getName()); - helpCommandOutput.append(" "); - helpCommandOutput.append(subCommand.getUsage()); - helpCommandOutput.append("\n"); - } - } - - sendMessage(user, new MessageBuilder(helpCommandOutput.toString())); - } - - @SuppressWarnings("unchecked") - default List> getSubCommandClasses() { - List> subCommands = new ArrayList<>(); - - Reflections reflections = CommonCommandManager.instance().reflections(); - Set> classes = new HashSet<>(); - - if (reflections != null) { - for (Class clazz : reflections.getTypesAnnotatedWith(Command.class)) { - if (ICommonCommand.class.isAssignableFrom(clazz)) { - classes.add((Class) clazz); - } - } - } else { - for (Class clazz : CommonCommandManager.instance().commandClasses()) { - if (ICommonCommand.class.isAssignableFrom(clazz)) { - classes.add(clazz); - } - } - } - - for (Class clazz : classes) { - if (!clazz.isAnnotationPresent(Command.class)) { - Logger.error("Class " + clazz.getName() + " is not annotated as @Command"); - continue; - } - - Command commandAnnotation = clazz.getAnnotation(Command.class); - - if (commandAnnotation.parent() == getClass()) { - subCommands.add(clazz); - } - } - - return subCommands; - } - - - default void sendMessage(Object user, MessageBuilder message) { - sendMessage(user, message.parse()); - } - - - default String getPermission() { - String annotationPermission = getCommandAnnotation().permission(); - String basePermission = CommonCommandManager.instance().basePermission(); - String commandPermission = getName(); - - if (annotationPermission != null && !annotationPermission.isEmpty()) { - commandPermission = annotationPermission; - } - - if (basePermission.isEmpty()) { - return commandPermission; - } - - if (!basePermission.endsWith(".")) { - basePermission = basePermission + "."; - } - - if (getCommandAnnotation().parent() != ICommonCommand.class && getCommandAnnotation().parent() != null) { - return getParentCommand().getPermission() + "." + commandPermission; - } - - return basePermission + commandPermission; - } - - - default List getSubCommandsHelpMessage() { - List output = new ArrayList<>(); - getSubCommands().forEach(command -> output.add( - "/" + this.getName() + " " + command.getName() + " " + - command.getUsage() - )); - return output; - } - - void disable(); - - void enable(); - -} diff --git a/Common/src/main/java/dev/lightdream/commandmanager/common/dto/CommandLang.java b/Common/src/main/java/dev/lightdream/commandmanager/common/dto/CommandLang.java deleted file mode 100644 index 110b34c..0000000 --- a/Common/src/main/java/dev/lightdream/commandmanager/common/dto/CommandLang.java +++ /dev/null @@ -1,10 +0,0 @@ -package dev.lightdream.commandmanager.common.dto; - -public class CommandLang { - - public String onlyFotPlayer = "This command can only be executed as a player."; - public String onlyForConsole = "This command can only be executed as Console."; - public String noPermission = "You do not have the permission to use this command."; - public String commandIsDisabled = "This command is disabled."; - -} diff --git a/Common/src/main/java/dev/lightdream/commandmanager/common/manager/CommonCommandManager.java b/Common/src/main/java/dev/lightdream/commandmanager/common/manager/CommonCommandManager.java deleted file mode 100644 index f18ea16..0000000 --- a/Common/src/main/java/dev/lightdream/commandmanager/common/manager/CommonCommandManager.java +++ /dev/null @@ -1,156 +0,0 @@ -package dev.lightdream.commandmanager.common.manager; - -import dev.lightdream.commandmanager.common.annotation.Command; -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.dto.CommandLang; -import dev.lightdream.logger.Logger; -import lombok.Builder; -import lombok.Getter; -import lombok.experimental.Accessors; -import org.reflections.Reflections; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -@Getter -@Accessors(chain = true, fluent = true) -public class CommonCommandManager { - - protected static @Getter CommonCommandManager instance = null; - - private final List commands = new ArrayList<>(); - - private final Reflections reflections; - private final boolean autoRegister; - private final CommandLang lang; - private final Set> commandClasses; - private final String basePermission; - - public static T applyDefaults(T builder) { - //noinspection unchecked - return (T) builder - .lang(new CommandLang()) - .basePermission("") - .commandClasses(new HashSet<>()) - .autoRegister(true); - } - - public static class CommonBuilder{ - public CommonBuilder(){ - } - } - - - @Builder(builderClassName = "CommonBuilder") - protected CommonCommandManager(Reflections reflections, CommandLang lang, - Set> commandClasses, String basePermission, - boolean autoRegister) { - instance = this; - - this.reflections = reflections; - this.autoRegister = autoRegister; - this.lang = lang; - this.basePermission = basePermission; - - Set> classes = new HashSet<>(); - - if (reflections != null) { - for (Class clazz : reflections.getTypesAnnotatedWith(Command.class)) { - if (!ICommonCommand.class.isAssignableFrom(clazz)) { - Logger.error("Class " + clazz.getName() + " does not extend CommonCommand"); - continue; - } - //noinspection unchecked - classes.add((Class) clazz); - } - } else { - classes = commandClasses; - } - - this.commandClasses = classes; - - - if (autoRegister) { - generateCommands(); - } - } - - public static void generateCommands() { - for (Class clazz : instance().commandClasses()) { - Command command = clazz.getAnnotation(Command.class); - if (command.parent() != ICommonCommand.class) { - continue; - } - - if (!command.autoRegister()) { - continue; - } - - registerCommand(clazz); - } - } - - public static void registerCommand(Class commandClazz) { - for (ICommonCommand command : instance().commands()) { - if (command.getClass().equals(commandClazz)) { - command.enable(); - return; - } - } - - ICommonCommand commandObject = initCommand(commandClazz); - if (commandObject == null) { - return; - } - - instance().commands().add(commandObject); - } - - @SuppressWarnings("unused") - public static void unregisterCommand(Class commandClazz) { - for (ICommonCommand command : instance().commands()) { - if (command.getClass().equals(commandClazz)) { - command.disable(); - return; - } - } - } - - public static ICommonCommand initCommand(Class commandClass) { - ICommonCommand command; - Constructor constructor; - - try { - //noinspection unchecked - constructor = (Constructor) commandClass.getDeclaredConstructor(); - } catch (NoSuchMethodException e) { - Logger.error("There is no `no args constructor` for command " + commandClass.getName()); - return null; - } - - try { - command = constructor.newInstance(); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - //noinspection CallToPrintStackTrace - e.printStackTrace(); - return null; - } - - return command; - } - - public ICommonCommand initCommand(Class commandClass, ICommonCommand parentCommand) { - ICommonCommand command = initCommand(commandClass); - - if(command==null){ - return null; - } - - command.setParentCommand(parentCommand); - return command; - } -} diff --git a/Common/src/main/java/dev/lightdream/commandmanager/common/utils/ListUtils.java b/Common/src/main/java/dev/lightdream/commandmanager/common/utils/ListUtils.java deleted file mode 100644 index cf4494d..0000000 --- a/Common/src/main/java/dev/lightdream/commandmanager/common/utils/ListUtils.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.lightdream.commandmanager.common.utils; - -import java.util.List; -import java.util.stream.Collectors; - -public class ListUtils { - - public static String listToString(List list, String separator) { - StringBuilder sb = new StringBuilder(); - for (String s : list) { - sb.append(s); - sb.append(separator); - } - return sb.toString(); - } - - public static List getListThatStartsWith(List list, String prefix) { - return list.stream().filter(s -> s.toLowerCase().startsWith(prefix.toLowerCase())).collect(Collectors.toList()); - } - -} diff --git a/Common/src/main/resources/plugin.yml b/Common/src/main/resources/plugin.yml deleted file mode 100644 index 2cf0f5c..0000000 --- a/Common/src/main/resources/plugin.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: Fly -version: '${project.version}' -main: dev.lightdream.commandmanager.Main -authors: [ LightDream ] -website: https://lightdream.dev diff --git a/Fabric/build.gradle.kts b/Fabric/build.gradle.kts deleted file mode 100644 index bebabf5..0000000 --- a/Fabric/build.gradle.kts +++ /dev/null @@ -1,71 +0,0 @@ -plugins { - id("fabric-loom") version "1.0-SNAPSHOT" - id("maven-publish") - id("java-library") -} - -version = libs.versions.project.get() -group = "dev.lightdream" - -dependencies { - minecraft(libs.minecraft.v20) - mappings("net.fabricmc:yarn:${libs.versions.yarn.mappings.get()}:v2") - - modImplementation(libs.fabric.loader) - modImplementation(libs.fabric.api) - - api(project(":command-manager-common")) - - api(libs.luckperms) - - compileOnly(libs.lombok) - annotationProcessor(libs.lombok) -} - -publishing { - publications { - create("maven") { - from(components["java"]) - } - } - repositories { - val githubURL = project.findProperty("github.url") ?: "" - val githubUsername = project.findProperty("github.auth.username") ?: "" - val githubPassword = project.findProperty("github.auth.password") ?: "" - - val selfURL = project.findProperty("self.url") ?: "" - val selfUsername = project.findProperty("self.auth.username") ?: "" - val selfPassword = project.findProperty("self.auth.password") ?: "" - - maven(url = githubURL as String) { - name = "github" - credentials(PasswordCredentials::class) { - username = githubUsername as String - password = githubPassword as String - } - } - - maven(url = selfURL as String) { - name = "self" - credentials(PasswordCredentials::class) { - username = selfUsername as String - password = selfPassword as String - } - } - } -} - -tasks.register("publishGitHub") { - dependsOn("publishMavenPublicationToGithubRepository") - description = "Publishes to GitHub" -} - -tasks.register("publishSelf") { - dependsOn("publishMavenPublicationToSelfRepository") - description = "Publishes to Self hosted repository" -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 -} diff --git a/Fabric/src/main/java/dev/lightdream/commandmanager/fabric/command/BaseCommand.java b/Fabric/src/main/java/dev/lightdream/commandmanager/fabric/command/BaseCommand.java deleted file mode 100644 index aa30e93..0000000 --- a/Fabric/src/main/java/dev/lightdream/commandmanager/fabric/command/BaseCommand.java +++ /dev/null @@ -1,269 +0,0 @@ -package dev.lightdream.commandmanager.fabric.command; - -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.suggestion.Suggestion; -import com.mojang.brigadier.suggestion.SuggestionProvider; -import com.mojang.brigadier.suggestion.Suggestions; -import dev.lightdream.commandmanager.common.command.CommonCommandImpl; -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.utils.ListUtils; -import dev.lightdream.commandmanager.common.utils.PermissionUtils; -import dev.lightdream.commandmanager.fabric.manager.CommandManager; -import dev.lightdream.logger.Logger; -import lombok.SneakyThrows; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.command.CommandOutput; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.dedicated.MinecraftDedicatedServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -import static net.minecraft.server.command.CommandManager.literal; - -@SuppressWarnings("unused") -public class BaseCommand extends CommonCommandImpl { - - public static String commandSourceFiled = "field_9819"; - - public @NotNull List> getArguments() { - return new ArrayList<>(); - } - - public boolean optionalArguments() { - return false; - } - - protected LiteralArgumentBuilder getCommandBuilder(String name) { - LiteralArgumentBuilder command = literal(name); - - if (optionalArguments()) { - command.executes(this::executeCatch); - } - - List subCommands = getSubCommands(); - List> arguments = getArguments(); - - if (subCommands == null) { - subCommands = new ArrayList<>(); - } - - for (ICommonCommand subCommandObject : subCommands) { - BaseCommand subCommand = (BaseCommand) subCommandObject; - for (String subName : subCommand.getNames()) { - command.then(subCommand.getCommandBuilder(subName)); - } - } - - List> processedArguments = new ArrayList<>(); - - for (ArgumentBuilder rawArgument : arguments) { - if (rawArgument instanceof RequiredArgumentBuilder requiredArgumentBuilder) { - RequiredArgumentBuilder argument; - - try { - //noinspection unchecked - argument = (RequiredArgumentBuilder) requiredArgumentBuilder; - } catch (Exception e) { - //noinspection CallToPrintStackTrace - e.printStackTrace(); - processedArguments.add(rawArgument); - continue; - } - - if (!(argument.getType() instanceof StringArgumentType)) { - processedArguments.add(rawArgument); - continue; - } - - SuggestionProvider argumentSuggestionProvider = argument.getSuggestionsProvider(); - - argument.suggests( - (context, builder) -> { - SuggestionProvider suggestionProvider = argumentSuggestionProvider; - - - if (suggestionProvider == null) { - suggestionProvider = (tmpContext, tmpBuilder) -> Suggestions.empty(); - } - - CompletableFuture suggestionsFuture = - suggestionProvider.getSuggestions(context, builder); - Suggestions suggestions; - - try { - suggestions = suggestionsFuture.get(); - } catch (InterruptedException | ExecutionException e) { - return builder.buildFuture(); - } - - List suggestionList = new ArrayList<>(); - - for (Suggestion suggestion : suggestions.getList()) { - suggestionList.add(suggestion.getText()); - } - - String value = builder.getRemaining(); - suggestionList = ListUtils.getListThatStartsWith(suggestionList, value); - - builder = builder.restart(); - - for (String suggestionString : suggestionList) { - builder.suggest(suggestionString); - } - - return builder.buildFuture(); - } - ); - - processedArguments.add(argument); - continue; - } - - processedArguments.add(rawArgument); - } - - arguments = processedArguments; - - ArgumentBuilder then = null; - - if (!arguments.isEmpty()) { - arguments.get(arguments.size() - 1).executes(this::executeCatch); - if (arguments.size() != 1) { - for (int index = arguments.size() - 2; index >= 0; index--) { - arguments.get(index).then(arguments.get(index + 1)); - } - } - then = arguments.get(0); - } else { - command.executes(this::executeCatch); - } - - if (then != null) { - command.then(then); - } - - return command; - } - - @SuppressWarnings("resource") - @Override - public final boolean registerCommand(String name) { - CommandManager.instance().server().getCommandManager().getDispatcher().register(getCommandBuilder(name)); - CommandManager.instance().server().getPlayerManager().getPlayerList().forEach(player -> - CommandManager.instance().server().getCommandManager().sendCommandTree(player) - ); - - return true; - } - - @SneakyThrows - private CommandOutput getSource(CommandContext context) { - Field field = ServerCommandSource.class.getDeclaredField(commandSourceFiled); - field.setAccessible(true); - return (CommandOutput) field.get(context.getSource()); - } - - public final int executeCatch(CommandContext context) { - try { - return execute(context); - } catch (Throwable t) { - //noinspection CallToPrintStackTrace - t.printStackTrace(); - } - return 0; - } - - @SuppressWarnings("SameReturnValue") - public final int execute(CommandContext context) { - CommandOutput source = getSource(context); - - if (!isEnabled()) { - sendMessage(source, CommandManager.instance().lang().commandIsDisabled); - return 0; - } - - if (!checkPermission(source, getPermission())) { - sendMessage(source, CommandManager.instance().lang().noPermission); - return 0; - } - - if (onlyForConsole()) { - if (!(source instanceof MinecraftServer consoleSource)) { - sendMessage(source, CommandManager.instance().lang().onlyForConsole); - return 0; - } - exec(consoleSource, context); - return 0; - } - if (onlyForPlayers()) { - if (!(source instanceof ServerPlayerEntity player)) { - sendMessage(source, CommandManager.instance().lang().onlyFotPlayer); - return 0; - } - exec(player, context); - return 0; - } - - exec(source, context); - return 0; - } - - public void exec(@NotNull CommandOutput source, @NotNull CommandContext context) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for Console, but the command is not implemented. Exec type: ConsoleSource, CommandContext"); - } - - sendMessage(source, ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - public void exec(@NotNull MinecraftServer console, @NotNull CommandContext context) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for Console, but the command is not implemented. Exec type: ConsoleSource, CommandContext"); - } - - sendMessage(console, ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - public void exec(@NotNull ServerPlayerEntity player, @NotNull CommandContext context) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for " + player.getName() + ", but the command is not implemented. Exec type: User, CommandContext"); - } - - sendMessage(player, ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - @Override - public final boolean checkPermission(Object sender, String permission) { - if (sender instanceof ServerPlayerEntity player) { - return PermissionUtils.checkPermission(sender, permission); - } - - return sender instanceof MinecraftDedicatedServer source; - } - - @Override - public final void sendMessage(Object user, String message) { - if (user instanceof ServerPlayerEntity player) { - player.sendMessage(Text.of(message)); - return; - } - if (user instanceof MinecraftDedicatedServer source) { - source.sendMessage(net.minecraft.text.Text.of(message)); - return; - } - - throw new RuntimeException("Can only send messages to objects of type ServerPlayerEntity and MinecraftDedicatedServer." + - " Trying to send message to " + user.getClass()); - } -} diff --git a/Fabric/src/main/java/dev/lightdream/commandmanager/fabric/manager/CommandManager.java b/Fabric/src/main/java/dev/lightdream/commandmanager/fabric/manager/CommandManager.java deleted file mode 100644 index 2c8ff01..0000000 --- a/Fabric/src/main/java/dev/lightdream/commandmanager/fabric/manager/CommandManager.java +++ /dev/null @@ -1,43 +0,0 @@ -package dev.lightdream.commandmanager.fabric.manager; - -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.dto.CommandLang; -import dev.lightdream.commandmanager.common.manager.CommonCommandManager; -import lombok.Getter; -import lombok.experimental.Accessors; -import net.minecraft.server.MinecraftServer; -import org.reflections.Reflections; - -import java.util.Set; - -@Getter -@Accessors(chain = true, fluent = true) -public class CommandManager extends CommonCommandManager { - - private final MinecraftServer server; - - @lombok.Builder(builderClassName = "Builder") - public CommandManager(Reflections reflections, CommandLang lang, - Set> commandClasses, String basePermission, - boolean autoRegister, MinecraftServer server) { - super(reflections, lang, commandClasses, basePermission, autoRegister); - - this.server = server; - } - - public static CommandManager instance(){ - return (CommandManager) instance; - } - - @SuppressWarnings("unused") - public static Builder builder(){ - return applyDefaults(new Builder()); - } - - public static class Builder extends CommonBuilder{ - public Builder(){ - super(); - } - } - -} diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json deleted file mode 100644 index 1c060ae..0000000 --- a/Fabric/src/main/resources/fabric.mod.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "schemaVersion": 1, - "id": "command_manager_fabric_19", - "version": "UNKNOWN", - "name": "Command Manager Fabric 1.19", - "description": "", - "authors": [], - "contact": { - "repo": "https://github.com/PokeNinjas/Fabric_1_19" - }, - "license": "All-Rights-Reserved", - "icon": "assets/Fabric_1_19/icon.png", - "environment": "server", - "entrypoints": { - "client": [], - "main": [] - }, - "mixins": [], - "depends": {} -} diff --git a/Forge/build.gradle.kts b/Forge/build.gradle.kts deleted file mode 100644 index 7d2f4ab..0000000 --- a/Forge/build.gradle.kts +++ /dev/null @@ -1,89 +0,0 @@ -plugins { - id("java-library") - id("maven-publish") - id("idea") - id("net.minecraftforge.gradle") version ("5.1.+") - id("org.parchmentmc.librarian.forgegradle") version ("1.+") -} - -group = "dev.lightdream" -version = libs.versions.project.get() - -minecraft { - mappings("parchment", libs.versions.parchment.get()) - accessTransformer(file("src/main/resources/META-INF/accesstransformer.cfg")) -} - -dependencies { - minecraft( - group = "net.minecraftforge", - name = "forge", - version = libs.versions.forge.get(), - ) - - // Project - api(project(":command-manager-common")) - - // LuckPerms - compileOnly(libs.luckperms) - - // JetBrains - compileOnly(libs.jetbrains.annotations) - annotationProcessor(libs.jetbrains.annotations) - - // Lombok - compileOnly(libs.lombok) - annotationProcessor(libs.lombok) -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 -} - -tasks.withType { - archiveFileName.set("${rootProject.name}.jar") -} - -publishing { - publications { - create("maven") { - from(components["java"]) - } - } - repositories { - val githubURL = project.findProperty("github.url") ?: "" - val githubUsername = project.findProperty("github.auth.username") ?: "" - val githubPassword = project.findProperty("github.auth.password") ?: "" - - val selfURL = project.findProperty("self.url") ?: "" - val selfUsername = project.findProperty("self.auth.username") ?: "" - val selfPassword = project.findProperty("self.auth.password") ?: "" - - maven(url = githubURL as String) { - name = "github" - credentials(PasswordCredentials::class) { - username = githubUsername as String - password = githubPassword as String - } - } - - maven(url = selfURL as String) { - name = "self" - credentials(PasswordCredentials::class) { - username = selfUsername as String - password = selfPassword as String - } - } - } -} - -tasks.register("publishGitHub") { - dependsOn("publishMavenPublicationToGithubRepository") - description = "Publishes to GitHub" -} - -tasks.register("publishSelf") { - dependsOn("publishMavenPublicationToSelfRepository") - description = "Publishes to Self hosted repository" -} diff --git a/Forge/src/main/java/dev/lightdream/commandmanager/forge/command/BaseCommand.java b/Forge/src/main/java/dev/lightdream/commandmanager/forge/command/BaseCommand.java deleted file mode 100644 index c33d8c6..0000000 --- a/Forge/src/main/java/dev/lightdream/commandmanager/forge/command/BaseCommand.java +++ /dev/null @@ -1,176 +0,0 @@ -package dev.lightdream.commandmanager.forge.command; - -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import com.mojang.brigadier.context.CommandContext; -import dev.lightdream.commandmanager.common.command.CommonCommandImpl; -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.utils.ListUtils; -import dev.lightdream.commandmanager.common.utils.PermissionUtils; -import dev.lightdream.commandmanager.forge.manager.CommandManager; -import dev.lightdream.logger.Logger; -import lombok.SneakyThrows; -import net.minecraft.commands.CommandSource; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.network.chat.Component; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; - -@SuppressWarnings("unused") -public abstract class BaseCommand extends CommonCommandImpl { - - public static String[] commandSourceFiled = {"field_9819", "f_81288_"}; - - @Override - public final boolean registerCommand(String name) { - CommandManager.instance().dispatcher().register(getCommandBuilder(name)); - return true; - } - - public List> getArguments() { - return new ArrayList<>(); - } - - private LiteralArgumentBuilder getCommandBuilder(String name) { - LiteralArgumentBuilder command = Commands.literal(name); - - List subCommands = getSubCommands(); - List> arguments = getArguments(); - - if (subCommands == null) { - subCommands = new ArrayList<>(); - } - if (arguments == null) { - arguments = new ArrayList<>(); - } - - for (ICommonCommand subCommandObject : subCommands) { - BaseCommand subCommand = (BaseCommand) subCommandObject; - for (String subName : subCommand.getNames()) { - command.then(subCommand.getCommandBuilder(subName)); - } - } - - RequiredArgumentBuilder then = null; - - if (!arguments.isEmpty()) { - if (arguments.size() != 1) { - for (int index = arguments.size() - 2; index >= 0; index--) { - arguments.get(index).then(arguments.get(index + 1)); - } - } - then = arguments.get(0); - } - - if (then != null) { - command.then(then); - } - - command.executes(context -> { - try { - return internalExecute(context); - } catch (Throwable t) { - //noinspection CallToPrintStackTrace - t.printStackTrace(); - } - return 0; - }); - - return command; - } - - @SneakyThrows - private CommandSource getCommandSource(CommandContext context) { - return getCommandSource(context, 0); - } - - @SneakyThrows - private CommandSource getCommandSource(CommandContext context, int index) { - if (index == commandSourceFiled.length) { - return null; - } - - try { - Field field = CommandSourceStack.class.getDeclaredField(commandSourceFiled[index]); - return (CommandSource) field.get(context.getSource()); - } catch (Exception e) { - return getCommandSource(context, index + 1); - } - } - - public int internalExecute(CommandContext context) { - CommandSource source = getCommandSource(context); - - if (!isEnabled()) { - sendMessage(source, CommandManager.instance().lang().commandIsDisabled); - return 0; - } - - if (onlyForConsole()) { - if (!(source instanceof MinecraftServer consoleSource)) { - sendMessage(source, CommandManager.instance().lang().onlyForConsole); - return 0; - } - exec(consoleSource, context); - return 0; - } - if (onlyForPlayers()) { - if (!(source instanceof Player player)) { - sendMessage(source, CommandManager.instance().lang().onlyFotPlayer); - return 0; - } - exec(player, context); - return 0; - } - - exec(source, context); - return 0; - } - - public void exec(@NotNull CommandSource source, @NotNull CommandContext context) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for " + source + ", but the command is not implemented. Exec type: CommandSource, CommandContext"); - } - - sendMessage(source, ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - public void exec(@NotNull MinecraftServer console, @NotNull CommandContext context) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for Console, but the command is not implemented. Exec type: ConsoleSource, CommandContext"); - } - - sendMessage(console, ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - public void exec(@NotNull Player player, @NotNull CommandContext context) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for " + player.getName() + ", but the command is not implemented. Exec type: User, CommandContext"); - } - - sendMessage(player, ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - @Override - public final boolean checkPermission(Object user, String permission) { - return PermissionUtils.checkPermission(user, permission); - } - - @Override - public final void sendMessage(Object user, String message) { - if (user instanceof ServerPlayer player) { - player.displayClientMessage(Component.literal(message), false); - return; - } - if (user instanceof MinecraftServer) { - Logger.info(message); - } - } -} \ No newline at end of file diff --git a/Forge/src/main/java/dev/lightdream/commandmanager/forge/manager/CommandManager.java b/Forge/src/main/java/dev/lightdream/commandmanager/forge/manager/CommandManager.java deleted file mode 100644 index 59883c5..0000000 --- a/Forge/src/main/java/dev/lightdream/commandmanager/forge/manager/CommandManager.java +++ /dev/null @@ -1,44 +0,0 @@ -package dev.lightdream.commandmanager.forge.manager; - -import com.mojang.brigadier.CommandDispatcher; -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.dto.CommandLang; -import dev.lightdream.commandmanager.common.manager.CommonCommandManager; -import lombok.Getter; -import lombok.experimental.Accessors; -import net.minecraft.commands.CommandSourceStack; -import org.reflections.Reflections; - -import java.util.Set; - -@Getter -@Accessors(chain = true, fluent = true) -public class CommandManager extends CommonCommandManager { - - private final CommandDispatcher dispatcher; - - @lombok.Builder(builderClassName = "Builder") - public CommandManager(Reflections reflections, CommandLang lang, - Set> commandClasses, String basePermission, - boolean autoRegister, CommandDispatcher dispatcher) { - super(reflections, lang, commandClasses, basePermission, autoRegister); - - this.dispatcher = dispatcher; - } - - public static CommandManager instance(){ - return (CommandManager) instance; - } - - @SuppressWarnings("unused") - public static Builder builder(){ - return applyDefaults(new Builder()); - } - - public static class Builder extends CommonBuilder{ - public Builder(){ - super(); - } - } - -} diff --git a/README.md b/README.md index d2aac36..53c6894 100644 --- a/README.md +++ b/README.md @@ -1,166 +1,16 @@ -# CommandManager - -![Build](../../actions/workflows/build.yml/badge.svg) -![Version](https://img.shields.io/badge/Version-6.1.3-red.svg) - -# Table Of Contents - -1. [Description](#description) -2. [How to add to your project](#how-to-add-to-your-project) -3. [How to use](#how-to-use) - -## Description - -A cross-platform command library. You can reuse the code that you already wrote for one platform to any of them with -minimal changes +# Logger ## How to add to your project -The artifact can be found at the repository https://repo.lightdream.dev or https://jitpack.io (under -com.github.L1ghtDream instead of dev.lightdream) - -### Maven - -```xml - - - - lightdream-repo - https://repo.lightdream.dev/ - - - jitpack.io - https://jitpack.io - - -``` - -```xml - - - - dev.lightdream - command-manager - 6.1.3 - - - com.github.L1ghtDream - command-manager - 6.1.3 - - -``` - -### Gradle - Groovy DSL - -```groovy -repositories { - maven { url "https://repo.lightdream.dev/" } - maven { url "https://jitpack.io" } -} - -dependencies { - implementation "dev.lightdream:command-manager:6.1.3" - implementation "com.github.L1ghtDream:command-manager:6.1.3" -} -``` - -### Gradle - Kotlin DSL - ```kotlin repositories { - maven("https://repo.lightdream.dev/") - maven("https://jitpack.io") + maven("https://repository.voinearadu.com/repository/maven-releases/") + maven("https://repo.voinearadu.com/") // The short version of the above (might be slower on high latency connections) } dependencies { - implementation("dev.lightdream:command-manager:6.1.3") - implementation("com.github.L1ghtDream:command-manager:6.1.3") -} -``` - -If you want to use an older version that is not available in https://repo.lightdream.dev you can try -using https://archive-repo.lightdream.dev - -## How to use - -### What frameworks does this support - -| Framework | Support | Dependency Artifact | -|-----------|--------------|-------------------------------------------| -| Common | N/A | dev.lightdrea:command-manager-common | -| Fabric | 1.19 | dev.lightdrea:command-manager-fabric-1-19 | -| Forge | 1.19 | dev.lightdrea:command-manager-forge-1-19 | -| Spigot | 1.8+ | dev.lightdrea:command-manager-spigot | -| Sponge | 7.4.0 (1.12) | dev.lightdrea:command-manager-sponge | -| Velocity | 3.1.2+ | dev.lightdrea:command-manager-velocity | - -### Creatine the main - -Each framework `CommandMain` may have different requirements for what needs to be provided. Follow the JavaDocs for more -info. -This is an example with the Velocity API - -```java -public class ExampleMain implements CommandMain { - - private final CommandLang lang; - private final CommandManager commandManager; - private final ProxyServer proxyServer; - private final Reflections reflections; - - public ExampleMain(ProxyServer proxyServer, Reflections reflections) { - lang = new CommandLang(); // This would usually be loaded from disk using a library like FileManager - - this.proxyServer = proxyServer; - this.reflections = reflections; - - commandManager = new CommandManager(); - - // This is an example of a command being manually registered. - // This is not required dif you specify in the command annotation @Command(autoRegister = true) - commandManager.registerCommand(ExampleCommand.class); - } - - @Override - public CommandLang getLang() { - return lang; - } - - @Override - public CommandManager getCommandManager() { - return commandManager; - } - - @Override - public @NotNull String basePermission() { - return "project.command"; - } - - @Override - public @NotNull ProxyServer getProxy() { - return proxyServer; - } - - @Override - public @NotNull Reflections getReflections() { - return reflections; - } + implementation("com.voinearadu:command-manager-common:VERSION") + implementation("com.voinearadu:command-manager-velocity:VERSION") + implementation("com.voinearadu:command-manager-fabric-1-19:VERSION") } - -``` - -### How to create a command - -```java - -@Command(aliases = "example", autoRegister = true) -public class ExampleCommand extends BaseCommand { - - @Override - public void exec(@NotNull CommandSource source, @NotNull List args) { - sendMessage(source, "ExampleCommand"); - } -} - -``` +``` \ No newline at end of file diff --git a/Spigot/build.gradle.kts b/Spigot/build.gradle.kts deleted file mode 100644 index bc4edfe..0000000 --- a/Spigot/build.gradle.kts +++ /dev/null @@ -1,67 +0,0 @@ -plugins { - id("java-library") - id("maven-publish") -} - -group = "dev.lightdream" -version = libs.versions.project.get() - -dependencies { - // Sponge - api(libs.spigot) - - // Project - api(project(":command-manager-common")) - - // Lombok - compileOnly(libs.lombok) - annotationProcessor(libs.lombok) -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - -publishing { - publications { - create("maven") { - from(components["java"]) - } - } - repositories { - val githubURL = project.findProperty("github.url") ?: "" - val githubUsername = project.findProperty("github.auth.username") ?: "" - val githubPassword = project.findProperty("github.auth.password") ?: "" - - val selfURL = project.findProperty("self.url") ?: "" - val selfUsername = project.findProperty("self.auth.username") ?: "" - val selfPassword = project.findProperty("self.auth.password") ?: "" - - maven(url = githubURL as String) { - name = "github" - credentials(PasswordCredentials::class) { - username = githubUsername as String - password = githubPassword as String - } - } - - maven(url = selfURL as String) { - name = "self" - credentials(PasswordCredentials::class) { - username = selfUsername as String - password = selfPassword as String - } - } - } -} - -tasks.register("publishGitHub") { - dependsOn("publishMavenPublicationToGithubRepository") - description = "Publishes to GitHub" -} - -tasks.register("publishSelf") { - dependsOn("publishMavenPublicationToSelfRepository") - description = "Publishes to Self hosted repository" -} diff --git a/Spigot/src/main/java/dev/lightdream/commandmanager/spigot/command/BaseCommand.java b/Spigot/src/main/java/dev/lightdream/commandmanager/spigot/command/BaseCommand.java deleted file mode 100644 index 06510f8..0000000 --- a/Spigot/src/main/java/dev/lightdream/commandmanager/spigot/command/BaseCommand.java +++ /dev/null @@ -1,215 +0,0 @@ -package dev.lightdream.commandmanager.spigot.command; - -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.utils.ListUtils; -import dev.lightdream.commandmanager.spigot.manager.CommandManager; -import dev.lightdream.logger.Logger; -import dev.lightdream.messagebuilder.MessageBuilder; -import lombok.Getter; -import lombok.SneakyThrows; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandMap; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -@SuppressWarnings("unused") -public abstract class BaseCommand extends org.bukkit.command.Command implements ICommonCommand { - - private List subCommands = new ArrayList<>(); - private @Getter boolean enabled = true; - - @SneakyThrows - public BaseCommand() { - super(""); - this.init(); - } - - @Override - public void disable() { - this.enabled = false; - } - - @Override - public void enable() { - this.enabled = true; - } - - // Override the default method on org.bukkit.command.Command - @Override - public List getAliases() { - return new ArrayList<>(); - } - - @Override - @SneakyThrows - public final boolean registerCommand(String name) { - this.setAliases(Collections.singletonList(name)); - Field fCommandMap = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap"); - fCommandMap.setAccessible(true); - - Object commandMapObject = fCommandMap.get(Bukkit.getPluginManager()); - if (commandMapObject instanceof CommandMap) { - CommandMap commandMap = (CommandMap) commandMapObject; - commandMap.register(CommandManager.instance().plugin().getDescription().getName(), this); - } else { - return false; - } - - return true; - } - - public void exec(@NotNull CommandSender source, List args) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + this.getName() + " for " + source.getName() + ", but the command is not implemented. Exec type: CommandSender, List"); - } - - source.sendMessage(ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - public void exec(@NotNull ConsoleCommandSender console, @NotNull List args) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + this.getName() + " for " + console.getName() + ", but the command is not implemented. Exec type: ConsoleCommandSender, List"); - } - - console.sendMessage(ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - public void exec(@NotNull Player player, @NotNull List args) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + this.getName() + " for " + player.getName() + ", but the command is not implemented. Exec type: Player, List"); - } - - player.sendMessage(ListUtils.listToString(getSubCommandsHelpMessage(), "\n")); - } - - @Override - public final boolean execute(CommandSender sender, String label, String[] args) { - if (!isEnabled()) { - sendMessage(sender, CommandManager.instance().lang().commandIsDisabled); - return true; - } - - if (!checkPermission(sender, getPermission())) { - sender.sendMessage(new MessageBuilder(CommandManager.instance().lang().noPermission).toString()); - return true; - } - - if (args.length == 0) { - distributeExec(sender, new ArrayList<>(Arrays.asList(args))); - return true; - } - - - for (ICommonCommand subCommand : getSubCommands()) { - boolean found = false; - - for (String name : subCommand.getNames()) { - if (name.equalsIgnoreCase(args[0])) { - found = true; - break; - } - } - - if (!found) { - continue; - } - - BaseCommand baseCommand = (BaseCommand) subCommand; - - baseCommand.distributeExec(sender, new ArrayList<>(Arrays.asList(args).subList(1, args.length))); - return true; - } - - distributeExec(sender, new ArrayList<>(Arrays.asList(args))); - return true; - } - - public final void distributeExec(CommandSender sender, List args) { - if (args.size() < getMinimumArgs()) { - sendUsage(sender); - return; - } - - if (onlyForPlayers()) { - if (!(sender instanceof Player)) { - sender.sendMessage(new MessageBuilder(CommandManager.instance().lang().onlyFotPlayer).parse()); - return; - } - exec((Player) sender, args); - return; - } - - if (onlyForConsole()) { - if (!(sender instanceof ConsoleCommandSender)) { - sender.sendMessage(new MessageBuilder(CommandManager.instance().lang().onlyForConsole).parse()); - return; - } - exec((ConsoleCommandSender) sender, args); - return; - } - - exec(sender, args); - } - - @Override - public final List tabComplete(CommandSender sender, String bukkitAlias, String[] args) throws IllegalArgumentException { - if (args.length == 1) { - ArrayList result = new ArrayList<>(); - for (BaseCommand subCommand : subCommands) { - if (subCommand.getName().toLowerCase().startsWith(args[0].toLowerCase()) && checkPermission(sender, subCommand.getPermission())) { - result.add(subCommand.getName()); - } - } - return result; - } - - for (BaseCommand subCommand : subCommands) { - if (subCommand.getName().contains(args[0]) && checkPermission(sender, subCommand.getPermission())) { - return subCommand.onTabComplete(sender, new ArrayList<>(Arrays.asList(args).subList(1, args.length))); - } - } - - return onTabComplete(sender, new ArrayList<>(Arrays.asList(args))); - } - - public List onTabComplete(CommandSender sender, List args) { - return Collections.emptyList(); - } - - public final boolean checkPermission(Object sender, String permission) { - return checkPermission((CommandSender) sender, permission); - } - - public final boolean checkPermission(CommandSender sender, String permission) { - return ((sender.hasPermission(permission) || permission.equalsIgnoreCase(""))); - } - - @Override - public final void sendMessage(Object user, String message) { - ((CommandSender) user).sendMessage(message); - } - - @Override - public final List getSubCommands() { - return new ArrayList<>(subCommands); - } - - @Override - public final void setSubCommands(List subCommands) { - List newSubCommands = new ArrayList<>(); - - for (ICommonCommand subCommand : subCommands) { - newSubCommands.add((BaseCommand) subCommand); - } - - this.subCommands = newSubCommands; - } -} diff --git a/Spigot/src/main/java/dev/lightdream/commandmanager/spigot/manager/CommandManager.java b/Spigot/src/main/java/dev/lightdream/commandmanager/spigot/manager/CommandManager.java deleted file mode 100644 index bbd9d23..0000000 --- a/Spigot/src/main/java/dev/lightdream/commandmanager/spigot/manager/CommandManager.java +++ /dev/null @@ -1,43 +0,0 @@ -package dev.lightdream.commandmanager.spigot.manager; - -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.dto.CommandLang; -import dev.lightdream.commandmanager.common.manager.CommonCommandManager; -import lombok.Getter; -import lombok.experimental.Accessors; -import org.bukkit.plugin.Plugin; -import org.reflections.Reflections; - -import java.util.Set; - -@Getter -@Accessors(chain = true, fluent = true) -public class CommandManager extends CommonCommandManager { - - private final Plugin plugin; - - @lombok.Builder(builderClassName = "Builder") - public CommandManager(Reflections reflections, CommandLang lang, - Set> commandClasses, String basePermission, - boolean autoRegister, Plugin plugin) { - super(reflections, lang, commandClasses, basePermission, autoRegister); - - this.plugin = plugin; - } - - public static CommandManager instance(){ - return (CommandManager) instance; - } - - @SuppressWarnings("unused") - public static Builder builder() { - return applyDefaults(new Builder()); - } - - public static class Builder extends CommonBuilder { - public Builder() { - super(); - } - } - -} diff --git a/Spigot/src/main/resources/plugin.yml b/Spigot/src/main/resources/plugin.yml deleted file mode 100644 index 2cf0f5c..0000000 --- a/Spigot/src/main/resources/plugin.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: Fly -version: '${project.version}' -main: dev.lightdream.commandmanager.Main -authors: [ LightDream ] -website: https://lightdream.dev diff --git a/Velocity/build.gradle.kts b/Velocity/build.gradle.kts deleted file mode 100644 index 93c0fc2..0000000 --- a/Velocity/build.gradle.kts +++ /dev/null @@ -1,71 +0,0 @@ -plugins { - id("java-library") - id("maven-publish") -} - -group = "dev.lightdream" -version = libs.versions.project.get() - -dependencies { - // Sponge - compileOnly(libs.velocity) - - // Project - api(project(":command-manager-common")) - - // Lombok - compileOnly(libs.lombok) - annotationProcessor(libs.lombok) - - // JetBrains - compileOnly(libs.jetbrains.annotations) - annotationProcessor(libs.jetbrains.annotations) -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - -publishing { - publications { - create("maven") { - from(components["java"]) - } - } - repositories { - val githubURL = project.findProperty("github.url") ?: "" - val githubUsername = project.findProperty("github.auth.username") ?: "" - val githubPassword = project.findProperty("github.auth.password") ?: "" - - val selfURL = project.findProperty("self.url") ?: "" - val selfUsername = project.findProperty("self.auth.username") ?: "" - val selfPassword = project.findProperty("self.auth.password") ?: "" - - maven(url = githubURL as String) { - name = "github" - credentials(PasswordCredentials::class) { - username = githubUsername as String - password = githubPassword as String - } - } - - maven(url = selfURL as String) { - name = "self" - credentials(PasswordCredentials::class) { - username = selfUsername as String - password = selfPassword as String - } - } - } -} - -tasks.register("publishGitHub") { - dependsOn("publishMavenPublicationToGithubRepository") - description = "Publishes to GitHub" -} - -tasks.register("publishSelf") { - dependsOn("publishMavenPublicationToSelfRepository") - description = "Publishes to Self hosted repository" -} diff --git a/Velocity/src/main/java/dev/lightdream/commandmanager/velocity/command/BaseCommand.java b/Velocity/src/main/java/dev/lightdream/commandmanager/velocity/command/BaseCommand.java deleted file mode 100644 index ed64485..0000000 --- a/Velocity/src/main/java/dev/lightdream/commandmanager/velocity/command/BaseCommand.java +++ /dev/null @@ -1,199 +0,0 @@ -package dev.lightdream.commandmanager.velocity.command; - -import com.velocitypowered.api.command.CommandMeta; -import com.velocitypowered.api.command.CommandSource; -import com.velocitypowered.api.command.SimpleCommand; -import com.velocitypowered.api.proxy.ConsoleCommandSource; -import com.velocitypowered.api.proxy.Player; -import dev.lightdream.commandmanager.common.command.CommonCommandImpl; -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.utils.ListUtils; -import dev.lightdream.commandmanager.velocity.manager.CommandManager; -import dev.lightdream.logger.Debugger; -import dev.lightdream.logger.Logger; -import net.kyori.adventure.text.Component; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - - -@SuppressWarnings("unused") -public abstract class BaseCommand extends CommonCommandImpl implements SimpleCommand { - - @Override - public List suggest(Invocation invocation) { - int argsLength = invocation.arguments().length; - - if (argsLength == 0) { - return onAutoComplete(invocation); - } - - String lastArg1 = invocation.arguments()[argsLength - 1]; - BaseCommand subCommand = getSubCommand(lastArg1); - - if (subCommand == null) { - if (argsLength == 1) { - return ListUtils.getListThatStartsWith(onAutoComplete(invocation), lastArg1); - } - - String lastArg2 = invocation.arguments()[argsLength - 2]; - subCommand = getSubCommand(lastArg2); - - if (subCommand == null) { - return ListUtils.getListThatStartsWith(onAutoComplete(invocation), lastArg2); - } - - List a = subCommand.onAutoComplete(invocation); - - Debugger.log(a); - - return ListUtils.getListThatStartsWith(a, lastArg1); - } - - return ListUtils.getListThatStartsWith(onAutoComplete(invocation), lastArg1); - } - - private @Nullable BaseCommand getSubCommand(String name) { - for (ICommonCommand subCommand : getSubCommands()) { - for (String commandName : subCommand.getNames()) { - if (name.equalsIgnoreCase(commandName)) { - return (BaseCommand) subCommand; - } - } - } - - return null; - } - - public @NotNull List onAutoComplete(Invocation invocation) { - return defaultAutoComplete(); - } - - public @NotNull List defaultAutoComplete() { - List allArguments = new ArrayList<>(); - - for (ICommonCommand subCommand : getSubCommands()) { - allArguments.add(subCommand.getName()); - } - - return allArguments; - } - - @Override - public final boolean registerCommand(String name) { - com.velocitypowered.api.command.CommandManager commandManager = CommandManager.instance() - .proxy().getCommandManager(); - CommandMeta commandMeta = commandManager.metaBuilder(name) - .plugin(this) - .build(); - - commandManager.register(commandMeta, this); - return true; - } - - @Override - public final void execute(Invocation invocation) { - distributeExecute(invocation.source(), Arrays.asList(invocation.arguments())); - } - - private void distributeExecute(CommandSource source, List args) { - - if (!isEnabled()) { - sendMessage(source, CommandManager.instance().lang().commandIsDisabled); - return; - } - - if (!checkPermission(source, getPermission())) { - sendMessage(source, CommandManager.instance().lang().noPermission); - return; - } - - if (!args.isEmpty()) { - for (ICommonCommand subCommand : getSubCommands()) { - boolean found = false; - - for (String name : subCommand.getNames()) { - if (name.equalsIgnoreCase(args.get(0))) { - found = true; - break; - } - } - - if (!found) { - continue; - } - - BaseCommand baseCommand = (BaseCommand) subCommand; - - baseCommand.distributeExecute(source, args.subList(1, args.size())); - return; - } - } - - if (args.size() < getMinimumArgs()) { - sendUsage(source); - return; - } - - if (onlyForConsole()) { - if (!(source instanceof ConsoleCommandSource)) { - source.sendMessage(Component.text(CommandManager.instance().lang().onlyForConsole)); - return; - } - ConsoleCommandSource consoleSource = (ConsoleCommandSource) source; - exec(consoleSource, args); - return; - } - if (onlyForPlayers()) { - if (!(source instanceof Player)) { - source.sendMessage(Component.text(CommandManager.instance().lang().onlyFotPlayer)); - return; - } - Player player = (Player) source; - exec(player, args); - return; - } - - exec(source, args); - } - - public void exec(@NotNull CommandSource source, @NotNull List args) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for " + source + ", but the command is not implemented. Exec type: CommandSource, CommandContext"); - } - - source.sendMessage(Component.text(ListUtils.listToString(getSubCommandsHelpMessage(), "\n"))); - } - - public void exec(@NotNull ConsoleCommandSource console, @NotNull List args) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for Console, but the command is not implemented. Exec type: ConsoleSource, CommandContext"); - } - - console.sendMessage(Component.text(ListUtils.listToString(getSubCommandsHelpMessage(), "\n"))); - } - - public void exec(@NotNull Player player, @NotNull List args) { - if (getSubCommands().isEmpty()) { - Logger.warn("Executing command " + getName() + " for " + player.getUsername() + ", but the command is not implemented. Exec type: User, CommandContext"); - } - - player.sendMessage(Component.text(ListUtils.listToString(getSubCommandsHelpMessage(), "\n"))); - } - - @Override - public final boolean checkPermission(Object user, String permission) { - CommandSource source = (CommandSource) user; - return source.hasPermission(permission); - } - - @Override - public final void sendMessage(Object user, String message) { - CommandSource source = (CommandSource) user; - source.sendMessage(Component.text(message)); - } - -} \ No newline at end of file diff --git a/Velocity/src/main/java/dev/lightdream/commandmanager/velocity/manager/CommandManager.java b/Velocity/src/main/java/dev/lightdream/commandmanager/velocity/manager/CommandManager.java deleted file mode 100644 index 062e521..0000000 --- a/Velocity/src/main/java/dev/lightdream/commandmanager/velocity/manager/CommandManager.java +++ /dev/null @@ -1,43 +0,0 @@ -package dev.lightdream.commandmanager.velocity.manager; - -import com.velocitypowered.api.proxy.ProxyServer; -import dev.lightdream.commandmanager.common.command.ICommonCommand; -import dev.lightdream.commandmanager.common.dto.CommandLang; -import dev.lightdream.commandmanager.common.manager.CommonCommandManager; -import lombok.Getter; -import lombok.experimental.Accessors; -import org.reflections.Reflections; - -import java.util.Set; - -@Getter -@Accessors(chain = true, fluent = true) -public class CommandManager extends CommonCommandManager { - - private final ProxyServer proxy; - - @lombok.Builder(builderClassName = "Builder") - public CommandManager(Reflections reflections, CommandLang lang, - Set> commandClasses, String basePermission, - boolean autoRegister, ProxyServer proxy) { - super(reflections, lang, commandClasses, basePermission, autoRegister); - - this.proxy = proxy; - } - - public static CommandManager instance(){ - return (CommandManager) instance; - } - - @SuppressWarnings("unused") - public static Builder builder() { - return applyDefaults(new Builder()); - } - - public static class Builder extends CommonBuilder { - public Builder() { - super(); - } - } - -} diff --git a/build.gradle.kts b/build.gradle.kts index 0639ce0..b837f6e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,26 +1,83 @@ plugins { - java + id("java") + id("java-library") + id("maven-publish") } -group = "dev.lightdream" -version = libs.versions.project.get() +var _version = libs.versions.version.get() +var _group = libs.versions.group.get() -dependencies { +version = _version +group = _group + +fun DependencyHandlerScope.applyDependencies() { + // Dependencies + api(libs.voinearadu.utils) + + // Annotations + compileOnly(libs.lombok) + annotationProcessor(libs.lombok) + testCompileOnly(libs.lombok) + testAnnotationProcessor(libs.lombok) + compileOnly(libs.jetbrains.annotations) + annotationProcessor(libs.jetbrains.annotations) + testCompileOnly(libs.jetbrains.annotations) + testAnnotationProcessor(libs.jetbrains.annotations) +} + +fun RepositoryHandler.applyRepositories() { + mavenCentral() + maven("https://maven.parchmentmc.org/") + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://repository.voinearadu.com/repository/maven-releases/") +} + +repositories { + applyRepositories() +} + +dependencies { + applyDependencies() } subprojects { + apply(plugin = "java") + apply(plugin = "java-library") + apply(plugin = "maven-publish") + + group = _group + version = _version + repositories { - mavenCentral() - maven("https://repo.papermc.io/repository/maven-public/") - maven("https://repo.spongepowered.org/maven/") - maven("https://repo.lightdream.dev/") - maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") - maven("https://cursemaven.com") { - content { - includeGroup("curse.maven") + applyRepositories() + } + + dependencies { + applyDependencies() + } + + tasks { + java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } + } + + publishing { + publications { + create("maven") { + from(components["java"]) + } + } + + repositories { + maven(url = (project.findProperty("voinearadu.url") ?: "") as String) { + credentials(PasswordCredentials::class) { + username = (project.findProperty("voinearadu.auth.username") ?: "") as String + password = (project.findProperty("voinearadu.auth.password") ?: "") as String + } } } - maven("https://maven.parchmentmc.org") } } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aa76aaa..ec68904 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,40 +1,31 @@ [versions] -project = "6.1.3" -forge = "1.19-41.1.0" -yarn_mappings = "1.20.1+build.10" -parchment = "2022.08.14-1.19.2" + +version = "1.0.-1" +group = "com.voinearadu" + +[plugins] + +loom = { id = "fabric-loom", version = "1.5.5" } [libraries] + # Minecraft -minecraft_v19 = { module = "com.mojang:minecraft", version = "1.19" } minecraft_v20 = { module = "com.mojang:minecraft", version = "1.20.1" } # Fabric fabric_api = { module = "net.fabricmc.fabric-api:fabric-api", version = "0.90.7+1.20.3" } fabric_loader = { module = "net.fabricmc:fabric-loader", version = "0.15.0" } +parchment_mappings = { module = "org.parchmentmc.data:parchment-1.20.1", version = "2023.09.03" } # Velocioty velocity = { module = "com.velocitypowered:velocity-api", version = "3.1.2-SNAPSHOT" } -# Spigot -spigot = { module = "org.spigotmc:spigot-api", version = "1.8-R0.1-SNAPSHOT" } - -# Sponge -sponge = { module = "org.spongepowered:spongeapi", version = "7.4.0" } - -# Utils +# Dependencies lombok = { module = "org.projectlombok:lombok", version = "1.18.30" } +jetbrains_annotations = { module = "org.jetbrains:annotations", version = "24.1.0" } gson = { module = "com.google.code.gson:gson", version = "2.10.1" } reflections = { module = "org.reflections:reflections", version = "0.10.2" } -jetbrains_annotations = { module = "org.jetbrains:annotations", version = "24.1.0" } - -# APIs luckperms = { module = "net.luckperms:api", version = "5.4" } - -# LightDream -lightdream_logger = { module = "dev.lightdream:logger", version = "4.2.2" } -lightdream_lambda = { module = "dev.lightdream:lambda", version = "5.3.3" } -lightdream_filemanager = { module = "dev.lightdream:file-manager", version = "3.2.5" } -lightdream_messagebuilder = { module = "dev.lightdream:message-builder", version = "4.2.6" } - - +kyori_minimessage = { module = "net.kyori:adventure-text-minimessage", version = "4.17.0" } +kyori_adventure_fabric = { module = "net.kyori:adventure-platform-fabric", version = "5.9.0" } +voinearadu_utils = { module = "com.voinearadu:utils", version = "1.0.1" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b1624c4..707e499 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/readme/description.md b/readme/description.md deleted file mode 100644 index 26ed608..0000000 --- a/readme/description.md +++ /dev/null @@ -1,2 +0,0 @@ -A cross-platform command library. You can reuse the code that you already wrote for one platform to any of them with -minimal changes \ No newline at end of file diff --git a/readme/how.md b/readme/how.md deleted file mode 100644 index 1117d58..0000000 --- a/readme/how.md +++ /dev/null @@ -1,80 +0,0 @@ -### What frameworks does this support - -| Framework | Support | Dependency Artifact | -|-----------|--------------|-------------------------------------------| -| Common | N/A | dev.lightdrea:command-manager-common | -| Fabric | 1.19 | dev.lightdrea:command-manager-fabric-1-19 | -| Forge | 1.19 | dev.lightdrea:command-manager-forge-1-19 | -| Spigot | 1.8+ | dev.lightdrea:command-manager-spigot | -| Sponge | 7.4.0 (1.12) | dev.lightdrea:command-manager-sponge | -| Velocity | 3.1.2+ | dev.lightdrea:command-manager-velocity | - -### Creatine the main - -Each framework `CommandMain` may have different requirements for what needs to be provided. Follow the JavaDocs for more -info. -This is an example with the Velocity API - -```java -public class ExampleMain implements CommandMain { - - private final CommandLang lang; - private final CommandManager commandManager; - private final ProxyServer proxyServer; - private final Reflections reflections; - - public ExampleMain(ProxyServer proxyServer, Reflections reflections) { - lang = new CommandLang(); // This would usually be loaded from disk using a library like FileManager - - this.proxyServer = proxyServer; - this.reflections = reflections; - - commandManager = new CommandManager(); - - // This is an example of a command being manually registered. - // This is not required dif you specify in the command annotation @Command(autoRegister = true) - commandManager.registerCommand(ExampleCommand.class); - } - - @Override - public CommandLang getLang() { - return lang; - } - - @Override - public CommandManager getCommandManager() { - return commandManager; - } - - @Override - public @NotNull String basePermission() { - return "project.command"; - } - - @Override - public @NotNull ProxyServer getProxy() { - return proxyServer; - } - - @Override - public @NotNull Reflections getReflections() { - return reflections; - } -} - -``` - -### How to create a command - -```java - -@Command(aliases = "example", autoRegister = true) -public class ExampleCommand extends BaseCommand { - - @Override - public void exec(@NotNull CommandSource source, @NotNull List args) { - sendMessage(source, "ExampleCommand"); - } -} - -``` \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 9551e3d..b63fd16 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,5 @@ +rootProject.name = "command-manager" + pluginManagement { repositories { gradlePluginPortal() @@ -9,19 +11,14 @@ pluginManagement { mavenCentral() } } -rootProject.name = "command-manager" - -include(":command-manager-common") -project(":command-manager-common").projectDir = file("Common") -include(":command-manager-forge-1-19") -project(":command-manager-forge-1-19").projectDir = file("Forge") - -include(":command-manager-spigot") -project(":command-manager-spigot").projectDir = file("Spigot") - -include(":command-manager-velocity") -project(":command-manager-velocity").projectDir = file("Velocity") +fun defineProject(module: String, path: String) { + include(module) + project(module).projectDir = file(path) +} -include(":command-manager-fabric-1-20") -project(":command-manager-fabric-1-20").projectDir = file("Fabric") +defineProject(":command-manager-common", "src/common") +defineProject(":command-manager-fabric-1-19", "src/fabric_1_19") +defineProject(":command-manager-velocity", "src/velocity") +// TODO: Spigot (Bukkit) Support +// TODO: Force Support diff --git a/src/common/build.gradle.kts b/src/common/build.gradle.kts new file mode 100644 index 0000000..70e18b1 --- /dev/null +++ b/src/common/build.gradle.kts @@ -0,0 +1,5 @@ +dependencies { + // Dependencies + api(libs.luckperms) + api(libs.kyori.minimessage) +} diff --git a/src/common/src/main/java/com/voinearadu/commandmanager/common/annotation/Command.java b/src/common/src/main/java/com/voinearadu/commandmanager/common/annotation/Command.java new file mode 100644 index 0000000..42cd642 --- /dev/null +++ b/src/common/src/main/java/com/voinearadu/commandmanager/common/annotation/Command.java @@ -0,0 +1,25 @@ +package com.voinearadu.commandmanager.common.annotation; + +import com.voinearadu.commandmanager.common.command.CommonCommand; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Command { + + String[] aliases(); + + OnlyFor onlyFor() default OnlyFor.BOTH; + + Class parent() default CommonCommand.class; + + enum OnlyFor { + PLAYERS, + CONSOLE, + BOTH + } +} diff --git a/src/common/src/main/java/com/voinearadu/commandmanager/common/command/CommonCommand.java b/src/common/src/main/java/com/voinearadu/commandmanager/common/command/CommonCommand.java new file mode 100644 index 0000000..537401a --- /dev/null +++ b/src/common/src/main/java/com/voinearadu/commandmanager/common/command/CommonCommand.java @@ -0,0 +1,193 @@ +package com.voinearadu.commandmanager.common.command; + +import com.voinearadu.commandmanager.common.annotation.Command; +import com.voinearadu.commandmanager.common.exception.CommandNotAnnotated; +import com.voinearadu.commandmanager.common.manager.CommonCommandManager; +import com.voinearadu.logger.Logger; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +public abstract class CommonCommand { + + // Provided + private final CommonCommandManager commandManager; + private final @Getter Command annotation; + private final Set subCommands = new HashSet<>(); + private boolean enabled = true; + + public CommonCommand(CommonCommandManager commandManager) throws CommandNotAnnotated { + this.commandManager = commandManager; + if (!this.getClass().isAnnotationPresent(Command.class)) { + throw new CommandNotAnnotated("Command " + this.getClass().getName() + " is not annotated with @Command."); + } + + this.annotation = this.getClass().getAnnotation(Command.class); + + subCommands.addAll(commandManager.getReflections().getOfType(CommonCommand.class) + .stream() + .filter(commandClass -> commandClass.isAnnotationPresent(Command.class)) + .filter(commandClass -> commandClass.getAnnotation(Command.class).parent().equals(this.getClass())) + .collect(Collectors.toSet()) + .stream().map(commandClass -> { + try { + return commandClass.getConstructor(CommonCommandManager.class).newInstance(commandManager); + } catch (Exception error) { + Logger.error("There was an error while registering sub command " + commandClass.getName() + " for command(s) " + this.getAliases()); + Logger.error(error); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + } + + public void enable() { + if (annotation.parent() == CommonCommand.class) { + Logger.log("Enabling command(s): " + this.getAliases()); + } else { + CommonCommand parentCommand = commandManager.getCommand(annotation.parent()); + + if (parentCommand == null) { + throw new RuntimeException("Parent command " + annotation.parent().getName() + " of subcommand " + this.getAliases() + " is not registered."); + } + + Logger.log("Enabling subcommand(s) of " + parentCommand.getAliases() + ": " + this.getAliases()); + } + + this.enabled = true; + for (CommonCommand subCommand : this.getPrimitiveSubCommands()) { + subCommand.enable(); + } + } + + public void disable() { + if (annotation.parent() == CommonCommand.class) { + Logger.log("Disabling command(s): " + this.getAliases()); + } else { + CommonCommand parentCommand = commandManager.getCommand(annotation.parent()); + + if (parentCommand == null) { + throw new RuntimeException("Parent command " + annotation.parent().getName() + " of subcommand " + this.getAliases() + " is not registered."); + } + + Logger.log("Enabling subcommand(s) of " + parentCommand.getAliases() + ": " + this.getAliases()); + } + + this.enabled = false; + for (CommonCommand subCommand : this.getPrimitiveSubCommands()) { + subCommand.disable(); + } + } + + public void execute(@NotNull Object executor, @NotNull List arguments) { + if (!enabled) { + return; + } + + if (!commandManager.checkPermission(executor, getPermission())) { + commandManager.sendMessage(executor, "You don't have permission to execute this command."); + return; + } + + if (!arguments.isEmpty()) { + String subCommandName = arguments.get(0); + CommonCommand subCommand = subCommands.stream() + .filter(command -> command.getAliases().contains(subCommandName)) + .findFirst() + .orElse(null); + + if (subCommand != null) { + subCommand.execute(executor, arguments.subList(1, arguments.size())); + return; + } + } + + if (annotation.onlyFor().equals(Command.OnlyFor.PLAYERS)) { + if (commandManager.getPlayerClass().isInstance(executor)) { + internalExecutePlayer(commandManager.getPlayerClass().cast(executor), arguments); + return; + } + commandManager.sendMessage(executor, "This command can only be executed by players."); + return; + } + + if (annotation.onlyFor().equals(Command.OnlyFor.CONSOLE)) { + if (commandManager.getConsoleClass().isInstance(executor)) { + internalExecuteConsole(commandManager.getConsoleClass().cast(executor), arguments); + return; + } + commandManager.sendMessage(executor, "This command can only be executed by a console."); + return; + } + + if (commandManager.getSenderClass().isInstance(executor)) { + internalExecuteCommon(commandManager.getSenderClass().cast(executor), arguments); + return; + } + + Logger.error(executor.getClass() + " is not a known executor type for the current platform."); + } + + + protected abstract void internalExecutePlayer(@NotNull Object player, @NotNull List arguments); + + protected abstract void internalExecuteConsole(@NotNull Object console, @NotNull List arguments); + + protected abstract void internalExecuteCommon(@NotNull Object sender, @NotNull List arguments); + + public @NotNull String getPermission() { + Class parentClass = annotation.parent(); + + if (parentClass.equals(CommonCommand.class)) { + return commandManager.getBasePermission() + "." + annotation.aliases()[0]; + } + + CommonCommand command = commandManager.getCommand(parentClass); + + if (command == null) { + throw new RuntimeException("Command " + parentClass.getName() + " is not registered."); + } + + return command.getPermission() + "." + annotation.aliases()[0]; + } + + public final @NotNull Set getPrimitiveSubCommands() { + Set subCommands = new HashSet<>(); + + for (CommonCommand subCommand : this.subCommands) { + subCommands.add(subCommand); + subCommands.addAll(subCommand.getPrimitiveSubCommands()); + } + + return subCommands; + } + + public final String getMainAlias() { + return annotation.aliases()[0]; + } + + public final List getAliases() { + return List.of(annotation.aliases()); + } + + protected final void sendMessage(Object target, String message) { + commandManager.sendMessage(target, message); + } + + protected final void broadcastMessage(String message) { + commandManager.broadcastMessage(message); + } + + + protected final boolean checkPermission(Object target, String permission) { + return commandManager.checkPermission(target, permission); + } + + +} diff --git a/src/common/src/main/java/com/voinearadu/commandmanager/common/exception/CommandNotAnnotated.java b/src/common/src/main/java/com/voinearadu/commandmanager/common/exception/CommandNotAnnotated.java new file mode 100644 index 0000000..5a945e9 --- /dev/null +++ b/src/common/src/main/java/com/voinearadu/commandmanager/common/exception/CommandNotAnnotated.java @@ -0,0 +1,8 @@ +package com.voinearadu.commandmanager.common.exception; + +public class CommandNotAnnotated extends RuntimeException { + + public CommandNotAnnotated(String message) { + super(message); + } +} diff --git a/src/common/src/main/java/com/voinearadu/commandmanager/common/manager/CommonCommandManager.java b/src/common/src/main/java/com/voinearadu/commandmanager/common/manager/CommonCommandManager.java new file mode 100644 index 0000000..f678d08 --- /dev/null +++ b/src/common/src/main/java/com/voinearadu/commandmanager/common/manager/CommonCommandManager.java @@ -0,0 +1,139 @@ +package com.voinearadu.commandmanager.common.manager; + +import com.voinearadu.commandmanager.common.annotation.Command; +import com.voinearadu.commandmanager.common.command.CommonCommand; +import com.voinearadu.commandmanager.common.exception.CommandNotAnnotated; +import com.voinearadu.commandmanager.common.utils.CommonPermissionUtils; +import com.voinearadu.logger.Logger; +import com.voinearadu.reflections.Reflections; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; + +public abstract class CommonCommandManager { + + private final @Getter Reflections reflections; + private final List commands = new ArrayList<>(); + private final @Getter Class playerClass; + private final @Getter Class consoleClass; + private final @Getter Class senderClass; + private final @Getter String basePermission; + + public CommonCommandManager(@NotNull Reflections reflections, @NotNull Class playerClass, + @NotNull Class consoleClass, @NotNull Class senderClass, + @NotNull String basePermission) { + this.reflections = reflections; + this.playerClass = playerClass; + this.consoleClass = consoleClass; + this.senderClass = senderClass; + this.basePermission = basePermission; + } + + public void register(@NotNull Class commandClass) { + try { + Command commandAnnotation = commandClass.getAnnotation(Command.class); + if (commandAnnotation != null && commandAnnotation.parent() != CommonCommand.class) { + return; + } + + if (Modifier.isAbstract(commandClass.getModifiers())) { + return; + } + + CommonCommand command = commandClass.getConstructor(CommonCommandManager.class).newInstance(this); + register(command); + } catch (Throwable error) { + // Do not print NotAnnotated error as errors, but was warnings. There are legitimate uses of it not being + // annotated, but it might also be an oversight that needs to be addressed. + if (error instanceof CommandNotAnnotated) { //NOPMD - suppressed AvoidInstanceofChecksInCatchClause + Logger.warn(error.getMessage()); + return; + } + + if (error instanceof InvocationTargetException invocationError) { //NOPMD - suppressed AvoidInstanceofChecksInCatchClause + if (invocationError.getTargetException() instanceof CommandNotAnnotated) { + Logger.warn(invocationError.getTargetException().getMessage()); + return; + } + } + + Logger.error(error); + Logger.error("There was an error while registering command " + commandClass.getName()); + } + } + + private void register(@NotNull CommonCommand command) { + Logger.log("Registering command(s) " + command.getAliases()); + commands.add(command); + platformRegister(command); + } + + + public void enable(@NotNull Class commandClass) { + Command commandAnnotation = commandClass.getAnnotation(Command.class); + if (commandAnnotation != null && commandAnnotation.parent() != CommonCommand.class) { + return; + } + + CommonCommand command = getCommand(commandClass); + + if (command != null) { + command.enable(); + } else { + Logger.error("Command " + commandClass.getName() + " is not registered."); + } + } + + public void disable(@NotNull Class commandClass) { + Command commandAnnotation = commandClass.getAnnotation(Command.class); + if (commandAnnotation != null && commandAnnotation.parent() != CommonCommand.class) { + return; + } + + CommonCommand command = getCommand(commandClass); + + if (command != null) { + command.disable(); + } else { + Logger.error("Command " + commandClass.getName() + " is not registered."); + } + } + + public @Nullable CommonCommand getCommand(@NotNull Class commandClass) { + CommonCommand rootCommand = commands.stream() + .filter(commandHolder -> commandHolder.getClass().equals(commandClass)) + .findFirst() + .orElse(null); + + if (rootCommand != null) { + return rootCommand; + } + + return commands.stream() + .filter(commandHolder -> commandHolder.getPrimitiveSubCommands().stream() + .anyMatch(subCommand -> subCommand.getClass().equals(commandClass))) + .findFirst() + .orElse(null); + } + + protected abstract void platformRegister(@NotNull CommonCommand command); + + public boolean checkPermission(Object target, String permission) { + if (consoleClass.isInstance(target)) { + return true; + } + if (playerClass.isInstance(target)) { + return CommonPermissionUtils.checkPermission(playerClass, playerClass.cast(target), permission); + } + return CommonPermissionUtils.checkPermission(playerClass, senderClass.cast(target), permission); + } + + public abstract void sendMessage(Object target, String message); + public abstract void broadcastMessage(String message); + +} diff --git a/src/common/src/main/java/com/voinearadu/commandmanager/common/manager/CommonMiniMessageManager.java b/src/common/src/main/java/com/voinearadu/commandmanager/common/manager/CommonMiniMessageManager.java new file mode 100644 index 0000000..cc9274c --- /dev/null +++ b/src/common/src/main/java/com/voinearadu/commandmanager/common/manager/CommonMiniMessageManager.java @@ -0,0 +1,62 @@ +package com.voinearadu.commandmanager.common.manager; + +import com.voinearadu.message_builder.MessageBuilder; +import com.voinearadu.message_builder.MessageBuilderList; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public abstract class CommonMiniMessageManager { + + public abstract @NotNull NativeComponent toNative(@NotNull Component component); + + public @NotNull List parse(@NotNull List message) { + List output = new ArrayList<>(); + + for (String line : message) { + output.add(parse(line)); + } + + return output; + } + + public @NotNull List parse(@NotNull MessageBuilderList message) { + return parse(message.parse()); + } + + public @NotNull NativeComponent parse(@NotNull String message) { + return toNative(toComponent(message)); + } + + public @NotNull NativeComponent parse(@NotNull MessageBuilder message) { + return parse(message.parse()); + } + + public @NotNull Component toComponent(@NotNull String message) { + return MiniMessage.miniMessage().deserialize(message); + } + + @SuppressWarnings("unused") + public @NotNull Component toComponent(@NotNull MessageBuilder builder) { + return toComponent(builder.parse()); + } + + public @NotNull String sanitize(@NotNull String text) { + return sanitize(toComponent(text)); + } + + public abstract @NotNull String sanitize(Component component); + + public String serialize(Component component) { + return MiniMessage.miniMessage().serialize(component); + } + + @SuppressWarnings("unused") + public TextComponent deserialize(String message) { + return (TextComponent) parse(message); + } +} \ No newline at end of file diff --git a/Common/src/main/java/dev/lightdream/commandmanager/common/utils/PermissionUtils.java b/src/common/src/main/java/com/voinearadu/commandmanager/common/utils/CommonPermissionUtils.java similarity index 63% rename from Common/src/main/java/dev/lightdream/commandmanager/common/utils/PermissionUtils.java rename to src/common/src/main/java/com/voinearadu/commandmanager/common/utils/CommonPermissionUtils.java index 6cf6df7..aebda97 100644 --- a/Common/src/main/java/dev/lightdream/commandmanager/common/utils/PermissionUtils.java +++ b/src/common/src/main/java/com/voinearadu/commandmanager/common/utils/CommonPermissionUtils.java @@ -1,21 +1,23 @@ -package dev.lightdream.commandmanager.common.utils; +package com.voinearadu.commandmanager.common.utils; +import com.voinearadu.logger.Logger; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.platform.PlayerAdapter; -public class PermissionUtils { +public class CommonPermissionUtils { - public static boolean checkPermission(Object player, String permission) { + public static boolean checkPermission(Class playerClass, Object player, String permission) { try { LuckPerms luckPerms = LuckPermsProvider.get(); //noinspection rawtypes - PlayerAdapter playerAdapter = luckPerms.getPlayerAdapter(player.getClass()); + PlayerAdapter playerAdapter = luckPerms.getPlayerAdapter(playerClass); //noinspection unchecked return playerAdapter.getPermissionData(player).checkPermission(permission).asBoolean(); - } catch (Exception e) { + } catch (Exception error) { // No LuckPerms - has no permission + Logger.error(error); return false; } } diff --git a/src/common/src/main/java/com/voinearadu/commandmanager/common/utils/ListUtils.java b/src/common/src/main/java/com/voinearadu/commandmanager/common/utils/ListUtils.java new file mode 100644 index 0000000..f35767e --- /dev/null +++ b/src/common/src/main/java/com/voinearadu/commandmanager/common/utils/ListUtils.java @@ -0,0 +1,13 @@ +package com.voinearadu.commandmanager.common.utils; + +import java.util.List; +import java.util.stream.Collectors; + +public class ListUtils { + + + public static List getListThatStartsWith(List list, String prefix) { + return list.stream().filter(s -> s.toLowerCase().startsWith(prefix.toLowerCase())).collect(Collectors.toList()); + } + +} diff --git a/src/fabric_1_19/build.gradle.kts b/src/fabric_1_19/build.gradle.kts new file mode 100644 index 0000000..c52ed24 --- /dev/null +++ b/src/fabric_1_19/build.gradle.kts @@ -0,0 +1,42 @@ +@file:Suppress("UnstableApiUsage") + +plugins { + id(libs.plugins.loom.get().pluginId) version libs.plugins.loom.get().version.toString() +} + +dependencies { + // Minecraft + minecraft(libs.minecraft.v20) + mappings(loom.layered { + officialMojangMappings() + parchment(libs.parchment.mappings) + }) + + modCompileOnly(libs.fabric.loader) + modCompileOnly(libs.fabric.api) + + // Project + api(project(":command-manager-common")) + + // Dependencies + api(libs.luckperms) + modApi(libs.kyori.adventure.fabric) +} + +tasks { + jar { + archiveFileName = "FabricCommandManager-$version.jar" + } + + processResources { + inputs.property("version", version) + + filesMatching("fabric.mod.json") { + expand("version" to version) + } + } + + remapJar { + archiveFileName = "FabricCommandManager-$version.jar" + } +} \ No newline at end of file diff --git a/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/command/FabricCommand.java b/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/command/FabricCommand.java new file mode 100644 index 0000000..ab49037 --- /dev/null +++ b/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/command/FabricCommand.java @@ -0,0 +1,178 @@ +package com.voinearadu.commandmanager.fabric.command; + +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.voinearadu.commandmanager.common.command.CommonCommand; +import com.voinearadu.commandmanager.common.manager.CommonCommandManager; +import com.voinearadu.commandmanager.fabric.manager.FabricCommandManager; +import com.voinearadu.logger.Logger; +import lombok.SneakyThrows; +import net.minecraft.commands.CommandSource; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static net.minecraft.commands.Commands.literal; + + +public abstract class FabricCommand extends CommonCommand { + + public static final String commandSourceFiled = "field_9819"; + private final FabricCommandManager commandManager; + + public FabricCommand(CommonCommandManager commandManager) { + super(commandManager); + this.commandManager = (FabricCommandManager) commandManager; + } + + public @NotNull Set getSubCommands() { + return getPrimitiveSubCommands() + .stream().map(command -> (FabricCommand) command) + .collect(Collectors.toSet()); + } + + protected @NotNull List getArguments() { + return new ArrayList<>(); + } + + @SuppressWarnings("SameReturnValue") + private int internalExecute(@NotNull CommandContext context) { + try { + CommandSource source = getSource(context); + + List arguments = this.getArguments().stream() + .map(argument -> { + if (argument.startsWith("?")) { + argument = argument.substring(1); + } + try { + return context.getArgument(argument, String.class); + } catch (IllegalArgumentException e) { + return null; + } + }) + .toList(); + + execute(source, arguments); + } catch (Throwable error) { + Logger.error(error); + } + + return 0; + } + + @SuppressWarnings("JavaReflectionMemberAccess") + @SneakyThrows(value = {NoSuchFieldException.class, IllegalAccessException.class}) + private CommandSource getSource(@NotNull CommandContext context) { + Field field = CommandSourceStack.class.getDeclaredField(commandSourceFiled); + field.setAccessible(true); + return (CommandSource) field.get(context.getSource()); + } + + public LiteralArgumentBuilder getCommandBuilder(@NotNull String alias) { + LiteralArgumentBuilder command = literal(alias); + + for (FabricCommand subCommand : getSubCommands()) { + Logger.log("Registering subcommand(s): " + subCommand.getAliases() + " for " + alias); + for (String subAlias : subCommand.getAliases()) { + command = command.then(subCommand.getCommandBuilder(subAlias)); + } + } + + List> arguments = new ArrayList<>(); + + for (String argument : getArguments()) { + if (argument.startsWith("?")) { + argument = argument.substring(1); + } + + String finalArgument = argument; + + arguments.add(Commands + .argument(argument, StringArgumentType.string()) + .suggests((context, builder) -> { + for (String suggestionString : onAutoComplete(finalArgument, context)) { + builder.suggest(suggestionString); + } + + return builder.buildFuture(); + } + )); + } + + ArgumentBuilder then = null; + + if (!arguments.isEmpty()) { + arguments.get(arguments.size() - 1).executes(this::internalExecute); + + if (arguments.size() != 1) { + for (int index = arguments.size() - 2; index >= 0; index--) { + arguments.get(index).then(arguments.get(index + 1)); + + if (getArguments().get(index + 1).startsWith("?")) { + arguments.get(index).executes(this::internalExecute); + } + } + } + + then = arguments.get(0); + } else { + command.executes(this::internalExecute); + } + + if (then != null) { + command.then(then); + } + + return command; + } + + protected List onAutoComplete(@NotNull String argument, @NotNull CommandContext context) { + return new ArrayList<>(); + } + + @Override + protected final void internalExecutePlayer(@NotNull Object player, @NotNull List arguments) { + executePlayer((ServerPlayer) player, arguments); + } + + @Override + protected final void internalExecuteConsole(@NotNull Object console, @NotNull List arguments) { + executeConsole((MinecraftServer) console, arguments); + } + + @Override + protected final void internalExecuteCommon(@NotNull Object sender, @NotNull List arguments) { + executeCommon((CommandSource) sender, arguments); + } + + protected void executePlayer(@NotNull ServerPlayer player, @NotNull List arguments) { + + } + + protected void executeConsole(@NotNull MinecraftServer console, @NotNull List arguments) { + + } + + protected void executeCommon(@NotNull CommandSource sender, @NotNull List arguments) { + + } + + protected List recommendPlayersList() { + return commandManager.getServer().getPlayerList().getPlayers().stream() + .map(ServerPlayer::getDisplayName) + .map(Component::getString) + .toList(); + } +} diff --git a/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/manager/FabricCommandManager.java b/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/manager/FabricCommandManager.java new file mode 100644 index 0000000..a330bfc --- /dev/null +++ b/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/manager/FabricCommandManager.java @@ -0,0 +1,69 @@ +package com.voinearadu.commandmanager.fabric.manager; + +import com.voinearadu.commandmanager.common.command.CommonCommand; +import com.voinearadu.commandmanager.common.manager.CommonCommandManager; +import com.voinearadu.commandmanager.fabric.command.FabricCommand; +import com.voinearadu.logger.Logger; +import com.voinearadu.reflections.Reflections; +import lombok.Getter; +import net.minecraft.commands.CommandSource; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.NotNull; + +@Getter +public class FabricCommandManager extends CommonCommandManager { + + private final MinecraftServer server; + private final FabricMiniMessageManager miniMessageManager; + + public FabricCommandManager(@NotNull Reflections reflections, @NotNull String basePermission, + @NotNull MinecraftServer server) { + super(reflections, ServerPlayer.class, MinecraftServer.class, CommandSource.class, basePermission); + + this.server = server; + this.miniMessageManager = new FabricMiniMessageManager(server); + } + + @Override + protected void platformRegister(@NotNull CommonCommand primitiveCommand) { + FabricCommand command = (FabricCommand) primitiveCommand; + + for (String alias : command.getAliases()) { + server.getCommands().getDispatcher().register(command.getCommandBuilder(alias)); + } + + server.getPlayerList().getPlayers().forEach(player -> + server.getCommands().sendCommands(player) + ); + } + + @Override + public void sendMessage(Object target, String message) { + if (target instanceof ServerPlayer player) { + player.sendSystemMessage(miniMessageManager.parse(message)); + return; + } + + if (target instanceof MinecraftServer console) { + console.sendSystemMessage(Component.literal(message)); + return; + } + + if (target instanceof CommandSource output) { + output.sendSystemMessage(Component.literal(message)); + return; + } + + Logger.error("Unknown target type: " + target.getClass().getName()); + } + + @Override + public void broadcastMessage(String message) { + server.getPlayerList().getPlayers().forEach(player -> + player.sendSystemMessage(miniMessageManager.parse(message)) + ); + } + +} diff --git a/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/manager/FabricMiniMessageManager.java b/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/manager/FabricMiniMessageManager.java new file mode 100644 index 0000000..981d8e4 --- /dev/null +++ b/src/fabric_1_19/src/main/java/com/voinearadu/commandmanager/fabric/manager/FabricMiniMessageManager.java @@ -0,0 +1,34 @@ +package com.voinearadu.commandmanager.fabric.manager; + +import com.voinearadu.commandmanager.common.manager.CommonMiniMessageManager; +import net.kyori.adventure.platform.fabric.FabricAudiences; +import net.kyori.adventure.platform.fabric.FabricServerAudiences; +import net.kyori.adventure.text.TextComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import org.jetbrains.annotations.NotNull; + + +public class FabricMiniMessageManager extends CommonMiniMessageManager { + + private final FabricAudiences audiences; + + public FabricMiniMessageManager(MinecraftServer server) { + this.audiences = FabricServerAudiences.of(server); + } + + public FabricMiniMessageManager(FabricAudiences audiences) { + this.audiences = audiences; + } + + @Override + public @NotNull Component toNative(@NotNull net.kyori.adventure.text.Component component) { + return audiences.toNative(component); + } + + @Override + public @NotNull String sanitize(net.kyori.adventure.text.Component component) { + TextComponent textComponent = (TextComponent) component; + return textComponent.content(); + } +} diff --git a/src/fabric_1_19/src/main/resources/assets/command_manager/icon.png b/src/fabric_1_19/src/main/resources/assets/command_manager/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5d31fa6b2336ab35424cb2a01e49f87c462b0eda GIT binary patch literal 561 zcmV-10?z%3P)EX>4Tx04R}tkv&MmKpe$iQ>7}E4t7v+$WWauh>8df^uY36TdKcwc-sk=ty-LnxfKMczWx8PzZxByy zS~}-_;xH>p3h_Dds6iJbe&o9B@*C%Z!vfC?8|l`&;A;htWB_tt2MinKLVIfMZMv93P?Z-U)gN{E*E}2{< zFmf!Q0u_?u2mgcL-J1D{aW^R#13F)9`(qdg>;jFNZGRuzcH;!_KLb}<%U`Jj)1Rc* zT3X}?2yFuw*DX!n11@)f{wG~BBuDbo6!LlC{fxdT3-sLrJ!@`n&3&9c0BPzfaRVG2 z0wV>=UiWx+S9@>&o@w^?1Cal6vri5Y&;S4c32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri2?q~5JJGkAa{vGU8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b z02)a|K~yNuWBmXBKLaU%iGf5gs$o>a(9r+@Rc!+upDq=m00000NkvXXu0mjfL0R9} literal 0 HcmV?d00001 diff --git a/src/fabric_1_19/src/main/resources/fabric.mod.json b/src/fabric_1_19/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..98c5b87 --- /dev/null +++ b/src/fabric_1_19/src/main/resources/fabric.mod.json @@ -0,0 +1,20 @@ +{ + "schemaVersion": 1, + "id": "command_manager_fabric_19", + "version": "UNKNOWN", + "name": "Command Manager Fabric 1.19", + "description": "", + "authors": [], + "contact": { + "repo": "https://github.com/PokeNinjas/Fabric_1_19" + }, + "license": "All-Rights-Reserved", + "icon": "assets/command_manager/icon.png", + "environment": "server", + "entrypoints": { + "client": [], + "main": [] + }, + "mixins": [], + "depends": {} +} diff --git a/src/velocity/build.gradle.kts b/src/velocity/build.gradle.kts new file mode 100644 index 0000000..7d3fb98 --- /dev/null +++ b/src/velocity/build.gradle.kts @@ -0,0 +1,11 @@ +@file:Suppress("VulnerableLibrariesLocal") + +dependencies { + // Velocity + compileOnly(libs.velocity) + annotationProcessor(libs.velocity) + + // Project + api(project(":command-manager-common")) +} + diff --git a/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/command/VelocityCommand.java b/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/command/VelocityCommand.java new file mode 100644 index 0000000..e0d208f --- /dev/null +++ b/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/command/VelocityCommand.java @@ -0,0 +1,144 @@ +package com.voinearadu.commandmanager.velocity.command; + +import com.voinearadu.commandmanager.common.command.CommonCommand; +import com.voinearadu.commandmanager.common.manager.CommonCommandManager; +import com.voinearadu.commandmanager.common.utils.ListUtils; +import com.voinearadu.commandmanager.velocity.manager.VelocityCommandManager; +import com.voinearadu.logger.Logger; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.command.SimpleCommand; +import com.velocitypowered.api.proxy.ConsoleCommandSource; +import com.velocitypowered.api.proxy.Player; +import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +// TODO(low) Maybe Add minimum number of arguments and check for it +// TODO(low) Send help command instead of the the "This command does not implement the logic for <> execution" +public abstract class VelocityCommand extends CommonCommand implements SimpleCommand { + + private final VelocityCommandManager commandManager; + + public VelocityCommand(CommonCommandManager commandManager) { + super(commandManager); + this.commandManager = (VelocityCommandManager) commandManager; + } + + @Override + public final List suggest(Invocation invocation) { + int argsLength = invocation.arguments().length; + List arguments = Arrays.asList(invocation.arguments()); + + if (argsLength == 0) { + return onAutoComplete(arguments); + } + + String lastArg = invocation.arguments()[argsLength - 1]; + VelocityCommand subCommand = getSubCommand(lastArg); + + if (subCommand == null) { + if (argsLength == 1) { + return ListUtils.getListThatStartsWith(onAutoComplete(arguments), lastArg); + } + + String lastArg2 = invocation.arguments()[argsLength - 2]; + subCommand = getSubCommand(lastArg2); + + if (subCommand == null) { + return ListUtils.getListThatStartsWith(onAutoComplete(arguments), lastArg2); + } + + return ListUtils.getListThatStartsWith(subCommand.onAutoComplete(arguments), lastArg); + } + + return ListUtils.getListThatStartsWith(onAutoComplete(arguments), lastArg); + } + + private @Nullable VelocityCommand getSubCommand(String name) { + for (VelocityCommand subCommand : getSubCommands()) { + for (String commandName : subCommand.getAliases()) { + if (name.equalsIgnoreCase(commandName)) { + return subCommand; + } + } + } + + return null; + } + + @SuppressWarnings("unused") + public @NotNull List onAutoComplete(List arguments) { + return defaultAutoComplete(); + } + + public @NotNull List defaultAutoComplete() { + List allArguments = new ArrayList<>(); + + for (VelocityCommand subCommand : getSubCommands()) { + allArguments.addAll(subCommand.getAliases()); + } + + return allArguments; + } + + @Override + public final void execute(Invocation invocation) { + execute(invocation.source(), Arrays.asList(invocation.arguments())); + } + + public @NotNull Set getSubCommands() { + return getPrimitiveSubCommands() + .stream().map(command -> (VelocityCommand) command) + .collect(Collectors.toSet()); + } + + @Override + protected final void internalExecutePlayer(@NotNull Object player, @NotNull List arguments) { + executePlayer((Player) player, arguments); + } + + @Override + protected final void internalExecuteConsole(@NotNull Object console, @NotNull List arguments) { + executeConsole((ConsoleCommandSource) console, arguments); + } + + @Override + protected final void internalExecuteCommon(@NotNull Object sender, @NotNull List arguments) { + executeCommon((CommandSource) sender, arguments); + } + + protected void executePlayer(Player player, List arguments) { + player.sendMessage(Component.text("This command does not implement the logic for player-only execution.")); + } + + @SuppressWarnings({"unused"}) + protected void executeConsole(ConsoleCommandSource console, List arguments) { + console.sendMessage(Component.text("This command does not implement the logic for console-only execution.")); + } + + protected void executeCommon(CommandSource sender, List arguments) { + if (sender instanceof Player) { + executePlayer((Player) sender, arguments); + return; + } + + if (sender instanceof ConsoleCommandSource) { + executeConsole((ConsoleCommandSource) sender, arguments); + return; + } + + Logger.error("Unknown command sender type: " + sender.getClass().getName() + " for command: " + getAliases().get(0)); + } + + protected List recommendPlayersList() { + return commandManager.getProxy().getAllPlayers().stream() + .map(Player::getUsername) + .toList(); + } +} \ No newline at end of file diff --git a/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/manager/VelocityCommandManager.java b/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/manager/VelocityCommandManager.java new file mode 100644 index 0000000..16e1c86 --- /dev/null +++ b/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/manager/VelocityCommandManager.java @@ -0,0 +1,55 @@ +package com.voinearadu.commandmanager.velocity.manager; + +import com.voinearadu.commandmanager.common.command.CommonCommand; +import com.voinearadu.commandmanager.common.manager.CommonCommandManager; +import com.voinearadu.commandmanager.velocity.command.VelocityCommand; +import com.voinearadu.reflections.Reflections; +import com.velocitypowered.api.command.CommandMeta; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.ConsoleCommandSource; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +@Getter +public class VelocityCommandManager extends CommonCommandManager { + + private final ProxyServer proxy; + private final VelocityMiniMessageManager miniMessageManager; + + public VelocityCommandManager(@NotNull Reflections reflections, @NotNull String basePermission, + @NotNull ProxyServer proxy) { + super(reflections, Player.class, ConsoleCommandSource.class, CommandSource.class, basePermission); + + this.proxy = proxy; + this.miniMessageManager = new VelocityMiniMessageManager(); + } + + @Override + protected void platformRegister(@NotNull CommonCommand primitiveCommand) { + VelocityCommand command = (VelocityCommand) primitiveCommand; + + com.velocitypowered.api.command.CommandManager commandManager = proxy.getCommandManager(); + + CommandMeta commandMeta = commandManager.metaBuilder(command.getMainAlias()) + .aliases(command.getAliases().subList(1, command.getAliases().size()).toArray(new String[0])) + .plugin(this) + .build(); + + + commandManager.register(commandMeta, command); + } + + @Override + public final void sendMessage(Object user, String message) { + CommandSource source = (CommandSource) user; + source.sendMessage(miniMessageManager.parse(message)); + } + + @Override + public void broadcastMessage(String message) { + proxy.sendMessage(miniMessageManager.parse(message)); + } + +} diff --git a/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/manager/VelocityMiniMessageManager.java b/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/manager/VelocityMiniMessageManager.java new file mode 100644 index 0000000..f32d26e --- /dev/null +++ b/src/velocity/src/main/java/com/voinearadu/commandmanager/velocity/manager/VelocityMiniMessageManager.java @@ -0,0 +1,20 @@ +package com.voinearadu.commandmanager.velocity.manager; + +import com.voinearadu.commandmanager.common.manager.CommonMiniMessageManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import org.jetbrains.annotations.NotNull; + +public class VelocityMiniMessageManager extends CommonMiniMessageManager { + + @Override + public @NotNull Component toNative(@NotNull Component component) { + return component; + } + + @Override + public @NotNull String sanitize(Component component) { + TextComponent textComponent = (TextComponent) component; + return textComponent.content(); + } +}