diff options
-rw-r--r-- | example/pom.xml | 50 | ||||
-rw-r--r-- | example/src/main/java/com/nemez/cmdMgrExample/CmdMgrExample.java (renamed from CmdMgrTest.java) | 131 | ||||
-rw-r--r-- | example/src/main/java/com/nemez/cmdMgrExample/example.cmd (renamed from test.cmd) | 71 | ||||
-rw-r--r-- | example/src/main/resources/plugin.yml | 4 | ||||
-rw-r--r-- | plugin.yml | 4 | ||||
-rw-r--r-- | pom.xml | 42 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/Command.java (renamed from com/nemez/cmdmgr/Command.java) | 11 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/CommandManager.java (renamed from com/nemez/cmdmgr/CommandManager.java) | 210 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/EmptyCommand.java | 20 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/ArgumentComponent.java (renamed from com/nemez/cmdmgr/component/ArgumentComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/BooleanComponent.java (renamed from com/nemez/cmdmgr/component/BooleanComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/ByteComponent.java (renamed from com/nemez/cmdmgr/component/ByteComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/ChainComponent.java (renamed from com/nemez/cmdmgr/component/ChainComponent.java) | 5 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/ConstantComponent.java (renamed from com/nemez/cmdmgr/component/ConstantComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/DoubleComponent.java (renamed from com/nemez/cmdmgr/component/DoubleComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/EmptyComponent.java (renamed from com/nemez/cmdmgr/component/EmptyComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/FloatComponent.java (renamed from com/nemez/cmdmgr/component/FloatComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/ICommandComponent.java (renamed from com/nemez/cmdmgr/component/ICommandComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/IntegerComponent.java (renamed from com/nemez/cmdmgr/component/IntegerComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/LongComponent.java (renamed from com/nemez/cmdmgr/component/LongComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/OptionalComponent.java (renamed from com/nemez/cmdmgr/component/OptionalComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/ShortComponent.java (renamed from com/nemez/cmdmgr/component/ShortComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/component/StringComponent.java (renamed from com/nemez/cmdmgr/component/StringComponent.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java | 39 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/util/BranchStack.java (renamed from com/nemez/cmdmgr/util/BranchStack.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/util/Executable.java (renamed from com/nemez/cmdmgr/util/Executable.java) | 87 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/util/ExecutableDefinition.java (renamed from com/nemez/cmdmgr/util/ExecutableDefinition.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/util/HelpPageCommand.java (renamed from com/nemez/cmdmgr/util/HelpPageCommand.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/util/Property.java (renamed from com/nemez/cmdmgr/util/Property.java) | 0 | ||||
-rw-r--r-- | src/main/java/com/nemez/cmdmgr/util/Type.java (renamed from com/nemez/cmdmgr/util/Type.java) | 0 |
30 files changed, 524 insertions, 150 deletions
diff --git a/example/pom.xml b/example/pom.xml new file mode 100644 index 0000000..55f7311 --- /dev/null +++ b/example/pom.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.redstoner</groupId> + <artifactId>CommandManagerExample</artifactId> + <version>0.1</version> + + <packaging>jar</packaging> + + <properties> + <maven.compiler.source>1.8</maven.compiler.source> + <maven.compiler.target>1.8</maven.compiler.target> + </properties> + + <repositories> + <repository> + <id>spigot-repo</id> + <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url> + </repository> + </repositories> + + <dependencies> + <!--Spigot API--> + <dependency> + <groupId>org.spigotmc</groupId> + <artifactId>spigot-api</artifactId> + <version>1.12.2-R0.1-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + <!--Bukkit API--> + <dependency> + <groupId>org.bukkit</groupId> + <artifactId>bukkit</artifactId> + <version>1.12.2-R0.1-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>com.redstoner</groupId> + <artifactId>CommandManager</artifactId> + <version>1.0</version> + <scope>provided</scope> + </dependency> + </dependencies> + + +</project>
\ No newline at end of file diff --git a/CmdMgrTest.java b/example/src/main/java/com/nemez/cmdMgrExample/CmdMgrExample.java index 86bb9b5..41d714f 100644 --- a/CmdMgrTest.java +++ b/example/src/main/java/com/nemez/cmdMgrExample/CmdMgrExample.java @@ -1,65 +1,66 @@ -
-import java.io.File;
-
-import org.bukkit.command.CommandSender;
-import org.bukkit.plugin.java.JavaPlugin;
-
-import com.nemez.cmdmgr.Command;
-import com.nemez.cmdmgr.CommandManager;
-
-public class CmdMgrTest extends JavaPlugin {
-
- public void onEnable() {
- CommandManager.registerCommand(new File("plugins/test.cmd"), this, this);
- }
-
- public void onDisable() {
-
- }
-
- @Command(hook="home_empty")
- public boolean executeHomeNull(CommandSender sender) {
- sender.sendMessage("You executed an empty /home");
- return true;
- }
-
- @Command(hook="home_set")
- public boolean executeSetHome(CommandSender sender, String name) {
- sender.sendMessage("You executed:");
- sender.sendMessage("/home set " + name);
- return true;
- }
-
- @Command(hook="home_set_coords")
- public boolean executeSetHomeBasedOnCoords(CommandSender sender, String name, int x, int y, int z) {
- sender.sendMessage("You executed:");
- sender.sendMessage("/home set " + name + " " + x + " " + y + " " + z);
- return true;
- }
-
- @Command(hook="home_del")
- public void executeDelHome(CommandSender sender, String name, boolean aFlag) {
- sender.sendMessage("You executed:");
- sender.sendMessage("/home del " + name);
- sender.sendMessage("-a - " + aFlag);
- }
-
- @Command(hook="home_list")
- public void executeListHomes(CommandSender sender) {
- sender.sendMessage("You executed:");
- sender.sendMessage("/home list");
- }
-
- @Command(hook="home_tp")
- public void executeTeleportHome(CommandSender sender, String name) {
- sender.sendMessage("You executed:");
- sender.sendMessage("/home " + name);
- }
-
- @Command(hook="noskope")
- public boolean executeMagik(CommandSender sender) {
- sender.sendMessage("You executed!!!!!!!!!:");
- sender.sendMessage("/home yolo swag");
- return true;
- }
-}
+package com.nemez.cmdMgrExample; + +import java.io.File; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; + +import com.nemez.cmdmgr.Command; +import com.nemez.cmdmgr.CommandManager; + +public class CmdMgrExample extends JavaPlugin { + + public void onEnable() { + CommandManager.registerCommand(new File("plugins/example.cmd"), this, this); + } + + public void onDisable() { + + } + + @Command(hook="home_empty") + public boolean executeHomeNull(CommandSender sender) { + sender.sendMessage("You executed an empty /home"); + return true; + } + + @Command(hook="home_set") + public boolean executeSetHome(CommandSender sender, String name) { + sender.sendMessage("You executed:"); + sender.sendMessage("/home set " + name); + return true; + } + + @Command(hook="home_set_coords") + public boolean executeSetHomeBasedOnCoords(CommandSender sender, String name, int x, int y, int z) { + sender.sendMessage("You executed:"); + sender.sendMessage("/home set " + name + " " + x + " " + y + " " + z); + return true; + } + + @Command(hook="home_del") + public void executeDelHome(CommandSender sender, String name, boolean aFlag) { + sender.sendMessage("You executed:"); + sender.sendMessage("/home del " + name); + sender.sendMessage("-a - " + aFlag); + } + + @Command(hook="home_list") + public void executeListHomes(CommandSender sender) { + sender.sendMessage("You executed:"); + sender.sendMessage("/home list"); + } + + @Command(hook="home_tp") + public void executeTeleportHome(CommandSender sender, String name) { + sender.sendMessage("You executed:"); + sender.sendMessage("/home " + name); + } + + @Command(hook="noskope") + public boolean executeMagik(CommandSender sender) { + sender.sendMessage("You executed!!!!!!!!!:"); + sender.sendMessage("/home yolo swag"); + return true; + } +} diff --git a/test.cmd b/example/src/main/java/com/nemez/cmdMgrExample/example.cmd index 7e0ce89..da36e44 100644 --- a/test.cmd +++ b/example/src/main/java/com/nemez/cmdMgrExample/example.cmd @@ -1,35 +1,36 @@ -
-command home {
-
- set [string:name] {
- [int:x] [int:y] [int:z] {
- run home_set_coords name x y z;
- perm home.set.xyz;
- help Sets a new home at coordinates XYZ;
- }
- run home_set name;
- perm home.set;
- help Sets a new home;
- type none;
- }
- del [optional:-a] [string:name] {
- run home_del name -a;
- help Deletes a home\n&cCannot be undone!;
- perm home.del;
- }
- list {
- help Shows all homes;
- run home_list;
- perm home.list;
- }
- [string:name] {
- perm home.tp;
- help Teleports to a home;
- run home_tp name;
- }
- yolo swag {
- perm yo.mamma;
- help Reks you;
- run noskope;
- }
-}
\ No newline at end of file + +command home { + alias h; + alias bleh; + set [string:name] { + [int:x] [int:y] [int:z] { + run home_set_coords name x y z; + perm home.set.xyz; + help Sets a new home at coordinates XYZ; + } + run home_set name; + perm home.set; + help Sets a new home; + type none; + } + del [optional:-a] [string:name] { + run home_del name -a; + help Deletes a home\n&cCannot be undone!; + perm home.del; + } + list { + help Shows all homes; + run home_list; + perm home.list; + } + [string:name] { + perm home.tp; + help Teleports to a home; + run home_tp name; + } + yolo swag { + perm yo.mamma; + help Reks you; + run noskope; + } +} diff --git a/example/src/main/resources/plugin.yml b/example/src/main/resources/plugin.yml new file mode 100644 index 0000000..2c87d8a --- /dev/null +++ b/example/src/main/resources/plugin.yml @@ -0,0 +1,4 @@ +name: CommandManagerTest +main: com.nemez.cmdMgrExample.CmdMgrExample +version: 13.37 +author: Nemes
\ No newline at end of file diff --git a/plugin.yml b/plugin.yml deleted file mode 100644 index f752976..0000000 --- a/plugin.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: CommandManagerTest
-main: CmdMgrTest
-version: 13.37
-author: Nemes
\ No newline at end of file @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.redstoner</groupId> + <artifactId>CommandManager</artifactId> + <version>1.0</version> + + <packaging>jar</packaging> + + <properties> + <maven.compiler.source>1.8</maven.compiler.source> + <maven.compiler.target>1.8</maven.compiler.target> + </properties> + + <repositories> + <repository> + <id>spigot-repo</id> + <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url> + </repository> + </repositories> + + <dependencies> + <!--Spigot API--> + <dependency> + <groupId>org.spigotmc</groupId> + <artifactId>spigot-api</artifactId> + <version>1.12.2-R0.1-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + <!--Bukkit API--> + <dependency> + <groupId>org.bukkit</groupId> + <artifactId>bukkit</artifactId> + <version>1.12.2-R0.1-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + </dependencies> + +</project>
\ No newline at end of file diff --git a/com/nemez/cmdmgr/Command.java b/src/main/java/com/nemez/cmdmgr/Command.java index ff8622c..f9eaf49 100644 --- a/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/com/nemez/cmdmgr/CommandManager.java b/src/main/java/com/nemez/cmdmgr/CommandManager.java index ae788c7..d298ea1 100644 --- a/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;
@@ -5,11 +6,17 @@ 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.List;
+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;
@@ -100,6 +107,11 @@ 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<Executable> asyncExecutables = new ArrayList<Executable>();
+ public static HashMap<Object, ArrayList<String>> commands = new HashMap<Object, ArrayList<String>>();
+ /* */
+
/**
* Registers a command from a String of source code
*
@@ -139,10 +151,11 @@ 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) {
+ e.printStackTrace();
plugin.getLogger().log(Level.WARNING, "Error while loading command file. (" + sourceFile.getAbsolutePath() + ")");
plugin.getLogger().log(Level.WARNING, e.getCause().toString());
errors = true;
@@ -165,7 +178,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) {
@@ -178,6 +191,176 @@ public class CommandManager { }
/**
+ * Unregisters all commands from a source File
+ *
+ * @param sourceFile file containing source code
+ * @param plugin your plugin class
+ */
+ public static void unregisterCommands(File sourceFile, JavaPlugin plugin) {
+ StringBuilder src = new StringBuilder();
+ String buf = "";
+ try {
+ BufferedReader reader = new BufferedReader(new FileReader(sourceFile));
+ while ((buf = reader.readLine()) != null) {
+ src.append(buf + '\n');
+ }
+ reader.close();
+ } catch (Exception e) {
+ plugin.getLogger().log(Level.WARNING, "Error while loading command file. (" + sourceFile.getAbsolutePath() + ")");
+ plugin.getLogger().log(Level.WARNING, e.getCause().toString());
+ return;
+ }
+ unregisterCommands(src.toString());
+ }
+
+ /**
+ * Unregisters all commands from an InputStream
+ *
+ * @param sourceStream input stream containing source code
+ * @param plugin your plugin class
+ */
+ public static void unregisterCommands(InputStream sourceStream, JavaPlugin plugin) {
+ StringBuilder src = new StringBuilder();
+ String buf = "";
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(sourceStream));
+ while ((buf = reader.readLine()) != null) {
+ src.append(buf + '\n');
+ }
+ reader.close();
+ } catch (Exception e) {
+ plugin.getLogger().log(Level.WARNING, "Error while loading command file. (" + sourceStream.toString() + ")");
+ plugin.getLogger().log(Level.WARNING, e.getCause().toString());
+ return;
+ }
+ unregisterCommands(src.toString());
+ }
+
+ /**
+ * Unregisters all commands from a String of source code
+ *
+ * @param cmdSourceCode source code
+ */
+ public static void unregisterCommands(String cmdSourceCode) {
+ if (cmdSourceCode == null) {
+ return;
+ }
+ parseUnregister(cmdSourceCode);
+ }
+
+ public static void parseUnregister(String src) {
+ char[] chars = src.toCharArray();
+ StringBuilder buffer = new StringBuilder();
+ int nesting = 0;
+
+ for (int i = 0; i < chars.length; i++) {
+ char c = chars[i];
+
+ if (c == ';') {
+ if (nesting == 1) {
+ String[] alias = buffer.toString().trim().split("\\ ");
+ if (alias.length == 2 && alias[0].equals("alias")) {
+ unregisterCommand(alias[1]);
+ }
+ }
+ buffer = new StringBuilder();
+ }else if (c == '{') {
+ if (nesting == 0) {
+ String[] command = buffer.toString().trim().split("\\ ");
+ if (command.length == 2 && command[0].equals("command")) {
+ unregisterCommand(command[1]);
+ }
+ }
+ if (c == '{') {
+ nesting++;
+ }
+ buffer = new StringBuilder();
+ }else if (c == '}') {
+ nesting--;
+ buffer = new StringBuilder();
+ }else {
+ buffer.append(c);
+ }
+ }
+ }
+
+ /**
+ * Unregisters a command specified by its name or alias
+ *
+ * @param name name or alias of command
+ */
+ public static void unregisterCommand(String name) {
+ EmptyCommand empty = new EmptyCommand(name);
+ try {
+ final Field mapField = Bukkit.getServer().getClass().getDeclaredField("commandMap");
+ mapField.setAccessible(true);
+ CommandMap map = (CommandMap) mapField.get(Bukkit.getServer());
+ final Field knownCommandsField = mapField.getClass().getSuperclass().getDeclaredField("knownCommands");
+ knownCommandsField.setAccessible(true);
+ @SuppressWarnings("unchecked")
+ Map<String, Command> knownCommands = (Map<String, Command>) knownCommandsField.get(map);
+ knownCommands.remove(name);
+ map.register(name, empty);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ 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().getSuperclass().getDeclaredField("knownCommands");
+ knownCommandsField.setAccessible(true);
+ @SuppressWarnings("unchecked")
+ Map<String, Command> knownCommands = (Map<String, Command>) knownCommandsField.get(map);
+ knownCommands.remove(name);
+ map.register(name, emptyCommand);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void unregisterAllWithFallback(String fallback) {
+ try {
+ final Field cmdMap = Bukkit.getServer().getClass().getDeclaredField("commandMap");
+ cmdMap.setAccessible(true);
+ CommandMap map = (CommandMap) cmdMap.get(Bukkit.getServer());
+ final Field knownCommandsField = map.getClass().getSuperclass().getDeclaredField("knownCommands");
+ knownCommandsField.setAccessible(true);
+ @SuppressWarnings("unchecked")
+ Map<String, org.bukkit.command.Command> knownCommands = (Map<String, org.bukkit.command.Command>) knownCommandsField.get(map);
+
+ fallback = fallback.toLowerCase();
+
+ List<String> toRemove = new ArrayList<>();
+
+ for (String key: knownCommands.keySet()) {
+ org.bukkit.command.Command value = knownCommands.get(key);
+ if ((value instanceof Executable) && ((Executable)value).getMethodContainerName().equals(fallback)) {
+ toRemove.add(key);
+ value.unregister(map);
+ }
+ }
+ for (String key : toRemove) {
+ EmptyCommand emptyCommand = new EmptyCommand(key);
+ knownCommands.remove(key);
+ map.register(key, emptyCommand);
+ }
+
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
* Parses the source code into an abstract command syntax
*
* @param source String containing command source code
@@ -197,6 +380,8 @@ public class CommandManager { boolean insideType = false;
/* if we are currently gathering chars from the command name */
boolean gettingName = false;
+ /* if we are currently gathering chars for aliases */
+ boolean gettingAlias = false;
/* the previous char, used for backslash escaping */
char previous = '\0';
/* the current 'array' of sub-commands we are parsing */
@@ -213,7 +398,7 @@ public class CommandManager { int line = 0;
// buffer for '...' and '"' properties of string types
StringBuilder sideBuffer = new StringBuilder();
-
+
/* iterate over all characters */
for (int i = 0; i < chars.length; i++) {
/* get current char */
@@ -255,7 +440,7 @@ public class CommandManager { /* help this is an example; */
/* ^ */
}else if (current == ';') {
- /* semicolon is bashslash escaped, treat it as a normal character */
+ /* semicolon is backslash escaped, treat it as a normal character */
if (previous == '\\') {
buffer.append(';');
}else{
@@ -266,7 +451,10 @@ public class CommandManager { return false;
}
/* we are defining the 'help' property, set it to what we just gathered */
- if (currentProp == Property.HELP) {
+ if (gettingAlias) {
+ stack.get().aliases.add(buffer.toString());
+ gettingAlias = false;
+ }else if (currentProp == Property.HELP) {
stack.get().help = buffer.toString();
/* same as above, except its the function to run */
}else if (currentProp == Property.EXECUTE) {
@@ -301,6 +489,7 @@ public class CommandManager { if (gettingName && cmdName == null) {
/* set the command name to what we just gathered (trimmed) */
cmdName = buffer.toString().trim();
+ gettingName = false;
}else{
/* are we currently in an argument? */
if (currentArgComp == null) {
@@ -376,9 +565,11 @@ public class CommandManager { buffer.append(' ');
}else{
/* we got the 'command' definition, the name of the command will follow */
- if (buffer.toString().equals("command") && !gettingName && cmdName == null) {
+ if (buffer.toString().equals("command") && !gettingName && !gettingAlias && cmdName == null) {
gettingName = true;
/* we got other properties, their values will follow */
+ }else if (buffer.toString().equals("alias") && !gettingAlias && !gettingName) {
+ gettingAlias = true;
}else if (buffer.toString().equals("help")) {
currentProp = Property.HELP;
}else if (buffer.toString().equals("run")) {
@@ -394,6 +585,7 @@ public class CommandManager { /* we are getting the name and we didn't set it yet, set it */
if (gettingName && cmdName == null) {
cmdName = buffer.toString().trim();
+ gettingName = false;
}else{
/* we aren't defining a type, put the current text into the sub-command as a constant */
if (currentArgComp == null) {
@@ -562,8 +754,8 @@ public class CommandManager { components.help = null;
components.permission = null;
components.type = null;
- Executable cmd = new Executable(cmdName, constructHelpPages(cmdName, components));
- cmd.register(methods, plugin, methodContainer);
+ Executable cmd = new Executable(cmdName, constructHelpPages(cmdName, components), methodContainer.getClass().getSimpleName());
+ cmd.register(methods, plugin, methodContainer, components.getAliases());
}
private static ArrayList<HelpPageCommand[]> constructHelpPages(String cmdName, ChainComponent root) {
@@ -626,4 +818,4 @@ public class CommandManager { return data;
}
-}
+}//@format
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..770ed77 --- /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("§cCommand no longer Exists. Use §e/help§c, §e/plugins§c or ask a mod."); + return true; + } +} diff --git a/com/nemez/cmdmgr/component/ArgumentComponent.java b/src/main/java/com/nemez/cmdmgr/component/ArgumentComponent.java index 939d9cb..939d9cb 100644 --- a/com/nemez/cmdmgr/component/ArgumentComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/ArgumentComponent.java diff --git a/com/nemez/cmdmgr/component/BooleanComponent.java b/src/main/java/com/nemez/cmdmgr/component/BooleanComponent.java index 8290fc5..8290fc5 100644 --- a/com/nemez/cmdmgr/component/BooleanComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/BooleanComponent.java diff --git a/com/nemez/cmdmgr/component/ByteComponent.java b/src/main/java/com/nemez/cmdmgr/component/ByteComponent.java index f0e8d74..f0e8d74 100644 --- a/com/nemez/cmdmgr/component/ByteComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/ByteComponent.java diff --git a/com/nemez/cmdmgr/component/ChainComponent.java b/src/main/java/com/nemez/cmdmgr/component/ChainComponent.java index d837d16..691a85d 100644 --- a/com/nemez/cmdmgr/component/ChainComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/ChainComponent.java @@ -11,6 +11,7 @@ public class ChainComponent implements ICommandComponent { public String help;
public String execute;
public Type type;
+ public ArrayList<String> aliases = new ArrayList<String>();
public ChainComponent() {
components = new ArrayList<ICommandComponent>();
@@ -47,4 +48,8 @@ public class ChainComponent implements ICommandComponent { public ArrayList<ICommandComponent> getComponents() {
return components;
}
+
+ public ArrayList<String> getAliases() {
+ return aliases;
+ }
}
diff --git a/com/nemez/cmdmgr/component/ConstantComponent.java b/src/main/java/com/nemez/cmdmgr/component/ConstantComponent.java index 00e255e..00e255e 100644 --- a/com/nemez/cmdmgr/component/ConstantComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/ConstantComponent.java diff --git a/com/nemez/cmdmgr/component/DoubleComponent.java b/src/main/java/com/nemez/cmdmgr/component/DoubleComponent.java index 28a5398..28a5398 100644 --- a/com/nemez/cmdmgr/component/DoubleComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/DoubleComponent.java diff --git a/com/nemez/cmdmgr/component/EmptyComponent.java b/src/main/java/com/nemez/cmdmgr/component/EmptyComponent.java index 35e4d26..35e4d26 100644 --- a/com/nemez/cmdmgr/component/EmptyComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/EmptyComponent.java diff --git a/com/nemez/cmdmgr/component/FloatComponent.java b/src/main/java/com/nemez/cmdmgr/component/FloatComponent.java index 039378a..039378a 100644 --- a/com/nemez/cmdmgr/component/FloatComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/FloatComponent.java diff --git a/com/nemez/cmdmgr/component/ICommandComponent.java b/src/main/java/com/nemez/cmdmgr/component/ICommandComponent.java index 5dbb17b..5dbb17b 100644 --- a/com/nemez/cmdmgr/component/ICommandComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/ICommandComponent.java diff --git a/com/nemez/cmdmgr/component/IntegerComponent.java b/src/main/java/com/nemez/cmdmgr/component/IntegerComponent.java index aafab8d..aafab8d 100644 --- a/com/nemez/cmdmgr/component/IntegerComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/IntegerComponent.java diff --git a/com/nemez/cmdmgr/component/LongComponent.java b/src/main/java/com/nemez/cmdmgr/component/LongComponent.java index d97f1bb..d97f1bb 100644 --- a/com/nemez/cmdmgr/component/LongComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/LongComponent.java diff --git a/com/nemez/cmdmgr/component/OptionalComponent.java b/src/main/java/com/nemez/cmdmgr/component/OptionalComponent.java index 1d1c839..1d1c839 100644 --- a/com/nemez/cmdmgr/component/OptionalComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/OptionalComponent.java diff --git a/com/nemez/cmdmgr/component/ShortComponent.java b/src/main/java/com/nemez/cmdmgr/component/ShortComponent.java index cad6719..cad6719 100644 --- a/com/nemez/cmdmgr/component/ShortComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/ShortComponent.java diff --git a/com/nemez/cmdmgr/component/StringComponent.java b/src/main/java/com/nemez/cmdmgr/component/StringComponent.java index 9b7a717..9b7a717 100644 --- a/com/nemez/cmdmgr/component/StringComponent.java +++ b/src/main/java/com/nemez/cmdmgr/component/StringComponent.java 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<ICommandComponent> cmd, ArrayList<Integer> 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/com/nemez/cmdmgr/util/BranchStack.java b/src/main/java/com/nemez/cmdmgr/util/BranchStack.java index f89094f..f89094f 100644 --- a/com/nemez/cmdmgr/util/BranchStack.java +++ b/src/main/java/com/nemez/cmdmgr/util/BranchStack.java diff --git a/com/nemez/cmdmgr/util/Executable.java b/src/main/java/com/nemez/cmdmgr/util/Executable.java index c757c9e..9f39100 100644 --- a/com/nemez/cmdmgr/util/Executable.java +++ b/src/main/java/com/nemez/cmdmgr/util/Executable.java @@ -1,9 +1,11 @@ +//@noformat
package com.nemez.cmdmgr.util;
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;
@@ -14,6 +16,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;
@@ -32,16 +35,23 @@ public class Executable extends org.bukkit.command.Command { private ArrayList<ExecutableDefinition> commands;
private ArrayList<HelpPageCommand[]> help;
private String name;
+ private String methodContainerName;
private JavaPlugin plugin;
- public Executable(String name, ArrayList<HelpPageCommand[]> help) {
+ public Executable(String name, ArrayList<HelpPageCommand[]> help, String methodContainerName) {
super(name);
this.help = help;
this.name = name;
this.commands = new ArrayList<ExecutableDefinition>();
+ this.methodContainerName = methodContainerName;
}
- public void register(ArrayList<Method> methods, JavaPlugin plugin, Object methodContainer) {
+ public String getMethodContainerName() {
+ return methodContainerName;
+ }
+
+ public void register(ArrayList<Method> methods, JavaPlugin plugin, Object methodContainer, ArrayList<String> aliases) {
+ methodContainerName = methodContainer.getClass().getSimpleName().toLowerCase();
for (HelpPageCommand[] page : help) {
for (HelpPageCommand cmd : page) {
if (cmd != null) {
@@ -86,7 +96,19 @@ 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());
- map.register(name, this);
+ final Field knownCommandsField = map.getClass().getSuperclass().getDeclaredField("knownCommands");
+ knownCommandsField.setAccessible(true);
+ @SuppressWarnings("unchecked")
+ Map<String, Command> knownCommands = (Map<String, Command>) knownCommandsField.get(map);
+ knownCommands.remove(name);
+ map.register(methodContainerName, this);
+ for (String alias : aliases) {
+ Executable cmd = new Executable(alias, this.help, methodContainerName);
+ cmd.commands = this.commands;
+ cmd.plugin = this.plugin;
+ knownCommands.remove(alias);
+ map.register(methodContainerName, cmd);
+ }
} catch (Exception e) {
plugin.getLogger().log(Level.SEVERE, "Failed to register command '" + name + "'!");
e.printStackTrace();
@@ -263,8 +285,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
@@ -273,41 +302,28 @@ public class Executable extends org.bukkit.command.Command { if (args_.length == 0) {
args = new String[0];
}else{
- char[] rawArgs = (String.join(" ", args_) + ' ').toCharArray();
- int argSize = 0;
- char last = '\0';
- boolean inString = false;
-
- for (char c : rawArgs) {
- if (c == '"') {
- if (last != '\\') {
- inString = !inString;
- }
- }else if (c == ' ' && !inString) {
- argSize++;
- }
- last = c;
- }
- last = '\0';
- args = new String[argSize];
- String buffer = "";
- int index = 0;
-
- for (char c : rawArgs) {
- if (c == '"') {
- if (last != '\\') {
- inString = !inString;
+ ArrayList<String> tempArgs = new ArrayList<String>();
+ String temp = "";
+ int counter = 0;
+ for (String s : args_) {
+ if (s.endsWith("\\")) {
+ if ((s.length() > 1 && s.charAt(s.length() - 2) == '\\') || counter + 1 == args_.length) {
+ // escaped \
+ tempArgs.add(temp + s.replace("\\\\", "\\"));
+ temp = "";
}else{
- buffer = buffer.substring(0, buffer.length() - 1) + '"';
+ // unescaped \
+ temp += s.substring(0, s.length() - 1).replace("\\\\", "\\") + " ";
}
- }else if (c == ' ' && !inString) {
- args[index] = buffer;
- buffer = "";
- index++;
}else{
- buffer += c;
+ tempArgs.add(temp + s);
+ temp = "";
}
- last = c;
+ counter++;
+ }
+ args = new String[tempArgs.size()];
+ for (int i = 0; i < args.length; i++) {
+ args[i] = tempArgs.get(i);
}
}
ArrayList<ExecutableDefinition> defs = new ArrayList<ExecutableDefinition>();
@@ -426,3 +442,4 @@ public class Executable extends org.bukkit.command.Command { }
}
}
+//@format
diff --git a/com/nemez/cmdmgr/util/ExecutableDefinition.java b/src/main/java/com/nemez/cmdmgr/util/ExecutableDefinition.java index 4e00e9d..4e00e9d 100644 --- a/com/nemez/cmdmgr/util/ExecutableDefinition.java +++ b/src/main/java/com/nemez/cmdmgr/util/ExecutableDefinition.java diff --git a/com/nemez/cmdmgr/util/HelpPageCommand.java b/src/main/java/com/nemez/cmdmgr/util/HelpPageCommand.java index 2229672..2229672 100644 --- a/com/nemez/cmdmgr/util/HelpPageCommand.java +++ b/src/main/java/com/nemez/cmdmgr/util/HelpPageCommand.java diff --git a/com/nemez/cmdmgr/util/Property.java b/src/main/java/com/nemez/cmdmgr/util/Property.java index 4d681b0..4d681b0 100644 --- a/com/nemez/cmdmgr/util/Property.java +++ b/src/main/java/com/nemez/cmdmgr/util/Property.java diff --git a/com/nemez/cmdmgr/util/Type.java b/src/main/java/com/nemez/cmdmgr/util/Type.java index f2fc37b..f2fc37b 100644 --- a/com/nemez/cmdmgr/util/Type.java +++ b/src/main/java/com/nemez/cmdmgr/util/Type.java |