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
This commit is contained in:
ChomeNS
2025-04-10 13:41:20 +07:00
parent 29ca22101a
commit 7cd77fe850
6 changed files with 43 additions and 62 deletions

View File

@@ -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",

View File

@@ -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<Bot> 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,

View File

@@ -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());

View File

@@ -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);
}
}

View File

@@ -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<String, String> LANGUAGE = loadJsonStringMap("language.json");