From 0ac051e24e4692ad4a670e6a7edadd4da916b8e8 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 9 Aug 2025 13:56:50 +0200 Subject: [PATCH] Improves tab-completions for books with spaces --- .../command/CommandDelete.java | 13 ++++---- .../command/CommandGive.java | 29 +++++++++++++----- .../command/CommandLoad.java | 30 +++++++++++++++---- .../utility/TabCompletionTypeHelper.java | 23 ++++++++++++++ 4 files changed, 74 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandDelete.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandDelete.java index b8f0065..e72b8b5 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandDelete.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandDelete.java @@ -6,6 +6,7 @@ import net.knarcraft.bookswithoutborders.state.BookDirectory; import net.knarcraft.bookswithoutborders.utility.BookFileHelper; import net.knarcraft.bookswithoutborders.utility.BookHelper; import net.knarcraft.bookswithoutborders.utility.InputCleaningHelper; +import net.knarcraft.bookswithoutborders.utility.TabCompletionTypeHelper; import net.knarcraft.knarlib.util.TabCompletionHelper; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -14,7 +15,6 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.io.File; -import java.util.ArrayList; import java.util.List; /** @@ -126,14 +126,11 @@ public class CommandDelete implements TabExecutor { BooksWithoutBorders.getAvailableBooks(sender, deletePublic), InputCleaningHelper.mergeArguments(arguments, 0)); if (arguments.length > 1) { - List cleaned = new ArrayList<>(); - for (String name : filtered) { - String[] parts = name.split(" "); - cleaned.add(parts[parts.length - 1]); - } - return cleaned; + return TabCompletionTypeHelper.getCleanedTabCompletions(arguments, filtered); + } else { + return filtered; } - return filtered; } + } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGive.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGive.java index 1792102..a05e650 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGive.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandGive.java @@ -141,24 +141,39 @@ public class CommandGive implements TabExecutor { @Nullable protected List doTabCompletion(@NotNull CommandSender sender, @NotNull String[] arguments, boolean listPublic) { Server server = booksWithoutBorders.getServer(); - int argumentCount = arguments.length; - if (argumentCount == 1) { return TabCompletionHelper.filterMatchingContains(BooksWithoutBorders.getAvailableBooks(sender, listPublic), arguments[0]); - } else if (argumentCount > 2 && InputCleaningHelper.isBoolean(arguments[argumentCount - 2])) { - return List.of(); + } + + List output = new ArrayList<>(); + List books = BooksWithoutBorders.getAvailableBooks(sender, listPublic); + List filtered = TabCompletionHelper.filterMatchingContains(books, + InputCleaningHelper.mergeArguments(arguments, 0)); + + if (!filtered.isEmpty()) { + List cleaned = TabCompletionTypeHelper.getCleanedTabCompletions(arguments, filtered); + if (!books.contains(InputCleaningHelper.mergeArguments(arguments, 1))) { + return cleaned; + } else { + output.addAll(cleaned); + } + } + + if (argumentCount > 2 && InputCleaningHelper.isBoolean(arguments[argumentCount - 2])) { + return output; } else if (argumentCount > 2 && server.getPlayer(arguments[argumentCount - 3]) != null && InputCleaningHelper.isInt(arguments[argumentCount - 2])) { - return TabCompletionHelper.filterMatchingStartsWith(TabCompletionTypeHelper.getBooleans(), arguments[argumentCount - 1]); + output.addAll(TabCompletionHelper.filterMatchingStartsWith(TabCompletionTypeHelper.getBooleans(), arguments[argumentCount - 1])); } else if (argumentCount > 2 && server.getPlayer(arguments[argumentCount - 2]) != null) { - return TabCompletionHelper.filterMatchingStartsWith(TabCompletionTypeHelper.getBooleansAndNumbers(1, 3), arguments[argumentCount - 1]); + output.addAll(TabCompletionHelper.filterMatchingStartsWith(TabCompletionTypeHelper.getBooleansAndNumbers(1, 3), arguments[argumentCount - 1])); } else { List players = new ArrayList<>(); for (Player player : Bukkit.getOnlinePlayers()) { players.add(player.getName()); } - return TabCompletionHelper.filterMatchingStartsWith(players, arguments[argumentCount - 1]); + output.addAll(TabCompletionHelper.filterMatchingStartsWith(players, arguments[argumentCount - 1])); } + return output; } /** diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandLoad.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandLoad.java index d4e84ab..09f5803 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandLoad.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandLoad.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; /** @@ -120,13 +121,30 @@ public class CommandLoad implements TabExecutor { int argumentCount = arguments.length; if (argumentCount == 1) { return TabCompletionHelper.filterMatchingContains(BooksWithoutBorders.getAvailableBooks(sender, loadPublic), arguments[0]); - } else if (InputCleaningHelper.isBoolean(arguments[argumentCount - 2])) { - return List.of(); - } else if (InputCleaningHelper.isInt(arguments[argumentCount - 2])) { - return TabCompletionHelper.filterMatchingStartsWith(TabCompletionTypeHelper.getBooleans(), arguments[argumentCount - 1]); - } else { - return TabCompletionHelper.filterMatchingStartsWith(TabCompletionTypeHelper.getBooleansAndNumbers(1, 3), arguments[argumentCount - 1]); } + + List output = new ArrayList<>(); + List books = BooksWithoutBorders.getAvailableBooks(sender, loadPublic); + List filtered = TabCompletionHelper.filterMatchingContains(books, + InputCleaningHelper.mergeArguments(arguments, 0)); + + if (!filtered.isEmpty()) { + List cleaned = TabCompletionTypeHelper.getCleanedTabCompletions(arguments, filtered); + if (!books.contains(InputCleaningHelper.mergeArguments(arguments, 1))) { + return cleaned; + } else { + output.addAll(cleaned); + } + } + + if (InputCleaningHelper.isBoolean(arguments[argumentCount - 2])) { + return output; + } else if (InputCleaningHelper.isInt(arguments[argumentCount - 2])) { + output.addAll(TabCompletionHelper.filterMatchingStartsWith(TabCompletionTypeHelper.getBooleans(), arguments[argumentCount - 1])); + } else { + output.addAll(TabCompletionHelper.filterMatchingStartsWith(TabCompletionTypeHelper.getBooleansAndNumbers(1, 3), arguments[argumentCount - 1])); + } + return output; } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/utility/TabCompletionTypeHelper.java b/src/main/java/net/knarcraft/bookswithoutborders/utility/TabCompletionTypeHelper.java index 9adda61..3594ce1 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/utility/TabCompletionTypeHelper.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/utility/TabCompletionTypeHelper.java @@ -59,4 +59,27 @@ public final class TabCompletionTypeHelper { return booleansAndNumbers; } + /** + * Gets tab-completions with only remaining text, from a list of full strings + * + * @param arguments

The arguments given by the user

+ * @param filtered

Tab-completions filtered by user input

+ * @return

The cleaned tab-completions

+ */ + public static @NotNull List getCleanedTabCompletions(@NotNull String[] arguments, + @NotNull List filtered) { + List cleaned = new ArrayList<>(); + for (String name : filtered) { + String[] parts = name.split(" "); + if (parts[arguments.length - 2].equalsIgnoreCase(arguments[arguments.length - 2])) { + StringBuilder builder = new StringBuilder(parts[arguments.length - 1]); + for (int i = arguments.length; i < parts.length; i++) { + builder.append(" ").append(parts[i]); + } + cleaned.add(builder.toString()); + } + } + return cleaned; + } + }