From 7cd77fe850eeb0dc0997d835e4b636a41a81fbce Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Thu, 10 Apr 2025 13:41:20 +0700 Subject: [PATCH] refactor: use the built-in adventure LegacyComponentSerializer `extractUrls` in the serializer builder still does not fix `&d` leaking and breaking the click event and shit --- build-number.txt | 2 +- .../commands/NetMessageCommand.java | 7 +-- .../chomens_bot/plugins/ConsolePlugin.java | 8 +--- .../chomens_bot/plugins/DiscordPlugin.java | 7 +-- .../util/ChatMessageUtilities.java | 36 +++++++++++++++ .../chomens_bot/util/ComponentUtilities.java | 45 ------------------- 6 files changed, 43 insertions(+), 62 deletions(-) create mode 100644 src/main/java/me/chayapak1/chomens_bot/util/ChatMessageUtilities.java diff --git a/build-number.txt b/build-number.txt index 0c52fc6d..89699d05 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -2591 \ No newline at end of file +2601 \ No newline at end of file diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/NetMessageCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/NetMessageCommand.java index 2c5982c0..6a4c80bf 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/NetMessageCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/NetMessageCommand.java @@ -6,12 +6,11 @@ import me.chayapak1.chomens_bot.command.CommandContext; import me.chayapak1.chomens_bot.command.CommandException; import me.chayapak1.chomens_bot.command.TrustLevel; import me.chayapak1.chomens_bot.data.chat.ChatPacketType; -import me.chayapak1.chomens_bot.util.ComponentUtilities; +import me.chayapak1.chomens_bot.util.ChatMessageUtilities; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import java.util.List; @@ -53,9 +52,7 @@ public class NetMessageCommand extends Command { final String rawMessage = context.getString(true, true); - final Component stylizedMessage = LegacyComponentSerializer.legacyAmpersand() - .deserialize(rawMessage) - .replaceText(ComponentUtilities.URL_REPLACEMENT_CONFIG); + final Component stylizedMessage = ChatMessageUtilities.applyChatMessageStyling(rawMessage); final Component component = Component.translatable( "[%s]%s%s%s› %s", diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/ConsolePlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/ConsolePlugin.java index 31d2fd3b..893c7fb7 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/ConsolePlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/ConsolePlugin.java @@ -5,7 +5,7 @@ import me.chayapak1.chomens_bot.Configuration; import me.chayapak1.chomens_bot.Main; import me.chayapak1.chomens_bot.command.Command; import me.chayapak1.chomens_bot.command.contexts.ConsoleCommandContext; -import me.chayapak1.chomens_bot.util.ComponentUtilities; +import me.chayapak1.chomens_bot.util.ChatMessageUtilities; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.SelectorComponent; @@ -14,7 +14,6 @@ import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.jetbrains.annotations.NotNull; import org.jline.reader.*; @@ -23,7 +22,6 @@ import java.util.Map; public class ConsolePlugin implements Completer { private static final ConsoleFormatRenderer RENDERER = new ConsoleFormatRenderer(); - private static final LegacyComponentSerializer LEGACY = LegacyComponentSerializer.legacyAmpersand(); private final List allBots; @@ -104,9 +102,7 @@ public class ConsolePlugin implements Completer { if (!bot.loggedIn) continue; - final Component stylizedMessage = LEGACY - .deserialize(line) - .replaceText(ComponentUtilities.URL_REPLACEMENT_CONFIG); + final Component stylizedMessage = ChatMessageUtilities.applyChatMessageStyling(line); final Component rendered = RENDERER.render( format, diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/DiscordPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/DiscordPlugin.java index f1ffaa9a..68ed430c 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/DiscordPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/DiscordPlugin.java @@ -4,6 +4,7 @@ import me.chayapak1.chomens_bot.Bot; import me.chayapak1.chomens_bot.Configuration; import me.chayapak1.chomens_bot.Main; import me.chayapak1.chomens_bot.command.contexts.DiscordCommandContext; +import me.chayapak1.chomens_bot.util.ChatMessageUtilities; import me.chayapak1.chomens_bot.util.CodeBlockUtilities; import me.chayapak1.chomens_bot.util.ComponentUtilities; import me.chayapak1.chomens_bot.util.LoggerUtilities; @@ -24,7 +25,6 @@ import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.geysermc.mcprotocollib.network.event.session.ConnectedEvent; import org.geysermc.mcprotocollib.network.event.session.DisconnectedEvent; import org.jetbrains.annotations.NotNull; @@ -327,10 +327,7 @@ public class DiscordPlugin extends ListenerAdapter { final String replacedMessageContent = replaceMessageContent(message.getContentDisplay()); - Component actualMessage = LegacyComponentSerializer - .legacyAmpersand() - .deserialize(replacedMessageContent) - .replaceText(ComponentUtilities.URL_REPLACEMENT_CONFIG); + Component actualMessage = ChatMessageUtilities.applyChatMessageStyling(replacedMessageContent); if (!extraComponents.isEmpty()) { if (!replacedMessageContent.isBlank()) actualMessage = actualMessage.append(Component.space()); diff --git a/src/main/java/me/chayapak1/chomens_bot/util/ChatMessageUtilities.java b/src/main/java/me/chayapak1/chomens_bot/util/ChatMessageUtilities.java new file mode 100644 index 00000000..29138e24 --- /dev/null +++ b/src/main/java/me/chayapak1/chomens_bot/util/ChatMessageUtilities.java @@ -0,0 +1,36 @@ +package me.chayapak1.chomens_bot.util; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + +public class ChatMessageUtilities { + private static final LegacyComponentSerializer SERIALIZER = LegacyComponentSerializer.legacyAmpersand() + .toBuilder() + + .extractUrls( + Style.style( + NamedTextColor.BLUE, + TextDecoration.UNDERLINED, + HoverEvent.showText( + Component + .text("Click here to open the URL") + .color(NamedTextColor.BLUE) + ) + ) + ) + + // > `this.useTerriblyStupidHexFormat = true` + // i know it is stupid indeed, + // but i also want the compatibility to the kaboom chat + .useUnusualXRepeatedCharacterHexFormat() // &x&1&2&3&4&5&6abc + + .build(); + + public static Component applyChatMessageStyling (final String message) { + return SERIALIZER.deserialize(message); + } +} diff --git a/src/main/java/me/chayapak1/chomens_bot/util/ComponentUtilities.java b/src/main/java/me/chayapak1/chomens_bot/util/ComponentUtilities.java index fcfa0ce0..5af71695 100644 --- a/src/main/java/me/chayapak1/chomens_bot/util/ComponentUtilities.java +++ b/src/main/java/me/chayapak1/chomens_bot/util/ComponentUtilities.java @@ -4,8 +4,6 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import net.kyori.adventure.text.*; -import net.kyori.adventure.text.event.ClickEvent; -import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextColor; @@ -20,49 +18,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class ComponentUtilities { - // https://github.com/kaboomserver/extras/blob/master/src/main/java/pw/kaboom/extras/modules/player/PlayerChat.java#L49C9-L81C26 - // with the hover event added - public static final TextReplacementConfig URL_REPLACEMENT_CONFIG = - TextReplacementConfig - .builder() - .match(Pattern - .compile("((https?://(ww(w|\\d)\\.)?|ww(w|\\d))[-a-zA-Z0-9@:%._+~#=]{1,256}" - + "\\.[a-zA-Z0-9]{1,63}\\b([-a-zA-Z0-9@:%_+.~#?&/=]*))")) - .replacement((b, c) -> { - if (c == null) { - return null; - } - - if (b.groupCount() < 1) { - return null; - } - - final String content = b.group(1); - final String url; - - /* - Minecraft doesn't accept "www.google.com" as a URL - in click events - */ - if (content.contains("://")) { - url = content; - } else { - url = "https://" + content; - } - - return Component.text(content, NamedTextColor.BLUE) - .decorate(TextDecoration.UNDERLINED) - .clickEvent(ClickEvent.openUrl(url)) - .hoverEvent( - HoverEvent.showText( - Component - .text("Click here to open the URL") - .color(NamedTextColor.BLUE) - ) - ); - }) - .build(); - // component parsing // rewritten from chipmunkbot, a lot of stuff has changed, and also ANSI and section signs support, etc... public static final Map LANGUAGE = loadJsonStringMap("language.json");