From 67a6b13f6448664f093bce88e8814d205d2480dc Mon Sep 17 00:00:00 2001 From: Pepich Date: Wed, 1 Feb 2017 11:55:02 +0100 Subject: Added support for Async commands --- src/main/java/com/nemez/cmdmgr/Command.java | 11 ++++-- src/main/java/com/nemez/cmdmgr/CommandManager.java | 7 +++- .../cmdmgr/util/AsyncExecutableDefinition.java | 39 ++++++++++++++++++++++ .../java/com/nemez/cmdmgr/util/Executable.java | 12 ++++++- 4 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java diff --git a/src/main/java/com/nemez/cmdmgr/Command.java b/src/main/java/com/nemez/cmdmgr/Command.java index ff8622c..f9eaf49 100644 --- a/src/main/java/com/nemez/cmdmgr/Command.java +++ b/src/main/java/com/nemez/cmdmgr/Command.java @@ -7,7 +7,14 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface Command { - +public @interface Command +{ + enum AsyncType + { + NEVER, ALWAYS; + } + String hook(); + + AsyncType async() default AsyncType.NEVER; } diff --git a/src/main/java/com/nemez/cmdmgr/CommandManager.java b/src/main/java/com/nemez/cmdmgr/CommandManager.java index ae788c7..79514cc 100644 --- a/src/main/java/com/nemez/cmdmgr/CommandManager.java +++ b/src/main/java/com/nemez/cmdmgr/CommandManager.java @@ -1,3 +1,4 @@ +//@noformat package com.nemez.cmdmgr; import java.io.BufferedReader; @@ -100,6 +101,10 @@ public class CommandManager { public static String noPermissionFormatting = "&c"; public static String notAllowedFormatting = "&c"; + /* List of all commands that can be invoked async */ + public static ArrayList asyncExecutables = new ArrayList(); + /* */ + /** * Registers a command from a String of source code * @@ -626,4 +631,4 @@ public class CommandManager { return data; } -} +}//@format diff --git a/src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java b/src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java new file mode 100644 index 0000000..7e97705 --- /dev/null +++ b/src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java @@ -0,0 +1,39 @@ +package com.nemez.cmdmgr.util; + +import java.lang.reflect.Method; +import java.util.ArrayList; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; + +import com.nemez.cmdmgr.component.ICommandComponent; + +public class AsyncExecutableDefinition extends ExecutableDefinition +{ + public AsyncExecutableDefinition(ArrayList cmd, ArrayList paramLinks, String perm, + Method method, Object methodContainer, Type type) + { + super(cmd, paramLinks, perm, method, methodContainer, type); + } + + @Override + public boolean invoke(Object[] args, CommandSender sender, JavaPlugin plugin) + { + Thread t = new Thread(new Runnable() + { + @Override + public void run() + { + invokeFromThread(args, sender, plugin); + } + }); + t.setDaemon(true); + t.start(); + return true; + } + + private final void invokeFromThread(Object[] args, CommandSender sender, JavaPlugin plugin) + { + super.invoke(args, sender, plugin); + } +} diff --git a/src/main/java/com/nemez/cmdmgr/util/Executable.java b/src/main/java/com/nemez/cmdmgr/util/Executable.java index c757c9e..01c2dc4 100644 --- a/src/main/java/com/nemez/cmdmgr/util/Executable.java +++ b/src/main/java/com/nemez/cmdmgr/util/Executable.java @@ -1,3 +1,4 @@ +//@noformat package com.nemez.cmdmgr.util; import java.lang.reflect.Field; @@ -14,6 +15,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import com.nemez.cmdmgr.Command; +import com.nemez.cmdmgr.Command.AsyncType; import com.nemez.cmdmgr.CommandManager; import com.nemez.cmdmgr.component.BooleanComponent; import com.nemez.cmdmgr.component.ByteComponent; @@ -263,8 +265,15 @@ public class Executable extends org.bukkit.command.Command { if (etype == null) { etype = Type.BOTH; } - ExecutableDefinition def = new ExecutableDefinition(command, links, permission, target, methodContainer, etype); + ExecutableDefinition def; + AsyncType type = target.getAnnotation(Command.class).async(); + if (type == AsyncType.ALWAYS) + def = new AsyncExecutableDefinition(command, links, permission, target, methodContainer, etype); + else + def = new ExecutableDefinition(command, links, permission, target, methodContainer, etype); commands.add(def); + if (def instanceof AsyncExecutableDefinition) + CommandManager.asyncExecutables.add(this); } @Override @@ -426,3 +435,4 @@ public class Executable extends org.bukkit.command.Command { } } } +//@format -- cgit v1.2.3 From 49e7a1b28dbeeab5a4f1e385c433f83260d1637b Mon Sep 17 00:00:00 2001 From: Nemes Date: Fri, 10 Mar 2017 15:18:44 +0100 Subject: Fixed file loader not appending NL --- src/main/java/com/nemez/cmdmgr/CommandManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/nemez/cmdmgr/CommandManager.java b/src/main/java/com/nemez/cmdmgr/CommandManager.java index 79514cc..59d8629 100644 --- a/src/main/java/com/nemez/cmdmgr/CommandManager.java +++ b/src/main/java/com/nemez/cmdmgr/CommandManager.java @@ -144,7 +144,7 @@ public class CommandManager { try { BufferedReader reader = new BufferedReader(new FileReader(sourceFile)); while ((buf = reader.readLine()) != null) { - src.append(buf); + src.append(buf + '\n'); } reader.close(); } catch (Exception e) { @@ -170,7 +170,7 @@ public class CommandManager { try { BufferedReader reader = new BufferedReader(new InputStreamReader(sourceStream)); while ((buf = reader.readLine()) != null) { - src.append(buf); + src.append(buf + '\n'); } reader.close(); } catch (Exception e) { -- cgit v1.2.3 From 570e627330af7968b10e989ec276bb693942ed6d Mon Sep 17 00:00:00 2001 From: Pepich Date: Thu, 30 Mar 2017 00:56:42 +0200 Subject: Made Executable able to override existing commands --- src/main/java/com/nemez/cmdmgr/util/Executable.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/nemez/cmdmgr/util/Executable.java b/src/main/java/com/nemez/cmdmgr/util/Executable.java index 01c2dc4..bfd608b 100644 --- a/src/main/java/com/nemez/cmdmgr/util/Executable.java +++ b/src/main/java/com/nemez/cmdmgr/util/Executable.java @@ -5,6 +5,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; +import java.util.Map; import java.util.logging.Level; import org.bukkit.Bukkit; @@ -88,6 +89,11 @@ public class Executable extends org.bukkit.command.Command { final Field cmdMap = Bukkit.getServer().getClass().getDeclaredField("commandMap"); cmdMap.setAccessible(true); CommandMap map = (CommandMap) cmdMap.get(Bukkit.getServer()); + final Field knownCommandsField = map.getClass().getDeclaredField("knownCommands"); + knownCommandsField.setAccessible(true); + @SuppressWarnings("unchecked") + Map knownCommands = (Map) knownCommandsField.get(map); + knownCommands.remove(name); map.register(name, this); } catch (Exception e) { plugin.getLogger().log(Level.SEVERE, "Failed to register command '" + name + "'!"); -- cgit v1.2.3 From 6ca0abc74aabbbf0ff5a436070fe80e6686b1a3c Mon Sep 17 00:00:00 2001 From: Pepich Date: Fri, 5 May 2017 09:44:03 +0200 Subject: Added functionality to unregister commands --- src/main/java/com/nemez/cmdmgr/CommandManager.java | 28 ++++++++++++++++++++++ src/main/java/com/nemez/cmdmgr/EmptyCommand.java | 20 ++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/main/java/com/nemez/cmdmgr/EmptyCommand.java diff --git a/src/main/java/com/nemez/cmdmgr/CommandManager.java b/src/main/java/com/nemez/cmdmgr/CommandManager.java index 59d8629..da83aca 100644 --- a/src/main/java/com/nemez/cmdmgr/CommandManager.java +++ b/src/main/java/com/nemez/cmdmgr/CommandManager.java @@ -6,11 +6,16 @@ import java.io.File; import java.io.FileReader; import java.io.InputStream; import java.io.InputStreamReader; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.logging.Level; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandMap; import org.bukkit.plugin.java.JavaPlugin; import com.nemez.cmdmgr.component.ArgumentComponent; @@ -103,6 +108,7 @@ public class CommandManager { /* List of all commands that can be invoked async */ public static ArrayList asyncExecutables = new ArrayList(); + public static HashMap> commands = new HashMap>(); /* */ /** @@ -182,6 +188,28 @@ public class CommandManager { return registerCommand(src.toString(), commandHandler, plugin); } + + public static void unregisterAll(String[] commands) + { + for (String name : commands) + { + EmptyCommand emptyCommand = new EmptyCommand(name); + try { + final Field cmdMap = Bukkit.getServer().getClass().getDeclaredField("commandMap"); + cmdMap.setAccessible(true); + CommandMap map = (CommandMap) cmdMap.get(Bukkit.getServer()); + final Field knownCommandsField = map.getClass().getDeclaredField("knownCommands"); + knownCommandsField.setAccessible(true); + @SuppressWarnings("unchecked") + Map knownCommands = (Map) knownCommandsField.get(map); + knownCommands.remove(name); + map.register(name, emptyCommand); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + /** * Parses the source code into an abstract command syntax * diff --git a/src/main/java/com/nemez/cmdmgr/EmptyCommand.java b/src/main/java/com/nemez/cmdmgr/EmptyCommand.java new file mode 100644 index 0000000..8a29527 --- /dev/null +++ b/src/main/java/com/nemez/cmdmgr/EmptyCommand.java @@ -0,0 +1,20 @@ +package com.nemez.cmdmgr; + +import org.bukkit.command.CommandSender; + +import com.nemez.cmdmgr.util.Executable; + +public class EmptyCommand extends Executable +{ + public EmptyCommand(String name) + { + super(name, null); + } + + @Override + public boolean execute(CommandSender sender, String name, String[] args_) + { + sender.sendMessage("§cUnknown command. Use §e/help§c, §e/plugins§c or ask a mod."); + return true; + } +} -- cgit v1.2.3