mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 14:21:08 +00:00
tab completion
This commit is contained in:
@@ -25,6 +25,7 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class TerraCommandManager implements CommandManager {
|
public class TerraCommandManager implements CommandManager {
|
||||||
private final Map<String, CommandHolder> commands = new HashMap<>();
|
private final Map<String, CommandHolder> commands = new HashMap<>();
|
||||||
@@ -78,7 +79,7 @@ public class TerraCommandManager implements CommandManager {
|
|||||||
} else throw new InvalidArgumentsException("Expected 0 arguments, found " + args.size());
|
} 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);
|
String c = args.get(0);
|
||||||
args.remove(0);
|
args.remove(0);
|
||||||
execute(commandHolder.subcommands.get(c), sender, args);
|
execute(commandHolder.subcommands.get(c), sender, args);
|
||||||
@@ -141,20 +142,29 @@ public class TerraCommandManager implements CommandManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> tabComplete(String command, CommandSender sender, List<String> args) throws CommandException {
|
public List<String> tabComplete(String command, CommandSender sender, List<String> 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<String> tabComplete(CommandHolder holder, CommandSender sender, List<String> args) throws CommandException {
|
||||||
|
if(args.isEmpty()) return Collections.emptyList();
|
||||||
List<String> completions = new ArrayList<>();
|
List<String> completions = new ArrayList<>();
|
||||||
|
|
||||||
if(args.size() == 1) {
|
if(args.size() == 1) {
|
||||||
completions.addAll(commands.get(command).subcommands.keySet());
|
completions.addAll(holder.subcommands.keySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(args.size() <= commands.get(command).arguments.size()) {
|
if(holder.subcommands.containsKey(args.get(0))) {
|
||||||
try {
|
List<String> newArgs = new ArrayList<>(args);
|
||||||
completions.addAll(commands.get(command).arguments.get(args.size()).tabCompleter().getConstructor().newInstance().complete(sender));
|
newArgs.remove(0);
|
||||||
} catch(InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
|
completions.addAll(tabComplete(holder.subcommands.get(args.get(0)), sender, newArgs));
|
||||||
throw new MalformedCommandException("Unable to reflectively instantiate tab-completer: ", e);
|
}
|
||||||
|
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;
|
return completions;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<String> complete(CommandSender sender) {
|
||||||
|
return Arrays.asList("0", "90", "180", "270");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,7 +11,8 @@ import com.dfsek.terra.api.command.annotation.Switch;
|
|||||||
@Argument(
|
@Argument(
|
||||||
value = "rotation",
|
value = "rotation",
|
||||||
required = false,
|
required = false,
|
||||||
type = int.class
|
type = int.class,
|
||||||
|
tabCompleter = RotationCompleter.class
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
switches = {
|
switches = {
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import com.dfsek.terra.bukkit.listeners.SpigotListener;
|
|||||||
import com.dfsek.terra.bukkit.listeners.TerraListener;
|
import com.dfsek.terra.bukkit.listeners.TerraListener;
|
||||||
import com.dfsek.terra.bukkit.util.PaperUtil;
|
import com.dfsek.terra.bukkit.util.PaperUtil;
|
||||||
import com.dfsek.terra.bukkit.world.BukkitBiome;
|
import com.dfsek.terra.bukkit.world.BukkitBiome;
|
||||||
|
import com.dfsek.terra.commands.StructureCommand;
|
||||||
import com.dfsek.terra.commands.profiler.ProfileCommand;
|
import com.dfsek.terra.commands.profiler.ProfileCommand;
|
||||||
import com.dfsek.terra.config.GenericLoaders;
|
import com.dfsek.terra.config.GenericLoaders;
|
||||||
import com.dfsek.terra.config.PluginConfig;
|
import com.dfsek.terra.config.PluginConfig;
|
||||||
@@ -170,6 +171,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin {
|
|||||||
CommandManager manager = new TerraCommandManager(this);
|
CommandManager manager = new TerraCommandManager(this);
|
||||||
|
|
||||||
manager.register("profile", ProfileCommand.class);
|
manager.register("profile", ProfileCommand.class);
|
||||||
|
manager.register("structure", StructureCommand.class);
|
||||||
|
|
||||||
BukkitCommandAdapter command = new BukkitCommandAdapter(manager);
|
BukkitCommandAdapter command = new BukkitCommandAdapter(manager);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user