From 06e1719230949423936c9a395802628a77f09a76 Mon Sep 17 00:00:00 2001 From: Minecrell Date: Tue, 26 Sep 2017 18:59:37 +0200 Subject: [PATCH] Add console command completion Register command completer for JLine to complete command names and command arguments (if supported). diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java b/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java index a8b21559..c11ce8d3 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java @@ -221,6 +221,41 @@ public final class PluginManager return true; } + // Waterfall start - Add method to tab-complete command names + /** + * Searches for tab-complete suggestions for the given command line. + * + *

This is similar to {@link #dispatchCommand(CommandSender, String, List)} + * called with a list, but it also handles completing the command names itself + * instead of just the arguments.

+ * + * @param sender The command sender + * @param commandLine The current command line + * @return The tab-complete suggestions + */ + public List tabCompleteCommand(CommandSender sender, String commandLine) { + List suggestions = new java.util.ArrayList<>(); + + if (commandLine.indexOf(' ') == -1) { + // Complete command name + for (Command command : this.commandMap.values()) { + if (command.getName().startsWith(commandLine)) { + // Check command permissions before adding it to the suggestions + String permission = command.getPermission(); + if (permission == null || permission.isEmpty() || sender.hasPermission(permission)) { + suggestions.add(command.getName()); + } + } + } + } else { + // Complete command arguments + dispatchCommand(sender, commandLine, suggestions); + } + + return suggestions; + } + // Waterfall end + /** * Returns the {@link Plugin} objects corresponding to all loaded plugins. * diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/console/ConsoleCommandCompleter.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/console/ConsoleCommandCompleter.java new file mode 100644 index 00000000..bfcb6e9f --- /dev/null +++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/console/ConsoleCommandCompleter.java @@ -0,0 +1,31 @@ +package io.github.waterfallmc.waterfall.console; + +import net.md_5.bungee.api.ProxyServer; +import org.jline.reader.Candidate; +import org.jline.reader.Completer; +import org.jline.reader.LineReader; +import org.jline.reader.ParsedLine; + +import java.util.List; + +final class ConsoleCommandCompleter implements Completer { + + private final ProxyServer proxy; + + ConsoleCommandCompleter(ProxyServer proxy) { + this.proxy = proxy; + } + + @Override + public void complete(LineReader reader, ParsedLine line, List candidates) { + List suggestions = this.proxy.getPluginManager().tabCompleteCommand(this.proxy.getConsole(), line.line()); + if (suggestions.isEmpty()) { + return; + } + + for (String suggestion : suggestions) { + candidates.add(new Candidate(suggestion)); + } + } + +} diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java index 765d24bc..6cec0b5a 100644 --- a/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java +++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/console/WaterfallConsole.java @@ -15,6 +15,7 @@ public final class WaterfallConsole extends SimpleTerminalConsole { ProxyServer proxy = ProxyServer.getInstance(); return super.buildReader(builder .appName(proxy.getName()) + .completer(new ConsoleCommandCompleter(proxy)) ); } -- 2.42.0