From 137019f867d889e42e28e9d9d2502363969780ca Mon Sep 17 00:00:00 2001
From: Tamion <70228790+notTamion@users.noreply.github.com>
Date: Mon, 15 Jul 2024 12:42:10 +0200
Subject: [PATCH] Fix HelpCommand searching (#11066)

Prevent a IOB exception when querying topic
suggestions on query string `/`.

Additionally hide help topics indices if no topics
are visible to the player requesting them.
---
 patches/api/Fix-HelpCommand-searching.patch | 46 +++++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100644 patches/api/Fix-HelpCommand-searching.patch

diff --git a/patches/api/Fix-HelpCommand-searching.patch b/patches/api/Fix-HelpCommand-searching.patch
new file mode 100644
index 0000000000..85dca81868
--- /dev/null
+++ b/patches/api/Fix-HelpCommand-searching.patch
@@ -0,0 +1,46 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Tamion <70228790+notTamion@users.noreply.github.com>
+Date: Sat, 13 Jul 2024 18:00:37 +0200
+Subject: [PATCH] Fix HelpCommand searching
+
+Prevent index out of bounds exception when finding possible matches in
+the help topics.
+A general empty string is caught and directed to the defaultTopic by
+getHelpTopic(). #findPossibleMatches hence should not concern itself
+with possible empty strings anymore.
+
+diff --git a/src/main/java/org/bukkit/command/defaults/HelpCommand.java b/src/main/java/org/bukkit/command/defaults/HelpCommand.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/command/defaults/HelpCommand.java
++++ b/src/main/java/org/bukkit/command/defaults/HelpCommand.java
+@@ -0,0 +0,0 @@ public class HelpCommand extends BukkitCommand {
+             searchString = searchString.substring(1);
+         }
+ 
++        if (searchString.isEmpty()) return null; // Paper - prevent index out of bounds - nothing matches an empty search string, should have been special cased to defaultTopic earlier, just return null.
+         for (HelpTopic topic : Bukkit.getServer().getHelpMap().getHelpTopics()) {
+             String trimmedTopic = topic.getName().startsWith("/") ? topic.getName().substring(1) : topic.getName();
+ 
+diff --git a/src/main/java/org/bukkit/help/IndexHelpTopic.java b/src/main/java/org/bukkit/help/IndexHelpTopic.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/help/IndexHelpTopic.java
++++ b/src/main/java/org/bukkit/help/IndexHelpTopic.java
+@@ -0,0 +0,0 @@ public class IndexHelpTopic extends HelpTopic {
+         if (sender instanceof ConsoleCommandSender) {
+             return true;
+         }
+-        if (permission == null) {
+-            return true;
++        // Paper start - Fix HelpCommand searching - do not show index if no topic is visible to the sender
++        if (permission != null && !sender.hasPermission(permission)) return false; // old spigot permission check
++
++        for (HelpTopic topic : allTopics) {
++            if (topic.canSee(sender)) return true;
+         }
+-        return sender.hasPermission(permission);
++
++        return false;
++        // Paper end - Fix HelpCommand searching - do not show index if no topic is visible to the sender
+     }
+ 
+     @Override