diff --git a/bukkit/src/main/java/me/lucko/luckperms/CommandManagerBukkit.java b/bukkit/src/main/java/me/lucko/luckperms/CommandManagerBukkit.java index ebb7ccf4..5f9e2f98 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/CommandManagerBukkit.java +++ b/bukkit/src/main/java/me/lucko/luckperms/CommandManagerBukkit.java @@ -5,19 +5,32 @@ import me.lucko.luckperms.commands.Sender; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; import java.lang.ref.WeakReference; import java.util.Arrays; +import java.util.List; -class CommandManagerBukkit extends CommandManager implements CommandExecutor { +class CommandManagerBukkit extends CommandManager implements CommandExecutor, TabExecutor { CommandManagerBukkit(LuckPermsPlugin plugin) { super(plugin); } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - final WeakReference cs = new WeakReference<>(sender); - return onCommand(new Sender() { + return onCommand(makeSender(sender), Arrays.asList(args)); + } + + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + return onTabComplete(makeSender(sender), Arrays.asList(args)); + } + + private static Sender makeSender(CommandSender sender) { + return new Sender() { + final WeakReference cs = new WeakReference<>(sender); + @Override public void sendMessage(String s) { final CommandSender c = cs.get(); @@ -31,6 +44,6 @@ class CommandManagerBukkit extends CommandManager implements CommandExecutor { final CommandSender c = cs.get(); return c != null && c.hasPermission(node); } - }, Arrays.asList(args)); + }; } } diff --git a/bukkit/src/main/java/me/lucko/luckperms/LPBukkitPlugin.java b/bukkit/src/main/java/me/lucko/luckperms/LPBukkitPlugin.java index e834369d..ad0740ac 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/LPBukkitPlugin.java +++ b/bukkit/src/main/java/me/lucko/luckperms/LPBukkitPlugin.java @@ -16,12 +16,15 @@ import me.lucko.luckperms.utils.LPConfiguration; import me.lucko.luckperms.vaulthooks.VaultHook; import org.bukkit.Bukkit; import org.bukkit.command.PluginCommand; +import org.bukkit.entity.Player; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.util.Arrays; +import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; @Getter public class LPBukkitPlugin extends JavaPlugin implements LuckPermsPlugin { @@ -45,6 +48,7 @@ public class LPBukkitPlugin extends JavaPlugin implements LuckPermsPlugin { CommandManagerBukkit commandManager = new CommandManagerBukkit(this); PluginCommand main = getServer().getPluginCommand("luckperms"); main.setExecutor(commandManager); + main.setTabCompleter(commandManager); main.setAliases(Arrays.asList("perms", "lp", "permissions", "p", "perm")); final String storageMethod = configuration.getStorageMethod(); @@ -123,6 +127,11 @@ public class LPBukkitPlugin extends JavaPlugin implements LuckPermsPlugin { return getServer().getOnlinePlayers().size(); } + @Override + public List getPlayerList() { + return getServer().getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()); + } + @Override public void runUpdateTask() { getServer().getScheduler().runTaskAsynchronously(this, new UpdateTask(this)); diff --git a/bungee/src/main/java/me/lucko/luckperms/LPBungeePlugin.java b/bungee/src/main/java/me/lucko/luckperms/LPBungeePlugin.java index acf6dc8a..1a0d496e 100644 --- a/bungee/src/main/java/me/lucko/luckperms/LPBungeePlugin.java +++ b/bungee/src/main/java/me/lucko/luckperms/LPBungeePlugin.java @@ -13,10 +13,13 @@ import me.lucko.luckperms.tracks.TrackManager; import me.lucko.luckperms.users.BungeeUserManager; import me.lucko.luckperms.users.UserManager; import me.lucko.luckperms.utils.LPConfiguration; +import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; +import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Getter public class LPBungeePlugin extends Plugin implements LuckPermsPlugin { @@ -88,6 +91,11 @@ public class LPBungeePlugin extends Plugin implements LuckPermsPlugin { return getProxy().getOnlineCount(); } + @Override + public List getPlayerList() { + return getProxy().getPlayers().stream().map(ProxiedPlayer::getName).collect(Collectors.toList()); + } + @Override public void runUpdateTask() { doAsync(new UpdateTask(this)); diff --git a/bungee/src/main/java/me/lucko/luckperms/MainCommand.java b/bungee/src/main/java/me/lucko/luckperms/MainCommand.java index f27720d1..5f0ef15c 100644 --- a/bungee/src/main/java/me/lucko/luckperms/MainCommand.java +++ b/bungee/src/main/java/me/lucko/luckperms/MainCommand.java @@ -5,11 +5,12 @@ import me.lucko.luckperms.commands.Sender; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.api.plugin.TabExecutor; import java.lang.ref.WeakReference; import java.util.Arrays; -class MainCommand extends Command { +class MainCommand extends Command implements TabExecutor { private final CommandManager manager; public MainCommand(CommandManager manager) { @@ -20,8 +21,18 @@ class MainCommand extends Command { @Override public void execute(CommandSender sender, String[] args) { - final WeakReference cs = new WeakReference<>(sender); - manager.onCommand(new Sender() { + manager.onCommand(makeSender(sender), Arrays.asList(args)); + } + + @Override + public Iterable onTabComplete(CommandSender sender, String[] args) { + return manager.onTabComplete(makeSender(sender), Arrays.asList(args)); + } + + private static Sender makeSender(CommandSender sender) { + return new Sender() { + final WeakReference cs = new WeakReference<>(sender); + @Override public void sendMessage(String s) { final CommandSender c = cs.get(); @@ -35,6 +46,6 @@ class MainCommand extends Command { final CommandSender c = cs.get(); return c != null && c.hasPermission(node); } - }, Arrays.asList(args)); + }; } } diff --git a/common/src/main/java/me/lucko/luckperms/LuckPermsPlugin.java b/common/src/main/java/me/lucko/luckperms/LuckPermsPlugin.java index f6c9da64..aaf5e3ae 100644 --- a/common/src/main/java/me/lucko/luckperms/LuckPermsPlugin.java +++ b/common/src/main/java/me/lucko/luckperms/LuckPermsPlugin.java @@ -6,6 +6,7 @@ import me.lucko.luckperms.tracks.TrackManager; import me.lucko.luckperms.users.UserManager; import me.lucko.luckperms.utils.LPConfiguration; +import java.util.List; import java.util.UUID; import java.util.logging.Logger; @@ -65,6 +66,12 @@ public interface LuckPermsPlugin { */ int getPlayerCount(); + /** + * Gets the usernames of the users online on the platform + * @return a {@link List} of usernames + */ + List getPlayerList(); + /** * Runs an update task */ diff --git a/common/src/main/java/me/lucko/luckperms/commands/CommandManager.java b/common/src/main/java/me/lucko/luckperms/commands/CommandManager.java index e7726fc1..50b95447 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/CommandManager.java +++ b/common/src/main/java/me/lucko/luckperms/commands/CommandManager.java @@ -20,9 +20,11 @@ import me.lucko.luckperms.commands.user.subcommands.*; import me.lucko.luckperms.constants.Message; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.logging.Level; +import java.util.stream.Collectors; public class CommandManager { private final LuckPermsPlugin plugin; @@ -123,6 +125,31 @@ public class CommandManager { } + /** + * Generic tab complete method to be called from the command executor object of the platform + * @param sender who is tab completing + * @param args the arguments provided so far + * @return a list of suggestions + */ + public List onTabComplete(Sender sender, List args) { + final List mains = mainCommands.stream().filter(m -> m.canUse(sender)).collect(Collectors.toList()); + + if (args.size() <= 1) { + if (args.isEmpty() || args.get(0).equalsIgnoreCase("")) { + return mains.stream().map(MainCommand::getName).map(String::toLowerCase).collect(Collectors.toList()); + } + + return mains.stream().map(MainCommand::getName).map(String::toLowerCase).filter(s -> s.startsWith(args.get(0).toLowerCase())).collect(Collectors.toList()); + } + + Optional o = mains.stream().filter(m -> m.getName().equalsIgnoreCase(args.get(0))).limit(1).findAny(); + if (!o.isPresent()) { + return Collections.emptyList(); + } + + return o.get().onTabComplete(sender, args.subList(1, args.size()), plugin); + } + private void registerMainCommand(MainCommand command) { plugin.getLogger().log(Level.INFO, "[CommandManager] Registered main command '" + command.getName() + "'"); mainCommands.add(command); diff --git a/common/src/main/java/me/lucko/luckperms/commands/MainCommand.java b/common/src/main/java/me/lucko/luckperms/commands/MainCommand.java index bee4edb4..e520f586 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/MainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/MainCommand.java @@ -5,7 +5,9 @@ import lombok.Getter; import me.lucko.luckperms.LuckPermsPlugin; import me.lucko.luckperms.constants.Message; +import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @Getter @@ -17,6 +19,7 @@ public abstract class MainCommand { private final int requiredArgsLength; protected abstract void execute(LuckPermsPlugin plugin, Sender sender, List args); + protected abstract List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin); public abstract List getSubCommands(); protected void sendUsage(Sender sender) { @@ -41,4 +44,23 @@ public abstract class MainCommand { protected boolean canUse(Sender sender) { return getSubCommands().stream().filter(sc -> sc.isAuthorized(sender)).count() != 0; } + + protected List onAbstractTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + final List subs = getSubCommands().stream().filter(s -> s.isAuthorized(sender)).collect(Collectors.toList()); + if (args.size() == 2) { + if (args.get(1).equalsIgnoreCase("")) { + return subs.stream().map(SubCommand::getName).map(String::toLowerCase).collect(Collectors.toList()); + } + + return subs.stream().map(SubCommand::getName).map(String::toLowerCase) + .filter(s -> s.toLowerCase().startsWith(args.get(1).toLowerCase())).collect(Collectors.toList()); + } + + Optional o = subs.stream().filter(s -> s.getName().equalsIgnoreCase(args.get(1))).limit(1).findAny(); + if (!o.isPresent()) { + return Collections.emptyList(); + } + + return o.get().onTabComplete(sender, args.subList(2, args.size()), plugin); + } } diff --git a/common/src/main/java/me/lucko/luckperms/commands/SubCommand.java b/common/src/main/java/me/lucko/luckperms/commands/SubCommand.java index 661327b9..2fc9c250 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/SubCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/SubCommand.java @@ -2,8 +2,15 @@ package me.lucko.luckperms.commands; import lombok.AllArgsConstructor; import lombok.Getter; +import me.lucko.luckperms.LuckPermsPlugin; import me.lucko.luckperms.constants.Permission; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + @Getter @AllArgsConstructor public abstract class SubCommand { @@ -12,6 +19,34 @@ public abstract class SubCommand { private final String usage; private final Permission permission; + protected static List getGroupTabComplete(List args, LuckPermsPlugin plugin) { + return getTabComplete(new ArrayList<>(plugin.getGroupManager().getGroups().keySet()), args); + } + + protected static List getTrackTabComplete(List args, LuckPermsPlugin plugin) { + return getTabComplete(new ArrayList<>(plugin.getTrackManager().getTracks().keySet()), args); + } + + private static List getTabComplete(List options, List args) { + if (args.size() <= 1) { + if (args.isEmpty() || args.get(0).equalsIgnoreCase("")) { + return options; + } + + return options.stream().filter(s -> s.toLowerCase().startsWith(args.get(0).toLowerCase())).collect(Collectors.toList()); + } + + return Collections.emptyList(); + } + + protected static List getBoolTabComplete(List args) { + if (args.size() == 2) { + return Arrays.asList("true", "false"); + } else { + return Collections.emptyList(); + } + } + public boolean isAuthorized(Sender sender) { return permission.isAuthorized(sender); } @@ -20,5 +55,9 @@ public abstract class SubCommand { Util.sendPluginMessage(sender, "&e-> &d" + getUsage()); } + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return Collections.emptyList(); + } + public abstract boolean isArgLengthInvalid(int argLength); } diff --git a/common/src/main/java/me/lucko/luckperms/commands/Util.java b/common/src/main/java/me/lucko/luckperms/commands/Util.java index 6bf97b68..2f3e07af 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/Util.java +++ b/common/src/main/java/me/lucko/luckperms/commands/Util.java @@ -32,6 +32,10 @@ public class Util { return new String(b); } + public static boolean startsWithIgnoreCase(String s, String startsWith) { + return s.toLowerCase().startsWith(startsWith); + } + public static void sendBoolean(Sender sender, String node, boolean b) { if (b) { sender.sendMessage(Util.color("&b" + node + ": &atrue")); diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/CreateGroupCommand.java b/common/src/main/java/me/lucko/luckperms/commands/group/CreateGroupCommand.java index bc02ff4d..ffa6fe7b 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/CreateGroupCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/CreateGroupCommand.java @@ -8,7 +8,7 @@ import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; import me.lucko.luckperms.utils.Patterns; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class CreateGroupCommand extends MainCommand { @@ -51,9 +51,14 @@ public class CreateGroupCommand extends MainCommand { }); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/DeleteGroupCommand.java b/common/src/main/java/me/lucko/luckperms/commands/group/DeleteGroupCommand.java index 8fffcf86..38e2ab7e 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/DeleteGroupCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/DeleteGroupCommand.java @@ -9,7 +9,9 @@ import me.lucko.luckperms.constants.Permission; import me.lucko.luckperms.groups.Group; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class DeleteGroupCommand extends MainCommand { public DeleteGroupCommand() { @@ -52,9 +54,24 @@ public class DeleteGroupCommand extends MainCommand { }); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + final List groups = new ArrayList<>(plugin.getGroupManager().getGroups().keySet()); + + if (args.size() <= 1) { + if (args.isEmpty() || args.get(0).equalsIgnoreCase("")) { + return groups; + } + + return groups.stream().filter(s -> s.toLowerCase().startsWith(args.get(0).toLowerCase())).collect(Collectors.toList()); + } + + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/GroupMainCommand.java b/common/src/main/java/me/lucko/luckperms/commands/group/GroupMainCommand.java index 967d0c7a..83cf2ad2 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/GroupMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/GroupMainCommand.java @@ -10,6 +10,7 @@ import me.lucko.luckperms.groups.Group; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; public class GroupMainCommand extends MainCommand { @@ -66,6 +67,21 @@ public class GroupMainCommand extends MainCommand { }); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + final List groups = new ArrayList<>(plugin.getGroupManager().getGroups().keySet()); + + if (args.size() <= 1) { + if (args.isEmpty() || args.get(0).equalsIgnoreCase("")) { + return groups; + } + + return groups.stream().filter(s -> s.toLowerCase().startsWith(args.get(0).toLowerCase())).collect(Collectors.toList()); + } + + return onAbstractTabComplete(sender, args, plugin); + } + @Override public List getSubCommands() { return subCommands; diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/ListGroupsCommand.java b/common/src/main/java/me/lucko/luckperms/commands/group/ListGroupsCommand.java index 50d70fdf..3421a47b 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/ListGroupsCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/ListGroupsCommand.java @@ -9,6 +9,7 @@ import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class ListGroupsCommand extends MainCommand { @@ -27,9 +28,14 @@ public class ListGroupsCommand extends MainCommand { }); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupSetInheritCommand.java b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupSetInheritCommand.java index 5351b16c..32674973 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupSetInheritCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupSetInheritCommand.java @@ -42,6 +42,11 @@ public class GroupSetInheritCommand extends GroupSubCommand { }); } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getGroupTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 1 && argLength != 2; diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupSetPermissionCommand.java b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupSetPermissionCommand.java index fb57377f..fec369ad 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupSetPermissionCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupSetPermissionCommand.java @@ -55,6 +55,11 @@ public class GroupSetPermissionCommand extends GroupSubCommand { } } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getBoolTabComplete(args); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 2 && argLength != 3; diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupUnsetInheritCommand.java b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupUnsetInheritCommand.java index 2faac0ad..dc6845b9 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupUnsetInheritCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupUnsetInheritCommand.java @@ -36,6 +36,11 @@ public class GroupUnsetInheritCommand extends GroupSubCommand { } } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getGroupTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 1 && argLength != 2; diff --git a/common/src/main/java/me/lucko/luckperms/commands/misc/DebugCommand.java b/common/src/main/java/me/lucko/luckperms/commands/misc/DebugCommand.java index 5c8f7068..8ff344bd 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/misc/DebugCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/misc/DebugCommand.java @@ -7,7 +7,7 @@ import me.lucko.luckperms.commands.SubCommand; import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class DebugCommand extends MainCommand { @@ -22,9 +22,14 @@ public class DebugCommand extends MainCommand { ); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/misc/InfoCommand.java b/common/src/main/java/me/lucko/luckperms/commands/misc/InfoCommand.java index 67f7975e..7f5ce063 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/misc/InfoCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/misc/InfoCommand.java @@ -7,7 +7,7 @@ import me.lucko.luckperms.commands.SubCommand; import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class InfoCommand extends MainCommand { @@ -20,9 +20,14 @@ public class InfoCommand extends MainCommand { Message.INFO.send(sender, plugin.getVersion(), plugin.getDatastore().getName()); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/misc/SyncCommand.java b/common/src/main/java/me/lucko/luckperms/commands/misc/SyncCommand.java index 692025ed..27d921cd 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/misc/SyncCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/misc/SyncCommand.java @@ -7,7 +7,7 @@ import me.lucko.luckperms.commands.SubCommand; import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class SyncCommand extends MainCommand { @@ -21,9 +21,14 @@ public class SyncCommand extends MainCommand { plugin.runUpdateTask(); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/track/CreateTrackCommand.java b/common/src/main/java/me/lucko/luckperms/commands/track/CreateTrackCommand.java index e2afa6f1..82f6e25e 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/track/CreateTrackCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/track/CreateTrackCommand.java @@ -8,7 +8,7 @@ import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; import me.lucko.luckperms.utils.Patterns; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class CreateTrackCommand extends MainCommand { @@ -51,9 +51,14 @@ public class CreateTrackCommand extends MainCommand { }); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/track/DeleteTrackCommand.java b/common/src/main/java/me/lucko/luckperms/commands/track/DeleteTrackCommand.java index d81fa89a..a4b3a9ec 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/track/DeleteTrackCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/track/DeleteTrackCommand.java @@ -9,7 +9,9 @@ import me.lucko.luckperms.constants.Permission; import me.lucko.luckperms.tracks.Track; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class DeleteTrackCommand extends MainCommand { public DeleteTrackCommand() { @@ -47,9 +49,24 @@ public class DeleteTrackCommand extends MainCommand { }); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + final List tracks = new ArrayList<>(plugin.getTrackManager().getTracks().keySet()); + + if (args.size() <= 1) { + if (args.isEmpty() || args.get(0).equalsIgnoreCase("")) { + return tracks; + } + + return tracks.stream().filter(s -> s.toLowerCase().startsWith(args.get(0).toLowerCase())).collect(Collectors.toList()); + } + + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/track/ListTracksCommand.java b/common/src/main/java/me/lucko/luckperms/commands/track/ListTracksCommand.java index 689c7bcc..54d1514f 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/track/ListTracksCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/track/ListTracksCommand.java @@ -9,6 +9,7 @@ import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class ListTracksCommand extends MainCommand { @@ -27,9 +28,14 @@ public class ListTracksCommand extends MainCommand { }); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return Collections.emptyList(); + } + @Override public List getSubCommands() { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/commands/track/TrackMainCommand.java b/common/src/main/java/me/lucko/luckperms/commands/track/TrackMainCommand.java index 40ee35ed..caf548c4 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/track/TrackMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/track/TrackMainCommand.java @@ -10,6 +10,7 @@ import me.lucko.luckperms.tracks.Track; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; public class TrackMainCommand extends MainCommand { @@ -66,6 +67,21 @@ public class TrackMainCommand extends MainCommand { }); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + final List tracks = new ArrayList<>(plugin.getTrackManager().getTracks().keySet()); + + if (args.size() <= 1) { + if (args.isEmpty() || args.get(0).equalsIgnoreCase("")) { + return tracks; + } + + return tracks.stream().filter(s -> s.toLowerCase().startsWith(args.get(0).toLowerCase())).collect(Collectors.toList()); + } + + return onAbstractTabComplete(sender, args, plugin); + } + @Override public List getSubCommands() { return subCommands; diff --git a/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackAppendCommand.java b/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackAppendCommand.java index 8ae6a65f..9a83c96f 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackAppendCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackAppendCommand.java @@ -43,6 +43,11 @@ public class TrackAppendCommand extends TrackSubCommand { }); } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getGroupTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 1; diff --git a/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackInsertCommand.java b/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackInsertCommand.java index 53b78128..c95acd3c 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackInsertCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackInsertCommand.java @@ -53,6 +53,11 @@ public class TrackInsertCommand extends TrackSubCommand { }); } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getGroupTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 2; diff --git a/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackRemoveCommand.java b/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackRemoveCommand.java index d8cc07b5..234c5554 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackRemoveCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/track/subcommands/TrackRemoveCommand.java @@ -27,6 +27,11 @@ public class TrackRemoveCommand extends TrackSubCommand { } } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getGroupTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 1; diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/UserMainCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/UserMainCommand.java index df5b1a21..fc4e34f4 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/UserMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/UserMainCommand.java @@ -12,8 +12,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; -public class UserMainCommand extends MainCommand{ +public class UserMainCommand extends MainCommand { private final List subCommands = new ArrayList<>(); @@ -75,6 +76,21 @@ public class UserMainCommand extends MainCommand{ Message.USER_INVALID_ENTRY.send(sender, user); } + @Override + protected List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + final List onlinePlayers = plugin.getPlayerList(); + + if (args.size() <= 1) { + if (args.isEmpty() || args.get(0).equalsIgnoreCase("")) { + return onlinePlayers; + } + + return onlinePlayers.stream().filter(s -> s.toLowerCase().startsWith(args.get(0).toLowerCase())).collect(Collectors.toList()); + } + + return onAbstractTabComplete(sender, args, plugin); + } + private void runSub(LuckPermsPlugin plugin, Sender sender, UUID uuid, UserSubCommand command, List strippedArgs) { plugin.getDatastore().loadUser(uuid, success -> { if (!success) { diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserAddGroupCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserAddGroupCommand.java index 99e7e613..096605a2 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserAddGroupCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserAddGroupCommand.java @@ -48,6 +48,11 @@ public class UserAddGroupCommand extends UserSubCommand { }); } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getGroupTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return (argLength != 1 && argLength != 2); diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserDemoteCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserDemoteCommand.java index 5733ed57..b10280a1 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserDemoteCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserDemoteCommand.java @@ -79,6 +79,11 @@ public class UserDemoteCommand extends UserSubCommand { }); } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getTrackTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 1; diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserPromoteCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserPromoteCommand.java index 23ba46a3..e80a6345 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserPromoteCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserPromoteCommand.java @@ -79,6 +79,11 @@ public class UserPromoteCommand extends UserSubCommand { }); } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getTrackTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 1; diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserRemoveGroupCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserRemoveGroupCommand.java index 3e49f115..79c9938a 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserRemoveGroupCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserRemoveGroupCommand.java @@ -41,6 +41,11 @@ public class UserRemoveGroupCommand extends UserSubCommand { } } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getGroupTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return (argLength != 1 && argLength != 2); diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserSetPermissionCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserSetPermissionCommand.java index a85b30af..b6a40e55 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserSetPermissionCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserSetPermissionCommand.java @@ -55,6 +55,11 @@ public class UserSetPermissionCommand extends UserSubCommand { } } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getBoolTabComplete(args); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 2 && argLength != 3; diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserSetPrimaryGroupCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserSetPrimaryGroupCommand.java index c9c2ca90..b60c5c96 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserSetPrimaryGroupCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserSetPrimaryGroupCommand.java @@ -40,6 +40,11 @@ public class UserSetPrimaryGroupCommand extends UserSubCommand { saveUser(user, sender, plugin); } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getGroupTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 1; diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserShowPosCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserShowPosCommand.java index 11cdb437..0cf88fa7 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserShowPosCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserShowPosCommand.java @@ -45,6 +45,11 @@ public class UserShowPosCommand extends UserSubCommand { }); } + @Override + public List onTabComplete(Sender sender, List args, LuckPermsPlugin plugin) { + return getTrackTabComplete(args, plugin); + } + @Override public boolean isArgLengthInvalid(int argLength) { return argLength != 1; diff --git a/common/src/main/java/me/lucko/luckperms/constants/Message.java b/common/src/main/java/me/lucko/luckperms/constants/Message.java index 6a6bb52e..e0520f6e 100644 --- a/common/src/main/java/me/lucko/luckperms/constants/Message.java +++ b/common/src/main/java/me/lucko/luckperms/constants/Message.java @@ -29,7 +29,7 @@ public enum Message { USER_NOT_FOUND("&eUser could not be found.", true), USER_SAVE_SUCCESS("&7(User data was saved to the datastore)", true), USER_SAVE_ERROR("There was an error whilst saving the user.", true), - USER_ATTEMPTING_LOOKUP("&7(Attempting UUID lookup, since you specified a user)", true), + USER_ATTEMPTING_LOOKUP("&7(Attempting UUID lookup, since you specified a username)", true), GROUP_NOT_FOUND("&eGroup could not be found.", true), GROUP_SAVE_SUCCESS("&7(Group data was saved to the datastore)", true),