From 52c56af02c51962b0bb659ac8cbbbec49c3e81c1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 8 Mar 2021 03:17:22 -0700 Subject: [PATCH] tab completion --- .../api/command/TerraCommandManager.java | 26 +++++++++++++------ .../commands/structure/RotationCompleter.java | 14 ++++++++++ .../structure/StructureLoadCommand.java | 3 ++- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 2 ++ 4 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/commands/structure/RotationCompleter.java diff --git a/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java b/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java index efa4fb575..82f7784ec 100644 --- a/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java +++ b/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class TerraCommandManager implements CommandManager { private final Map commands = new HashMap<>(); @@ -78,7 +79,7 @@ public class TerraCommandManager implements CommandManager { } else throw new InvalidArgumentsException("Expected 0 arguments, found " + args.size()); } - if(commandHolder.subcommands.containsKey(args.get(0))) { + if(!args.isEmpty() && commandHolder.subcommands.containsKey(args.get(0))) { String c = args.get(0); args.remove(0); execute(commandHolder.subcommands.get(c), sender, args); @@ -141,20 +142,29 @@ public class TerraCommandManager implements CommandManager { @Override public List tabComplete(String command, CommandSender sender, List args) throws CommandException { - if(args.isEmpty()) return new ArrayList<>(commands.keySet()); + if(args.isEmpty()) return new ArrayList<>(commands.keySet()).stream().sorted(String::compareTo).collect(Collectors.toList()); + return tabComplete(commands.get(command), sender, new ArrayList<>(args)).stream().filter(s -> s.toLowerCase().startsWith(args.get(args.size() - 1).toLowerCase())).sorted(String::compareTo).collect(Collectors.toList()); + } + private List tabComplete(CommandHolder holder, CommandSender sender, List args) throws CommandException { + if(args.isEmpty()) return Collections.emptyList(); List completions = new ArrayList<>(); if(args.size() == 1) { - completions.addAll(commands.get(command).subcommands.keySet()); + completions.addAll(holder.subcommands.keySet()); } - if(args.size() <= commands.get(command).arguments.size()) { - try { - completions.addAll(commands.get(command).arguments.get(args.size()).tabCompleter().getConstructor().newInstance().complete(sender)); - } catch(InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - throw new MalformedCommandException("Unable to reflectively instantiate tab-completer: ", e); + if(holder.subcommands.containsKey(args.get(0))) { + List newArgs = new ArrayList<>(args); + newArgs.remove(0); + completions.addAll(tabComplete(holder.subcommands.get(args.get(0)), sender, newArgs)); + } + try { + if(args.size() <= holder.arguments.size()) { + completions.addAll(holder.arguments.get(args.size() - 1).tabCompleter().getConstructor().newInstance().complete(sender)); } + } catch(InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new MalformedCommandException("Unable to reflectively instantiate tab-completer: ", e); } return completions; } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/RotationCompleter.java b/common/src/main/java/com/dfsek/terra/commands/structure/RotationCompleter.java new file mode 100644 index 000000000..d0f3933bb --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/commands/structure/RotationCompleter.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.commands.structure; + +import com.dfsek.terra.api.command.tab.TabCompleter; +import com.dfsek.terra.api.platform.CommandSender; + +import java.util.Arrays; +import java.util.List; + +public class RotationCompleter implements TabCompleter { + @Override + public List complete(CommandSender sender) { + return Arrays.asList("0", "90", "180", "270"); + } +} diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/StructureLoadCommand.java b/common/src/main/java/com/dfsek/terra/commands/structure/StructureLoadCommand.java index 9182b5bbe..2c9d06b67 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/StructureLoadCommand.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/StructureLoadCommand.java @@ -11,7 +11,8 @@ import com.dfsek.terra.api.command.annotation.Switch; @Argument( value = "rotation", required = false, - type = int.class + type = int.class, + tabCompleter = RotationCompleter.class ) }, switches = { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index b8c6c9e54..3d14e49fd 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -31,6 +31,7 @@ import com.dfsek.terra.bukkit.listeners.SpigotListener; import com.dfsek.terra.bukkit.listeners.TerraListener; import com.dfsek.terra.bukkit.util.PaperUtil; import com.dfsek.terra.bukkit.world.BukkitBiome; +import com.dfsek.terra.commands.StructureCommand; import com.dfsek.terra.commands.profiler.ProfileCommand; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; @@ -170,6 +171,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { CommandManager manager = new TerraCommandManager(this); manager.register("profile", ProfileCommand.class); + manager.register("structure", StructureCommand.class); BukkitCommandAdapter command = new BukkitCommandAdapter(manager);