From a3ccacf758598b1f1c997972a26215f0a69a4091 Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Thu, 1 May 2025 18:16:09 +0700 Subject: [PATCH] feat: re-add icu self-care that is more accurate with code RIPPED from craftbukkit. --- build-number.txt | 2 +- .../chayapak1/chomens_bot/Configuration.java | 2 ++ .../chomens_bot/plugins/PlayersPlugin.java | 35 ++++++++++++++++--- .../chomens_bot/plugins/SelfCarePlugin.java | 29 +++++++++++++++ .../plugins/ServerFeaturesPlugin.java | 2 ++ src/main/resources/default-config.yml | 5 ++- 6 files changed, 69 insertions(+), 6 deletions(-) diff --git a/build-number.txt b/build-number.txt index 1e3eb11e..371c709c 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -3036 \ No newline at end of file +3047 \ No newline at end of file diff --git a/src/main/java/me/chayapak1/chomens_bot/Configuration.java b/src/main/java/me/chayapak1/chomens_bot/Configuration.java index 87049cb2..0c32decf 100644 --- a/src/main/java/me/chayapak1/chomens_bot/Configuration.java +++ b/src/main/java/me/chayapak1/chomens_bot/Configuration.java @@ -162,6 +162,8 @@ public class Configuration { public String prefix = "&8[&eChomeNS Bot&8]"; } + public boolean icu = true; + public boolean username = true; } diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java index 4216ff0b..9464a54c 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java @@ -152,15 +152,16 @@ public class PlayersPlugin implements Listener { } } - public final PlayerEntry getEntry (final String username) { + public final PlayerEntry getEntry (final String username) { return getEntry(username, true, true); } + public final PlayerEntry getEntry (final String username, final boolean checkUUID, final boolean checkPastUsernames) { synchronized (list) { for (final PlayerEntry candidate : list) { if ( candidate != null && ( - candidate.profile.getIdAsString().equals(username) || // checks for a string UUID - candidate.profile.getName().equals(username) || - candidate.usernames.contains(username) + candidate.profile.getName().equals(username) + || (checkUUID && candidate.profile.getIdAsString().equals(username)) + || (checkPastUsernames && candidate.usernames.contains(username)) ) ) { return candidate; @@ -171,6 +172,32 @@ public class PlayersPlugin implements Listener { } } + // RIPPED from craftbukkit (literally) + // https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/src/main/java/org/bukkit/craftbukkit/CraftServer.java#592 + public final PlayerEntry getEntryTheBukkitWay (final String username) { + PlayerEntry found = getEntry(username, false, false); + // Try for an exact match first. + if (found != null) { + return found; + } + + final String lowerName = username.toLowerCase(Locale.ROOT); + int delta = Integer.MAX_VALUE; + synchronized (list) { + for (final PlayerEntry player : list) { + if (player.profile.getName().toLowerCase(Locale.ROOT).startsWith(lowerName)) { + final int curDelta = Math.abs(player.profile.getName().length() - lowerName.length()); + if (curDelta < delta) { + found = player; + delta = curDelta; + } + if (curDelta == 0) break; + } + } + } + return found; + } + public final PlayerEntry getEntry (final Component displayName) { synchronized (list) { for (final PlayerEntry candidate : list) { diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/SelfCarePlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/SelfCarePlugin.java index a8e74089..72008bb3 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/SelfCarePlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/SelfCarePlugin.java @@ -3,6 +3,7 @@ package me.chayapak1.chomens_bot.plugins; import me.chayapak1.chomens_bot.Bot; import me.chayapak1.chomens_bot.Configuration; import me.chayapak1.chomens_bot.data.listener.Listener; +import me.chayapak1.chomens_bot.data.player.PlayerEntry; import net.kyori.adventure.text.Component; import org.geysermc.mcprotocollib.network.Session; import org.geysermc.mcprotocollib.network.packet.Packet; @@ -22,6 +23,7 @@ import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.inventory.S import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundPlayerCommandPacket; import java.util.Arrays; +import java.util.UUID; import java.util.concurrent.TimeUnit; public class SelfCarePlugin implements Listener { @@ -134,6 +136,33 @@ public class SelfCarePlugin implements Listener { } } + @Override + public void onCommandSpyMessageReceived (final PlayerEntry sender, final String command) { + if (!bot.config.selfCare.icu || !bot.serverFeatures.hasIControlU) return; + + final String[] args = command.split("\\s+"); + + if (args.length < 3) return; + + if ( + (!args[0].equals("/icontrolu:icu") && !args[0].equals("/icu")) + || !args[1].equalsIgnoreCase("control") + ) return; + + // interestingly, icu only uses the third argument for the player, and not a greedy string + final String player = args[2]; + + PlayerEntry target = bot.players.getEntryTheBukkitWay(player); + + if (target == null && args[2].matches("([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})")) { + target = bot.players.getEntry(UUID.fromString(args[2])); + } + + if (target == null || !target.profile.getId().equals(bot.profile.getId())) return; + + bot.core.run("essentials:sudo " + sender.profile.getIdAsString() + " icu stop"); + } + @Override public void packetReceived (final Session session, final Packet packet) { switch (packet) { diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/ServerFeaturesPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/ServerFeaturesPlugin.java index f886602e..9dd17613 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/ServerFeaturesPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/ServerFeaturesPlugin.java @@ -16,6 +16,7 @@ public class ServerFeaturesPlugin implements Listener { public boolean hasEssentials = false; public boolean hasExtras = false; + public boolean hasIControlU = false; public ServerFeaturesPlugin (final Bot bot) { this.bot = bot; @@ -57,6 +58,7 @@ public class ServerFeaturesPlugin implements Listener { switch (key) { case "extras" -> hasExtras = true; case "essentials" -> hasEssentials = true; + case "icontrolu" -> hasIControlU = true; } } } diff --git a/src/main/resources/default-config.yml b/src/main/resources/default-config.yml index 6f8eee67..1611d578 100644 --- a/src/main/resources/default-config.yml +++ b/src/main/resources/default-config.yml @@ -135,7 +135,10 @@ selfCare: enabled: true prefix: '&8[&eChomeNS Bot&8]' - username: true # MIGHT cause problem(s) if set to false (not tested,.,.) + # iControlUwU + icu: true + + username: true bots: # username - optional, if not specified it will just use a random username