summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example/pom.xml50
-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.yml4
-rw-r--r--plugin.yml4
-rw-r--r--pom.xml42
-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.java20
-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.java39
-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
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e60118f
--- /dev/null
+++ b/pom.xml
@@ -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