diff --git a/src/main/java/land/chipmunk/chipmunkmod/modules/custom_chat/CustomChat.java b/src/main/java/land/chipmunk/chipmunkmod/modules/custom_chat/CustomChat.java index aa9ecba..ee4ed9c 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/modules/custom_chat/CustomChat.java +++ b/src/main/java/land/chipmunk/chipmunkmod/modules/custom_chat/CustomChat.java @@ -7,9 +7,9 @@ import land.chipmunk.chipmunkmod.modules.Chat; import land.chipmunk.chipmunkmod.modules.CommandCore; import land.chipmunk.chipmunkmod.modules.KaboomCheck; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextReplacementConfig; -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.TextDecoration; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -21,47 +21,36 @@ import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Timer; import java.util.TimerTask; -import java.util.regex.Pattern; public class CustomChat { - private static final LegacyComponentSerializer LEGACY = LegacyComponentSerializer.legacyAmpersand(); private static final GsonComponentSerializer GSON = GsonComponentSerializer.gson(); private static final CustomChatComponentRenderer RENDERER = new CustomChatComponentRenderer(); - // https://github.com/kaboomserver/extras/blob/master/src/main/java/pw/kaboom/extras/modules/player/PlayerChat.java#L49C9-L81C26 - private 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]{2,6}\\b([-a-zA-Z0-9@:%_+.~#?&/=]*))")) - .replacement((b, c) -> { - if (c == null) { - return null; - } + private static final LegacyComponentSerializer SERIALIZER = LegacyComponentSerializer - if (b.groupCount() < 1) { - return null; - } + // https://sus.red/abc?a=b&c=d will still break the click events, though + .legacyAmpersand() - final String content = b.group(1); - final String url; + .toBuilder() - /* - Minecraft doesn't accept "www.google.com" as a URL - in click events - */ - if (content.contains("://")) { - url = content; - } else { - url = "https://" + content; - } + .extractUrls( + Style.style( + NamedTextColor.BLUE, + TextDecoration.UNDERLINED, + HoverEvent.showText( + Component + .text("Click here to open the URL") + .color(NamedTextColor.BLUE) + ) + ) + ) - return Component.text(content, NamedTextColor.BLUE) - .decorate(TextDecoration.UNDERLINED) - .clickEvent(ClickEvent.openUrl(url)); - }) - .build(); + // > `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(); private final MinecraftClient client; @@ -120,22 +109,21 @@ public class CustomChat { return; } - final Component styledMessage = LEGACY.deserialize(message) - .replaceText(URL_REPLACEMENT_CONFIG); + final Component styledMessage = SERIALIZER.deserialize(message); final String username = MinecraftClient.getInstance().getSession().getUsername(); final String key = ChipmunkMod.CONFIG.bots.chomens.formatKey; final String hash = key != null ? Hashing.sha256() - .hashString(key + total, StandardCharsets.UTF_8) - .toString() - .substring(0, 8) : + .hashString(key + total, StandardCharsets.UTF_8) + .toString() + .substring(0, 8) : ""; total++; final CustomChatContext context = new CustomChatContext(player.getUuidAsString(), styledMessage, - Map.of("MESSAGE", message, "USERNAME", username, "HASH", hash)); + Map.of("MESSAGE", message, "USERNAME", username, "HASH", hash)); final Component renderedFormat = RENDERER.render(ChipmunkMod.CONFIG.customChat.format, context) .compact(); final String json = GSON.serialize(renderedFormat);