From be1717182d5fbc1d42fb1c099ea6b3c1d5d246d1 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sun, 5 Sep 2021 01:00:50 +0200 Subject: [PATCH] Adds a helper class for tab completion, and uses a TabExecutor for the give and give public commands --- .../BooksWithoutBorders.java | 8 ++- .../command/CommandGive.java | 53 +++++++++++++- .../command/CommandGivePublic.java | 11 ++- .../command/GiveTabCompleter.java | 70 ------------------- .../utility/TabCompletionHelper.java | 54 ++++++++++++++ 5 files changed, 119 insertions(+), 77 deletions(-) delete mode 100644 src/main/java/net/knarcraft/bookswithoutborders/command/GiveTabCompleter.java create mode 100644 src/main/java/net/knarcraft/bookswithoutborders/utility/TabCompletionHelper.java diff --git a/src/main/java/net/knarcraft/bookswithoutborders/BooksWithoutBorders.java b/src/main/java/net/knarcraft/bookswithoutborders/BooksWithoutBorders.java index d89e99b..52f42e7 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/BooksWithoutBorders.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/BooksWithoutBorders.java @@ -19,7 +19,6 @@ import net.knarcraft.bookswithoutborders.command.CommandSetBookPrice; import net.knarcraft.bookswithoutborders.command.CommandSetLore; import net.knarcraft.bookswithoutborders.command.CommandSetTitle; import net.knarcraft.bookswithoutborders.command.CommandUnSign; -import net.knarcraft.bookswithoutborders.command.GiveTabCompleter; import net.knarcraft.bookswithoutborders.listener.PlayerEventListener; import net.knarcraft.bookswithoutborders.listener.SignEventListener; import net.knarcraft.bookswithoutborders.state.BookDirectory; @@ -32,6 +31,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.command.TabCompleter; +import org.bukkit.command.TabExecutor; import org.bukkit.configuration.Configuration; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemFactory; @@ -263,7 +263,10 @@ public class BooksWithoutBorders extends JavaPlugin { * Registers all commands used by this plugin */ private void registerCommands() { - registerCommand("giveBook", new CommandGive(), new GiveTabCompleter()); + TabExecutor giveTabExecutor = new CommandGive(); + registerCommand("giveBook", giveTabExecutor, giveTabExecutor); + TabExecutor givePublicTabExecutor = new CommandGivePublic(); + registerCommand("givePublicBook", givePublicTabExecutor, givePublicTabExecutor); registerCommand("decryptBook", new CommandDecrypt(), null); registerCommand("groupEncryptBook", new CommandGroupEncrypt(), null); registerCommand("deleteBook", new CommandDelete(), null); @@ -281,7 +284,6 @@ public class BooksWithoutBorders extends JavaPlugin { registerCommand("loadPublicBook", new CommandLoadPublic(), null); registerCommand("booksWithoutBorders", new CommandBooksWithoutBorders(), null); registerCommand("reload", new CommandReload(), null); - registerCommand("givePublicBook", new CommandGivePublic(), null); } /** diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGive.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGive.java index 51179f6..408a0f2 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGive.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGive.java @@ -3,16 +3,21 @@ package net.knarcraft.bookswithoutborders.command; import net.knarcraft.bookswithoutborders.BooksWithoutBorders; import net.knarcraft.bookswithoutborders.utility.FileHelper; import net.knarcraft.bookswithoutborders.utility.InputCleaningHelper; +import net.knarcraft.bookswithoutborders.utility.TabCompletionHelper; +import org.bukkit.Server; import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; +import java.util.List; + /** * Command executor for the give command */ -public class CommandGive implements CommandExecutor { +public class CommandGive implements TabExecutor { private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance(); @@ -98,4 +103,48 @@ public class CommandGive implements CommandExecutor { } } + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + return doTabCompletion(sender, args, false); + } + + /** + * Performs the actual tab completion + * @param sender

The sender of the command

+ * @param args

The arguments given

+ * @param listPublic

Whether to list public files or player files

+ * @return

A list of available choices

+ */ + protected List doTabCompletion(CommandSender sender, String[] args, boolean listPublic) { + Server server = booksWithoutBorders.getServer(); + + int argumentCount = args.length; + + if (argumentCount > 2) { + //Don't continue with autocompletion if the recipient is invalid + if (server.getPlayer(args[1]) == null) { + return new ArrayList<>(); + } + } + + if (argumentCount == 1) { + //Return list of books + return BooksWithoutBorders.getAvailableBooks(sender, listPublic); + } else if (argumentCount == 2) { + //Return online players + return null; + } else if (argumentCount == 3) { + //Number of copies + return TabCompletionHelper.getBooleansAndNumbers(1, 64); + } else if (argumentCount == 4) { + //Signed + try { + Integer.parseInt(args[2]); + return TabCompletionHelper.getBooleans(); + } catch (NumberFormatException e) { + return new ArrayList<>(); + } + } + return new ArrayList<>(); + } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGivePublic.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGivePublic.java index 50eda97..e0b28aa 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGivePublic.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGivePublic.java @@ -1,17 +1,24 @@ package net.knarcraft.bookswithoutborders.command; import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; + +import java.util.List; /** * Command executor for the give public command */ -public class CommandGivePublic extends CommandGive implements CommandExecutor { +public class CommandGivePublic extends CommandGive implements TabExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { return giveBook(sender, args, true, "public"); } + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + return doTabCompletion(sender, args, true); + } + } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/GiveTabCompleter.java b/src/main/java/net/knarcraft/bookswithoutborders/command/GiveTabCompleter.java deleted file mode 100644 index 1d23a02..0000000 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/GiveTabCompleter.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.knarcraft.bookswithoutborders.command; - -import net.knarcraft.bookswithoutborders.BooksWithoutBorders; -import org.bukkit.Server; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -/** - * Tab completer for the save command - */ -public class GiveTabCompleter implements TabCompleter { - - private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance(); - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - Server server = booksWithoutBorders.getServer(); - List playerNames = new ArrayList<>(); - for (Player player : server.getOnlinePlayers()) { - playerNames.add(player.getName()); - } - List booleans = new ArrayList<>(); - booleans.add("true"); - booleans.add("false"); - List numbers = new ArrayList<>(); - numbers.add("1"); - numbers.add("2"); - numbers.add("3"); - numbers.add("4"); - numbers.add("5"); - List boolAndNumbers = new ArrayList<>(); - boolAndNumbers.addAll(booleans); - boolAndNumbers.addAll(numbers); - - int argumentCount = args.length; - - if (argumentCount > 2) { - //Don't continue with autocompletion if the recipient is invalid - if (server.getPlayer(args[1]) == null) { - return null; - } - } - - if (argumentCount == 1) { - //Return list of books - return BooksWithoutBorders.getAvailableBooks(sender, false); - } else if (argumentCount == 2) { - //Return online players - return playerNames; - } else if (argumentCount == 3) { - //Number of copies - return boolAndNumbers; - } else if (argumentCount == 4) { - //Signed - try { - Integer.parseInt(args[2]); - return booleans; - } catch (NumberFormatException e) { - return null; - } - } - return null; - } - -} diff --git a/src/main/java/net/knarcraft/bookswithoutborders/utility/TabCompletionHelper.java b/src/main/java/net/knarcraft/bookswithoutborders/utility/TabCompletionHelper.java new file mode 100644 index 0000000..12d824f --- /dev/null +++ b/src/main/java/net/knarcraft/bookswithoutborders/utility/TabCompletionHelper.java @@ -0,0 +1,54 @@ +package net.knarcraft.bookswithoutborders.utility; + +import java.util.ArrayList; +import java.util.List; + +/** + * Helper class for getting string lists required for auto-completion + */ +public class TabCompletionHelper { + + /** + * Gets a list of booleans + * + * @return

A list of booleans

+ */ + public static List getBooleans() { + List booleans = new ArrayList<>(); + booleans.add("true"); + booleans.add("false"); + return booleans; + } + + /** + * Gets a list of numbers in increasing order + * + * @param start

The start number

+ * @param end

The end number

+ * @return

A list of numbers

+ */ + public static List getNumbers(int start, int end) { + List numbers = new ArrayList<>(); + for (int i = start; i <= end; i++) { + numbers.add(String.valueOf(i)); + } + return numbers; + } + + /** + * Gets a list of booleans and numbers + * + * @param start

The start number

+ * @param end

The end number

+ * @return

A list of booleans and numbers

+ */ + public static List getBooleansAndNumbers(int start, int end) { + List booleansAndNumbers = new ArrayList<>(); + List booleans = getBooleans(); + List numbers = getNumbers(start, end); + booleansAndNumbers.addAll(booleans); + booleansAndNumbers.addAll(numbers); + return booleansAndNumbers; + } + +}