Add Support for Async Tab Completions for Paper Servers

This adds the ability for plugins to define completion handlers as async safe (not on games main thread)

When they are defined async safe, and ran on a Paper 1.12.2+ server, with a Paper ACF manager,
completions will be handled mostly async, letting you safely do heavier operations in tab completions.
This commit is contained in:
Aikar
2017-11-26 23:21:15 -05:00
parent 229192f99c
commit fbed6f2be3
31 changed files with 278 additions and 103 deletions
@@ -39,7 +39,7 @@ public class BungeeCommandCompletions extends CommandCompletions<BungeeCommandCo
public BungeeCommandCompletions(CommandManager manager) {
super(manager);
registerCompletion("chatcolors", c -> {
registerAsyncCompletion("chatcolors", c -> {
Stream<ChatColor> colors = Stream.of(ChatColor.values());
if (c.hasConfig("colorsonly")) {
colors = colors.filter(color -> color.ordinal() <= 0xF);
@@ -24,7 +24,6 @@
package co.aikar.commands;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.Objects;
@@ -30,9 +30,9 @@ import net.md_5.bungee.api.plugin.Plugin;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -29,10 +29,8 @@ import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.TabExecutor;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.List;
public class BungeeRootCommand extends Command implements RootCommand, TabExecutor {
@@ -73,6 +71,11 @@ public class BungeeRootCommand extends Command implements RootCommand, TabExecut
return subCommands;
}
@Override
public List<BaseCommand> getChildren() {
return children;
}
@Override
public void execute(CommandSender sender, String[] args) {
execute(manager.getCommandIssuer(sender), getName(), args);
@@ -80,13 +83,7 @@ public class BungeeRootCommand extends Command implements RootCommand, TabExecut
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] strings) {
return onTabComplete(manager.getCommandIssuer(commandSender), getName(), strings);
}
private List<String> onTabComplete(CommandIssuer sender, String alias, String[] args) throws IllegalArgumentException {
Set<String> completions = new HashSet<>();
this.children.forEach(child -> completions.addAll(child.tabComplete(sender, alias, args)));
return new ArrayList<>(completions);
return getTabCompletions(manager.getCommandIssuer(commandSender), getName(), strings);
}
@Override