diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseBaseCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseBaseCommand.java index 029d6291..f65c8004 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseBaseCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseBaseCommand.java @@ -1,13 +1,18 @@ package me.libraryaddict.disguise.commands; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.parser.DisguisePerm; import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; +import me.libraryaddict.disguise.utilities.parser.ParamInfoManager; +import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; +import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.scoreboard.Team; +import java.lang.reflect.Method; import java.util.*; /** @@ -31,7 +36,124 @@ public abstract class DisguiseBaseCommand implements CommandExecutor { disguiseCommands = map; } - protected ArrayList filterTabs(ArrayList list, String[] origArgs) { + protected List getTabDisguiseTypes(CommandSender sender, DisguisePermissions perms, String[] allArgs, + int startsAt, String currentArg) { + // If not enough arguments to get current disguise type + if (allArgs.length <= startsAt) { + return getAllowedDisguises(perms); + } + + // Get current disguise type + DisguisePerm disguiseType = DisguiseParser.getDisguisePerm(allArgs[startsAt]); + + // If disguise type isn't found, return nothing + if (disguiseType == null) { + return new ArrayList<>(); + } + + // If current argument is just after the disguise type, and disguise type is a player which is not a custom + // disguise + if (allArgs.length == startsAt + 1 && disguiseType.getType() == DisguiseType.PLAYER && + !disguiseType.isCustomDisguise()) { + ArrayList tabs = new ArrayList<>(); + + // Add all player names to tab list + for (Player player : Bukkit.getOnlinePlayers()) { + // If command user cannot see player online, don't tab-complete name + if (sender instanceof Player && !((Player) sender).canSee(player)) { + continue; + } + + tabs.add(player.getName()); + } + + // Return tablist + return tabs; + } + + return getTabDisguiseOptions(sender, perms, disguiseType, allArgs, startsAt + (disguiseType.isPlayer() ? 2 : 1), + currentArg); + } + + /** + * @param perms What permissions they can use + * @param disguisePerm The disguise permission they're using + * @param allArgs All the arguments in the command + * @param startsAt What index this starts at + * @return a list of viable disguise options + */ + protected List getTabDisguiseOptions(CommandSender commandSender, DisguisePermissions perms, + DisguisePerm disguisePerm, String[] allArgs, int startsAt, String currentArg) { + ArrayList usedOptions = new ArrayList<>(); + + Method[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguisePerm.getWatcherClass()); + + // Find which methods the disguiser has already used + for (int i = startsAt; i < allArgs.length; i++) { + for (Method method : methods) { + String arg = allArgs[i]; + + if (!method.getName().equalsIgnoreCase(arg)) { + continue; + } + + usedOptions.add(arg); + break; + } + } + + // If the disguiser has used options that they have not been granted to use, ignore them + if (!perms.isAllowedDisguise(disguisePerm, usedOptions)) { + return new ArrayList<>(); + } + + return getTabDisguiseSubOptions(commandSender, perms, disguisePerm, allArgs, startsAt, currentArg); + } + + protected List getTabDisguiseSubOptions(CommandSender commandSender, DisguisePermissions perms, + DisguisePerm disguisePerm, String[] allArgs, int startsAt, String currentArg) { + boolean addMethods = true; + List tabs = new ArrayList<>(); + + // Check what argument was used before the current argument to see what we're displaying + if (allArgs.length > startsAt) { + String prevArg = allArgs[allArgs.length - 1]; + + ParamInfo info = ParamInfoManager.getParamInfo(disguisePerm, prevArg); + + // If the previous argument is a method + if (info != null) { + if (!info.isParam(boolean.class)) { + addMethods = false; + } + + // If there is a list of default values + if (info.hasValues()) { + tabs.addAll(info.getEnums(currentArg)); + } else if (info.isParam(String.class)) { + for (Player player : Bukkit.getOnlinePlayers()) { + // If command user cannot see player online, don't tab-complete name + if (commandSender instanceof Player && !((Player) commandSender).canSee(player)) { + continue; + } + + tabs.add(player.getName()); + } + } + } + } + + if (addMethods) { + // If this is a method, add. Else if it can be a param of the previous argument, add. + for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguisePerm.getWatcherClass())) { + tabs.add(method.getName()); + } + } + + return tabs; + } + + protected List filterTabs(List list, String[] origArgs) { if (origArgs.length == 0) return list; @@ -73,7 +195,11 @@ public abstract class DisguiseBaseCommand implements CommandExecutor { return allowedDisguises; } - protected String[] getArgs(String[] args) { + /** + * @param args + * @return Array of strings excluding current argument + */ + protected String[] getPreviousArgs(String[] args) { ArrayList newArgs = new ArrayList<>(); for (int i = 0; i < args.length - 1; i++) { @@ -88,6 +214,14 @@ public abstract class DisguiseBaseCommand implements CommandExecutor { return newArgs.toArray(new String[0]); } + protected String getCurrentArg(String[] args) { + if (args.length == 0) { + return ""; + } + + return args[args.length - 1].trim(); + } + protected static final Map, String> getCommandNames() { return disguiseCommands; } diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java index 50501a94..f1a50705 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java @@ -70,7 +70,7 @@ public class DisguiseCloneCommand extends DisguiseBaseCommand implements TabComp public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { ArrayList tabs = new ArrayList<>(); - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); if (args.length == 0) { for (Player player : Bukkit.getOnlinePlayers()) { diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java index 1e52f782..68ecaa9a 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java @@ -3,14 +3,13 @@ package me.libraryaddict.disguise.commands; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.parser.*; -import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; +import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; +import me.libraryaddict.disguise.utilities.parser.DisguiseParser; +import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -18,7 +17,6 @@ import org.bukkit.command.TabCompleter; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -98,82 +96,11 @@ public class DisguiseCommand extends DisguiseBaseCommand implements TabCompleter @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { ArrayList tabs = new ArrayList<>(); - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); DisguisePermissions perms = getPermissions(sender); - if (args.length == 0) { - tabs.addAll(getAllowedDisguises(perms)); - } else { - DisguisePerm disguiseType = DisguiseParser.getDisguisePerm(args[0]); - - if (disguiseType == null) - return filterTabs(tabs, origArgs); - // No disguisetype specificied, cannot help. - - if (args.length == 1 && disguiseType.getType() == DisguiseType.PLAYER) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } else { - ArrayList usedOptions = new ArrayList<>(); - - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - for (int i = disguiseType.getType() == DisguiseType.PLAYER ? 2 : 1; i < args.length; i++) { - String arg = args[i]; - - if (!method.getName().equalsIgnoreCase(arg)) - continue; - - usedOptions.add(arg); - } - } - - if (perms.isAllowedDisguise(disguiseType, usedOptions)) { - boolean addMethods = true; - - if (args.length > 1) { - String prevArg = args[args.length - 1]; - - ParamInfo info = ParamInfoManager.getParamInfo(disguiseType, prevArg); - - if (info != null) { - if (!info.isParam(boolean.class)) { - addMethods = false; - } - - if (info.hasValues()) { - tabs.addAll(info.getEnums(origArgs[origArgs.length - 1])); - } else if (info.isParam(String.class)) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } - } - } - - if (addMethods) { - // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager - .getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - tabs.add(method.getName()); - } - } - } - } - } - - return filterTabs(tabs, origArgs); + return filterTabs(getTabDisguiseTypes(sender, perms, args, 0, getCurrentArg(origArgs)), origArgs); } /** diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseEntityCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseEntityCommand.java index 3b3618d2..ffd4c64c 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseEntityCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseEntityCommand.java @@ -3,13 +3,12 @@ package me.libraryaddict.disguise.commands; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.parser.*; -import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; +import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; +import me.libraryaddict.disguise.utilities.parser.DisguiseParser; +import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -17,7 +16,6 @@ import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -73,83 +71,11 @@ public class DisguiseEntityCommand extends DisguiseBaseCommand implements TabCom return tabs; } - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); DisguisePermissions perms = getPermissions(sender); - if (args.length == 0) { - for (String type : getAllowedDisguises(perms)) { - tabs.add(type); - } - } else { - DisguisePerm disguiseType = DisguiseParser.getDisguisePerm(args[0]); - - if (disguiseType == null) - return filterTabs(tabs, origArgs); - - if (args.length == 1 && disguiseType.getType() == DisguiseType.PLAYER) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } else { - ArrayList usedOptions = new ArrayList<>(); - - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - for (int i = disguiseType.getType() == DisguiseType.PLAYER ? 2 : 1; i < args.length; i++) { - String arg = args[i]; - - if (!method.getName().equalsIgnoreCase(arg)) - continue; - - usedOptions.add(arg); - } - } - - if (perms.isAllowedDisguise(disguiseType, usedOptions)) { - boolean addMethods = true; - - if (args.length > 1) { - String prevArg = args[args.length - 1]; - - ParamInfo info = ParamInfoManager.getParamInfo(disguiseType, prevArg); - - if (info != null) { - if (!info.isParam(boolean.class)) { - addMethods = false; - } - - if (info.hasValues()) { - tabs.addAll(info.getEnums(origArgs[origArgs.length - 1])); - } else if (info.isParam(String.class)) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } - } - } - - if (addMethods) { - // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager - .getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - tabs.add(method.getName()); - } - } - } - } - } - - return filterTabs(tabs, origArgs); + return filterTabs(getTabDisguiseTypes(sender, perms, args, 0, getCurrentArg(origArgs)), origArgs); } /** diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseHelpCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseHelpCommand.java index 97710a9e..e4888a0c 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseHelpCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseHelpCommand.java @@ -129,7 +129,7 @@ public class DisguiseHelpCommand extends DisguiseBaseCommand implements TabCompl @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { ArrayList tabs = new ArrayList<>(); - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); for (String node : getCommandNames().values()) { DisguisePermissions perms = DisguiseParser.getPermissions(sender, node); diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyCommand.java index 32b45adb..02bc8f9d 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyCommand.java @@ -2,13 +2,13 @@ package me.libraryaddict.disguise.commands; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.parser.*; -import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; +import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; +import me.libraryaddict.disguise.utilities.parser.DisguiseParser; +import me.libraryaddict.disguise.utilities.parser.DisguisePerm; +import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -16,7 +16,6 @@ import org.bukkit.command.TabCompleter; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -77,70 +76,21 @@ public class DisguiseModifyCommand extends DisguiseBaseCommand implements TabCom @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { - ArrayList tabs = new ArrayList<>(); - if (!(sender instanceof Player)) - return tabs; + return new ArrayList<>(); Disguise disguise = DisguiseAPI.getDisguise((Player) sender, (Entity) sender); if (disguise == null) - return tabs; + return new ArrayList<>(); - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); DisguisePermissions perms = getPermissions(sender); DisguisePerm disguiseType = new DisguisePerm(disguise.getType()); - ArrayList usedOptions = new ArrayList<>(); - - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - for (int i = disguiseType.getType() == DisguiseType.PLAYER ? 2 : 1; i < args.length; i++) { - String arg = args[i]; - - if (!method.getName().equalsIgnoreCase(arg)) - continue; - - usedOptions.add(arg); - } - } - - if (perms.isAllowedDisguise(disguiseType, usedOptions)) { - boolean addMethods = true; - - if (args.length > 0) { - String prevArg = args[args.length - 1]; - - ParamInfo info = ParamInfoManager.getParamInfo(disguiseType, prevArg); - - if (info != null) { - if (!info.isParam(boolean.class)) { - addMethods = false; - } - - if (info.hasValues()) { - tabs.addAll(info.getEnums(origArgs[origArgs.length - 1])); - } else if (info.isParam(String.class)) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } - } - } - - if (addMethods) { - // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - tabs.add(method.getName()); - } - } - } + List tabs = getTabDisguiseOptions(sender, perms, disguiseType, args, 0, getCurrentArg(origArgs)); return filterTabs(tabs, origArgs); } diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyEntityCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyEntityCommand.java index 6516e356..c5a267ed 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyEntityCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyEntityCommand.java @@ -5,18 +5,14 @@ import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.parser.DisguisePerm; import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; -import me.libraryaddict.disguise.utilities.parser.ParamInfoManager; -import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -51,54 +47,22 @@ public class DisguiseModifyEntityCommand extends DisguiseBaseCommand implements @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { - ArrayList tabs = new ArrayList<>(); - if (!(sender instanceof Player)) { - return tabs; + return new ArrayList<>(); } - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); DisguisePermissions perms = getPermissions(sender); if (!perms.hasPermissions()) { - return tabs; + return new ArrayList<>(); } + List tabs = new ArrayList<>(); + for (DisguisePerm perm : perms.getAllowed()) { - boolean addMethods = true; - - if (args.length > 0) { - String prevArg = args[args.length - 1]; - - ParamInfo info = ParamInfoManager.getParamInfo(perm.getType(), prevArg); - - if (info != null) { - if (!info.isParam(boolean.class)) { - addMethods = false; - } - - if (info.hasValues()) { - tabs.addAll(info.getEnums(origArgs[origArgs.length - 1])); - } else if (info.isParam(String.class)) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } - } - } - - if (addMethods) { - // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(perm.getType().getWatcherClass())) { - tabs.add(method.getName()); - } - } + tabs.addAll(getTabDisguiseSubOptions(sender, perms, perm, args, 0, getCurrentArg(args))); } return filterTabs(tabs, origArgs); diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyPlayerCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyPlayerCommand.java index 54e310b4..7c6d1902 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyPlayerCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyPlayerCommand.java @@ -3,9 +3,11 @@ package me.libraryaddict.disguise.commands; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; +import me.libraryaddict.disguise.utilities.parser.DisguiseParser; +import me.libraryaddict.disguise.utilities.parser.DisguisePerm; +import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; import me.libraryaddict.disguise.utilities.translations.LibsMsg; -import me.libraryaddict.disguise.utilities.parser.*; -import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -14,7 +16,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -93,7 +94,7 @@ public class DisguiseModifyPlayerCommand extends DisguiseBaseCommand implements @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { ArrayList tabs = new ArrayList<>(); - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); DisguisePermissions perms = getPermissions(sender); @@ -114,7 +115,6 @@ public class DisguiseModifyPlayerCommand extends DisguiseBaseCommand implements Player player = Bukkit.getPlayer(args[0]); if (player == null) { - sender.sendMessage(LibsMsg.CANNOT_FIND_PLAYER.get(args[0])); return tabs; } @@ -127,60 +127,12 @@ public class DisguiseModifyPlayerCommand extends DisguiseBaseCommand implements disguise = DisguiseAPI.getDisguise(player); if (disguise == null) { - sender.sendMessage(LibsMsg.DMODPLAYER_NODISGUISE.get(player.getName())); return tabs; } DisguisePerm disguiseType = new DisguisePerm(disguise.getType()); - ArrayList usedOptions = new ArrayList<>(); - - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - for (int i = 1; i < args.length; i++) { - String arg = args[i]; - - if (!method.getName().equalsIgnoreCase(arg)) - continue; - - usedOptions.add(arg); - } - } - - if (perms.isAllowedDisguise(disguiseType, usedOptions)) { - boolean addMethods = true; - - if (args.length > 1) { - String prevArg = args[args.length - 1]; - - ParamInfo info = ParamInfoManager.getParamInfo(disguiseType, prevArg); - - if (info != null) { - if (!info.isParam(boolean.class)) { - addMethods = false; - } - - if (info.hasValues()) { - tabs.addAll(info.getEnums(origArgs[origArgs.length - 1])); - } else if (info.isParam(String.class)) { - for (Player p : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(p)) { - continue; - } - - tabs.add(p.getName()); - } - } - } - } - - if (addMethods) { - // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - tabs.add(method.getName()); - } - } - } + tabs.addAll(getTabDisguiseOptions(sender, perms, disguiseType, args, 1, getCurrentArg(args))); } return filterTabs(tabs, origArgs); diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyRadiusCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyRadiusCommand.java index 6c65b552..6b9f302d 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyRadiusCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseModifyRadiusCommand.java @@ -5,11 +5,9 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.parser.*; -import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.translations.TranslateType; import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.command.BlockCommandSender; @@ -186,7 +184,7 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { ArrayList tabs = new ArrayList<>(); - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); DisguisePermissions perms = getPermissions(sender); @@ -201,7 +199,6 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements int starting = 0; if (!isInteger(args[0])) { - for (DisguiseType t : DisguiseType.values()) { if (t.toReadable().replaceAll(" ", "").equalsIgnoreCase(args[0].replaceAll("_", ""))) { starting = 2; @@ -214,7 +211,7 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements return filterTabs(tabs, origArgs); } - if (!isInteger(args[starting])) { + if (args.length <= starting || !isInteger(args[starting])) { return filterTabs(tabs, origArgs); } @@ -225,6 +222,8 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements radius = maxRadius; } + starting++; + ArrayList usedOptions = new ArrayList<>(); for (Entity entity : getNearbyEntities(sender, radius)) { @@ -244,40 +243,10 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements } } - if (perms.isAllowedDisguise(new DisguisePerm(disguiseType), usedOptions)) { - boolean addMethods = true; + DisguisePerm perm = new DisguisePerm(disguiseType); - if (args.length > 1 + starting) { - String prevArg = args[args.length - 1]; - - ParamInfo info = ParamInfoManager.getParamInfo(disguiseType, prevArg); - - if (info != null) { - if (!info.isParam(boolean.class)) { - addMethods = false; - } - - if (info.hasValues()) { - tabs.addAll(info.getEnums(origArgs[origArgs.length - 1])); - } else if (info.isParam(String.class)) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } - } - } - - if (addMethods) { - // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - tabs.add(method.getName()); - } - } + if (perms.isAllowedDisguise(perm, usedOptions)) { + tabs.addAll(getTabDisguiseSubOptions(sender, perms, perm, args, starting, getCurrentArg(args))); } } diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java index a7e3f8d0..942d03cd 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java @@ -6,8 +6,9 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.parser.*; -import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; +import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; +import me.libraryaddict.disguise.utilities.parser.DisguiseParser; +import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; @@ -18,7 +19,6 @@ import org.bukkit.command.TabCompleter; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -140,7 +140,7 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { ArrayList tabs = new ArrayList<>(); - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); DisguisePermissions perms = getPermissions(sender); @@ -153,74 +153,8 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom tabs.add(player.getName()); } - } else if (args.length == 1) { - tabs.addAll(getAllowedDisguises(perms)); } else { - DisguisePerm disguiseType = DisguiseParser.getDisguisePerm(args[1]); - - if (disguiseType == null) - return filterTabs(tabs, origArgs); - - if (args.length == 2 && disguiseType.getType() == DisguiseType.PLAYER) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } else { - ArrayList usedOptions = new ArrayList<>(); - - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - for (int i = disguiseType.getType() == DisguiseType.PLAYER ? 3 : 2; i < args.length; i++) { - String arg = args[i]; - - if (!method.getName().equalsIgnoreCase(arg)) - continue; - - usedOptions.add(arg); - } - } - - if (perms.isAllowedDisguise(disguiseType, usedOptions)) { - boolean addMethods = true; - - if (args.length > 2) { - String prevArg = args[args.length - 1]; - - ParamInfo info = ParamInfoManager.getParamInfo(disguiseType, prevArg); - - if (info != null) { - if (!info.isParam(boolean.class)) { - addMethods = false; - } - - if (info.hasValues()) { - tabs.addAll(info.getEnums(origArgs[origArgs.length - 1])); - } else if (info.isParam(String.class)) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } - } - } - - if (addMethods) { - // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager - .getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - tabs.add(method.getName()); - } - } - } - } + tabs.addAll(getTabDisguiseTypes(sender, perms, args, 1, getCurrentArg(origArgs))); } return filterTabs(tabs, origArgs); diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java index 95705c09..d8ff3d83 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java @@ -3,16 +3,15 @@ package me.libraryaddict.disguise.commands; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.parser.*; -import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; +import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; +import me.libraryaddict.disguise.utilities.parser.DisguiseParser; +import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; import me.libraryaddict.disguise.utilities.reflection.ClassGetter; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.translations.TranslateType; import org.apache.commons.lang.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.command.BlockCommandSender; @@ -24,7 +23,6 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -230,7 +228,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { ArrayList tabs = new ArrayList<>(); - String[] args = getArgs(origArgs); + String[] args = getPreviousArgs(origArgs); DisguisePermissions perms = getPermissions(sender); @@ -258,77 +256,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom return filterTabs(tabs, origArgs); } - if (args.length == starting) { - tabs.addAll(getAllowedDisguises(perms)); - } else { - - DisguisePerm disguiseType = DisguiseParser.getDisguisePerm(args[starting]); - - if (disguiseType == null) - return filterTabs(tabs, origArgs); - - if (args.length == 1 + starting && disguiseType.getType() == DisguiseType.PLAYER) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } else { - ArrayList usedOptions = new ArrayList<>(); - - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - for (int i = disguiseType.getType() == DisguiseType.PLAYER ? starting + 2 : starting + 1; - i < args.length; i++) { - String arg = args[i]; - - if (!method.getName().equalsIgnoreCase(arg)) - continue; - - usedOptions.add(arg); - } - } - - if (perms.isAllowedDisguise(disguiseType, usedOptions)) { - boolean addMethods = true; - - if (args.length > 1 + starting) { - String prevArg = args[args.length - 1]; - - ParamInfo info = ParamInfoManager.getParamInfo(disguiseType, prevArg); - - if (info != null) { - if (!info.isParam(boolean.class)) { - addMethods = false; - } - - if (info.hasValues()) { - tabs.addAll(info.getEnums(origArgs[origArgs.length - 1])); - } else if (info.isParam(String.class)) { - for (Player player : Bukkit.getOnlinePlayers()) { - // If command user cannot see player online, don't tab-complete name - if (sender instanceof Player && !((Player) sender).canSee(player)) { - continue; - } - - tabs.add(player.getName()); - } - } - } - } - - if (addMethods) { - // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager - .getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { - tabs.add(method.getName()); - } - } - } - } - } + tabs.addAll(getTabDisguiseTypes(sender, perms, args, starting, getCurrentArg(origArgs))); return filterTabs(tabs, origArgs); } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePerm.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePerm.java index 4d4bb560..3a34387e 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePerm.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePerm.java @@ -12,6 +12,7 @@ import java.util.Objects; public class DisguisePerm { private DisguiseType disguiseType; private String permName; + private boolean customDisguise; public DisguisePerm(DisguiseType disguiseType) { this.disguiseType = disguiseType; @@ -20,6 +21,11 @@ public class DisguisePerm { public DisguisePerm(DisguiseType disguiseType, String disguisePerm) { this.disguiseType = disguiseType; permName = disguisePerm; + customDisguise = true; + } + + public boolean isCustomDisguise() { + return customDisguise; } public Class getEntityClass() {