diff --git a/core/src/main/java/co/aikar/commands/BaseCommand.java b/core/src/main/java/co/aikar/commands/BaseCommand.java index 25380d0a..997c4cc7 100644 --- a/core/src/main/java/co/aikar/commands/BaseCommand.java +++ b/core/src/main/java/co/aikar/commands/BaseCommand.java @@ -685,7 +685,11 @@ public abstract class BaseCommand { * @return All results to complete the command. */ private List completeCommand(CommandIssuer issuer, RegisteredCommand cmd, String[] args, String commandLabel, boolean isAsync) { - if (!cmd.hasPermission(issuer) || args.length > cmd.consumeInputResolvers || args.length == 0) { + if (!cmd.hasPermission(issuer) || args.length == 0) { + return Collections.emptyList(); + } + + if (!cmd.parameters[cmd.parameters.length - 1].consumesRest && args.length > cmd.consumeInputResolvers) { return Collections.emptyList(); } diff --git a/core/src/main/java/co/aikar/commands/CommandCompletions.java b/core/src/main/java/co/aikar/commands/CommandCompletions.java index 1ca0ff5e..0302768f 100644 --- a/core/src/main/java/co/aikar/commands/CommandCompletions.java +++ b/core/src/main/java/co/aikar/commands/CommandCompletions.java @@ -23,6 +23,7 @@ package co.aikar.commands; +import co.aikar.commands.apachecommonslang.ApacheCommonsLangUtil; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -191,6 +192,8 @@ public class CommandCompletions { String last = completions[completions.length - 1]; if (last.startsWith("repeat@")) { completion = last; + } else if (argIndex >= completions.length && cmd.parameters[cmd.parameters.length - 1].consumesRest) { + completion = last; } } @@ -230,7 +233,8 @@ public class CommandCompletions { CommandOperationContext ctx = CommandManager.getCurrentCommandOperationContext(); return ctx.enumCompletionValues; } - if (completion.startsWith("repeat@")) { + boolean repeat = completion.startsWith("repeat@"); + if (repeat) { completion = completion.substring(6); } completion = manager.getCommandReplacements().replace(completion); @@ -252,6 +256,22 @@ public class CommandCompletions { try { //noinspection unchecked Collection completions = handler.getCompletions(context); + + //Handle completions with more than one word: + if (!repeat && + command.parameters[command.parameters.length - 1].consumesRest + && args.length > ACFPatterns.SPACE.split(command.complete).length) { + String start = String.join(" ", args); + completions = completions.stream() + .filter(s -> s.split(" ").length >= args.length) + .filter(s -> ApacheCommonsLangUtil.startsWithIgnoreCase(s, start)) + .map(s -> { + String[] completionArgs = s.split(" "); + return String.join(" ", + Arrays.copyOfRange(completionArgs, args.length - 1, completionArgs.length)); + }).collect(Collectors.toList()); + } + if (completions != null) { allCompletions.addAll(completions); continue;