From 72c858db2df7d4c251e714ab9dadac255b6793cd Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 2 Jan 2021 01:24:09 +0300 Subject: [PATCH 1/2] add CommandManager --- build.gradle | 5 +- .../java/ghast/command/CommandExecuter.java | 8 +++ .../java/ghast/command/CommandManager.java | 67 +++++++++++++++++ .../java/ghast/command/CommandWrapper.java | 71 +++++++++++++++++++ .../java/ghast/command/ErrorConsumer.java | 8 +++ 5 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ghast/command/CommandExecuter.java create mode 100644 src/main/java/ghast/command/CommandManager.java create mode 100644 src/main/java/ghast/command/CommandWrapper.java create mode 100644 src/main/java/ghast/command/ErrorConsumer.java diff --git a/build.gradle b/build.gradle index a5fa628..20c8190 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ repositories { mavenLocal() mavenCentral() maven { url 'https://hub.spigotmc.org/nexus/content/groups/public' } + maven { url 'https://dmx-mc-project.gitlab.io/maven-repository/' } } ext { @@ -25,7 +26,8 @@ ext { 'org.yaml:snakeyaml' ]], commons_text: 'org.apache.commons:commons-text:1.9', - lombok: 'org.projectlombok:lombok:1.18.12' + lombok: 'org.projectlombok:lombok:1.18.12', + reflection_object: 'ru.dmitriymx:reflection-object:1.0-BETA' ] } @@ -44,4 +46,5 @@ dependencies { compileOnly2 libs.bukkit implementation libs.commons_text + implementation libs.reflection_object } \ No newline at end of file diff --git a/src/main/java/ghast/command/CommandExecuter.java b/src/main/java/ghast/command/CommandExecuter.java new file mode 100644 index 0000000..e30b807 --- /dev/null +++ b/src/main/java/ghast/command/CommandExecuter.java @@ -0,0 +1,8 @@ +package ghast.command; + +import org.bukkit.command.CommandSender; + +public interface CommandExecuter { + + void execute(CommandSender sender, String[] args); +} diff --git a/src/main/java/ghast/command/CommandManager.java b/src/main/java/ghast/command/CommandManager.java new file mode 100644 index 0000000..58c34b6 --- /dev/null +++ b/src/main/java/ghast/command/CommandManager.java @@ -0,0 +1,67 @@ +package ghast.command; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.UtilityClass; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import ru.dmitriymx.reflection.ReflectionObject; + +@UtilityClass +@SuppressWarnings("unused") +public class CommandManager { + + public Builder create(String name) { + return new Builder(name); + } + + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + public static class Builder { + + private final String name; + private CommandExecuter executer; + private ErrorConsumer errorConsumer; + private Boolean onlyPlayer; + private String deniedMessage; + + public Builder executer(CommandExecuter executer) { + this.executer = executer; + return this; + } + + public Builder onError(ErrorConsumer errorConsumer) { + this.errorConsumer = errorConsumer; + return this; + } + + public Builder useOnlyPlayer(String deniedMessage) { + this.onlyPlayer = true; + this.deniedMessage = deniedMessage; + return this; + } + + public Builder useOnlyPlayer() { + return useOnlyPlayer(null); + } + + public Builder useOnlyConsole(String deniedMessage) { + this.onlyPlayer = false; + this.deniedMessage = deniedMessage; + return this; + } + + public Builder useOnlyConsole() { + return useOnlyConsole(null); + } + + public void register() { + //TODO для Paper такие "извращения" не требуются. Нужно продумать. + new ReflectionObject(Bukkit.getServer()) + .method("getCommandMap").invoke() + .method("register", String.class, Command.class).invoke( + name, new CommandWrapper(name, this.onlyPlayer, this.deniedMessage, + this.executer, this.errorConsumer) + ); + } + } +} diff --git a/src/main/java/ghast/command/CommandWrapper.java b/src/main/java/ghast/command/CommandWrapper.java new file mode 100644 index 0000000..dc2871f --- /dev/null +++ b/src/main/java/ghast/command/CommandWrapper.java @@ -0,0 +1,71 @@ +package ghast.command; + +import ghast.XLog; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.defaults.BukkitCommand; +import org.bukkit.entity.Player; + +class CommandWrapper extends BukkitCommand { + + private static final String DEFAULT_DENIED_MESSAGE_PLAYERS = ChatColor.RED + "This command use only players"; + private static final String DEFAULT_DENIED_MESSAGE_CONSOLE = ChatColor.RED + "This command use only in console"; + + private static final ErrorConsumer DEFAULT_ERROR_CONSUMER = + (sender, commandName, args, exception) -> { + sender.sendMessage(String.format("%sError execute command '%s'!", ChatColor.RED, commandName)); + XLog.error("Error execute command ''{0}'' with args ''{1}''", + commandName, String.join(" ", args), exception); + }; + + private final CommandExecuter executer; + private final ErrorConsumer errorConsumer; + private final Boolean onlyPlayer; + private String deniedMessage; + + protected CommandWrapper(String name, Boolean onlyPlayer, String deniedMessage, + CommandExecuter executer, ErrorConsumer errorConsumer) { + super(name); + this.onlyPlayer = onlyPlayer; + this.executer = executer; + + if (onlyPlayer != null) { + if (deniedMessage == null) { + this.deniedMessage = Boolean.TRUE.equals(onlyPlayer) ? DEFAULT_DENIED_MESSAGE_PLAYERS + : DEFAULT_DENIED_MESSAGE_CONSOLE; + } else { + this.deniedMessage = deniedMessage; + } + } + + if(errorConsumer == null) { + this.errorConsumer = DEFAULT_ERROR_CONSUMER; + } else { + this.errorConsumer = errorConsumer; + } + } + + @Override + @SuppressWarnings("java:S1066") + public boolean execute(CommandSender commandSender, String commandName, String[] args) { + if (Boolean.TRUE.equals(onlyPlayer)) { + if (!(commandSender instanceof Player)) { + commandSender.sendMessage(deniedMessage); + return true; + } + } else if (Boolean.FALSE.equals(onlyPlayer)) { // use console only + if (commandSender instanceof Player) { + commandSender.sendMessage(deniedMessage); + return true; + } + } + + try { + executer.execute(commandSender, args); + return true; + } catch (Exception e) { + errorConsumer.accept(commandSender, commandName, args, e); + return false; + } + } +} diff --git a/src/main/java/ghast/command/ErrorConsumer.java b/src/main/java/ghast/command/ErrorConsumer.java new file mode 100644 index 0000000..57b3711 --- /dev/null +++ b/src/main/java/ghast/command/ErrorConsumer.java @@ -0,0 +1,8 @@ +package ghast.command; + +import org.bukkit.command.CommandSender; + +public interface ErrorConsumer { + + void accept(CommandSender sender, String commandName, String[] args, Exception exception); +} From 45dc6b86b4f28bdc393ed1fb73ad672b2f6ca63a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 2 Jan 2021 01:28:11 +0300 Subject: [PATCH 2/2] CommandManager: add simple register --- src/main/java/ghast/command/CommandManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/ghast/command/CommandManager.java b/src/main/java/ghast/command/CommandManager.java index 58c34b6..b4a27f7 100644 --- a/src/main/java/ghast/command/CommandManager.java +++ b/src/main/java/ghast/command/CommandManager.java @@ -15,6 +15,10 @@ public class CommandManager { return new Builder(name); } + public void register(String name, CommandExecuter executer) { + create(name).executer(executer).register(); + } + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public static class Builder {