use of com.denizenscript.denizencore.scripts.commands.AbstractCommand 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;
}
Aggregations