Search in sources :

Example 1 with FlagCommand

use of com.denizenscript.denizencore.scripts.commands.core.FlagCommand in project Denizen-For-Bukkit by DenizenScript.

the class ExCommandHandler method onTabComplete.

@Override
public List<String> onTabComplete(CommandSender sender, Command cmd, String cmdName, String[] rawArgs) {
    if ((!cmdName.equalsIgnoreCase("ex") && !cmdName.equalsIgnoreCase("exs")) || !sender.hasPermission("denizen.ex")) {
        return null;
    }
    String entry = String.join(" ", rawArgs);
    if (entry.length() > 3 && entry.startsWith("-q ")) {
        entry = entry.substring("-q ".length());
    }
    String[] args = ArgumentHelper.buildArgs(entry);
    boolean isNewArg = rawArgs.length == 0 || rawArgs[rawArgs.length - 1].isEmpty();
    boolean isCommandArg = args.length == 0 || (args.length == 1 && !isNewArg) || args[args.length - (isNewArg ? 1 : 2)].equals("-");
    if (isCommandArg) {
        if (isNewArg || args.length == 0) {
            return new ArrayList<>(DenizenCore.commandRegistry.instances.keySet());
        }
        ArrayList<String> output = new ArrayList<>();
        String startOfName = CoreUtilities.toLowerCase(args[args.length - 1]);
        for (String command : DenizenCore.commandRegistry.instances.keySet()) {
            if (command.startsWith(startOfName)) {
                output.add(command);
            }
        }
        return output;
    }
    if (!isNewArg) {
        String lastArg = rawArgs[rawArgs.length - 1];
        int argStart = 0;
        for (int i = 0; i < lastArg.length(); i++) {
            if (lastArg.charAt(i) == '"' || lastArg.charAt(i) == '\'') {
                char quote = lastArg.charAt(i++);
                while (i < lastArg.length() && lastArg.charAt(i) != quote) {
                    i++;
                }
            } else if (lastArg.charAt(i) == ' ') {
                argStart = i + 1;
            }
        }
        String arg = lastArg.substring(argStart);
        if (CoreUtilities.contains(arg, '<')) {
            int tagBits = 0;
            int relevantTagStart = -1;
            for (int i = arg.length() - 1; i >= 0; i--) {
                if (arg.charAt(i) == '>') {
                    tagBits++;
                } else if (arg.charAt(i) == '<') {
                    if (tagBits == 0) {
                        relevantTagStart = i + 1;
                        break;
                    }
                    tagBits--;
                }
            }
            if (relevantTagStart != -1) {
                String fullTag = CoreUtilities.toLowerCase(arg.substring(relevantTagStart));
                int components = 0;
                int subTags = 0;
                int squareBrackets = 0;
                int lastDot = 0;
                int bracketStart = -1;
                Collection<Class<? extends ObjectTag>> typesApplicable = null;
                for (int i = 0; i < fullTag.length(); i++) {
                    char c = fullTag.charAt(i);
                    if (c == '<') {
                        subTags++;
                    } else if (c == '>') {
                        subTags--;
                    } else if (c == '[' && subTags == 0) {
                        squareBrackets++;
                        bracketStart = i;
                    } else if (c == ']' && subTags == 0) {
                        squareBrackets--;
                    } else if (c == '.' && subTags == 0 && squareBrackets == 0) {
                        Class<? extends ObjectTag> type = null;
                        String part = fullTag.substring(lastDot, bracketStart == -1 ? i : bracketStart);
                        if (components == 0) {
                            TagManager.TagBaseData baseType = TagManager.baseTags.get(part);
                            if (baseType != null) {
                                type = baseType.returnType;
                            }
                        } else if (typesApplicable != null) {
                            for (Class<? extends ObjectTag> possibleType : typesApplicable) {
                                ObjectFetcher.ObjectType<? extends ObjectTag> typeData = ObjectFetcher.objectsByClass.get(possibleType);
                                if (typeData != null && typeData.tagProcessor != null) {
                                    ObjectTagProcessor.TagData data = typeData.tagProcessor.registeredObjectTags.get(part);
                                    if (data != null && data.returnType != null) {
                                        type = data.returnType;
                                        break;
                                    }
                                }
                            }
                        }
                        if (type != null) {
                            typesApplicable = ObjectFetcher.getAllApplicableSubTypesFor(type);
                        } else {
                            typesApplicable = ObjectFetcher.objectsByClass.keySet();
                        }
                        components++;
                        lastDot = i + 1;
                        bracketStart = -1;
                    }
                }
                String beforeDot = arg.substring(0, relevantTagStart) + fullTag.substring(0, lastDot);
                if (components == 0 && !CoreUtilities.contains(fullTag, '[')) {
                    ArrayList<String> output = new ArrayList<>();
                    for (String tagBase : TagManager.baseTags.keySet()) {
                        if (tagBase.startsWith(fullTag)) {
                            output.add(beforeDot + tagBase);
                        }
                    }
                    return output;
                }
                String subComponent = fullTag.substring(lastDot);
                if (lastDot > 0 && !CoreUtilities.contains(subComponent, '[')) {
                    ArrayList<String> output = new ArrayList<>();
                    for (Class<? extends ObjectTag> possibleType : typesApplicable) {
                        ObjectFetcher.ObjectType<? extends ObjectTag> typeData = ObjectFetcher.objectsByClass.get(possibleType);
                        if (typeData != null && typeData.tagProcessor != null) {
                            for (String tag : typeData.tagProcessor.registeredObjectTags.keySet()) {
                                if (tag.startsWith(subComponent)) {
                                    output.add(beforeDot + tag);
                                }
                            }
                        }
                    }
                    return output;
                }
            }
        }
    }
    AbstractCommand dcmd = DenizenCore.commandRegistry.get(args[0]);
    for (int i = args.length - 2; i >= 0; i--) {
        if (args[i].equals("-")) {
            dcmd = DenizenCore.commandRegistry.get(args[i + 1]);
        }
    }
    if (dcmd == null) {
        return null;
    }
    String lowArg = CoreUtilities.toLowerCase(rawArgs[rawArgs.length - 1]);
    AbstractCommand.TabCompletionsBuilder completionsBuilder = new AbstractCommand.TabCompletionsBuilder();
    completionsBuilder.arg = lowArg;
    for (String flat : dcmd.docFlagArgs) {
        completionsBuilder.add(flat);
    }
    for (String prefix : dcmd.docPrefixes) {
        completionsBuilder.add(prefix + ":");
    }
    dcmd.addCustomTabCompletions(completionsBuilder);
    if (dcmd instanceof FlagCommand) {
        if (sender instanceof Player) {
            for (String flagName : new PlayerTag((Player) sender).getFlagTracker().listAllFlags()) {
                if (!flagName.startsWith("__")) {
                    completionsBuilder.add(flagName);
                }
            }
        }
        if (Depends.citizens != null && Depends.citizens.getNPCSelector().getSelected(sender) != null) {
            for (String flagName : new NPCTag(Depends.citizens.getNPCSelector().getSelected(sender)).getFlagTracker().listAllFlags()) {
                if (!flagName.startsWith("__")) {
                    completionsBuilder.add(flagName);
                }
            }
        }
    }
    return completionsBuilder.completions;
}
Also used : Player(org.bukkit.entity.Player) PlayerTag(com.denizenscript.denizen.objects.PlayerTag) ArrayList(java.util.ArrayList) AbstractCommand(com.denizenscript.denizencore.scripts.commands.AbstractCommand) TagManager(com.denizenscript.denizencore.tags.TagManager) ObjectFetcher(com.denizenscript.denizencore.objects.ObjectFetcher) ObjectTag(com.denizenscript.denizencore.objects.ObjectTag) FlagCommand(com.denizenscript.denizencore.scripts.commands.core.FlagCommand) NPCTag(com.denizenscript.denizen.objects.NPCTag)

Aggregations

NPCTag (com.denizenscript.denizen.objects.NPCTag)1 PlayerTag (com.denizenscript.denizen.objects.PlayerTag)1 ObjectFetcher (com.denizenscript.denizencore.objects.ObjectFetcher)1 ObjectTag (com.denizenscript.denizencore.objects.ObjectTag)1 AbstractCommand (com.denizenscript.denizencore.scripts.commands.AbstractCommand)1 FlagCommand (com.denizenscript.denizencore.scripts.commands.core.FlagCommand)1 TagManager (com.denizenscript.denizencore.tags.TagManager)1 ArrayList (java.util.ArrayList)1 Player (org.bukkit.entity.Player)1