From 241bc8d8edc1798a218807b8c001c8574cd1b79a Mon Sep 17 00:00:00 2001 From: Xujiayao Date: Sun, 22 Mar 2026 23:58:03 +0800 Subject: [PATCH] Enhance MinecraftMessageParser to handle underscore delimiters within Discord alias emojis --- .../message/MinecraftMessageParser.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/MinecraftMessageParser.java b/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/MinecraftMessageParser.java index 574db523..4851bc3d 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/MinecraftMessageParser.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/server/message/MinecraftMessageParser.java @@ -294,6 +294,9 @@ public final class MinecraftMessageParser { if (!raw.startsWith(delimiter, i)) { continue; } + if (isUnderscoreDelimiter(delimiter) && isInsideDiscordAliasEmoji(raw, i)) { + continue; + } if (!shouldConsumeDelimiter(state, delimiter, raw, i)) { continue; } @@ -555,6 +558,29 @@ public final class MinecraftMessageParser { return hasClosingDelimiter(text, at + delimiter.length(), delimiter); } + private static boolean isUnderscoreDelimiter(String delimiter) { + return "_".equals(delimiter) || "__".equals(delimiter); + } + + private static boolean isInsideDiscordAliasEmoji(String text, int index) { + if (index <= 0 || index >= text.length()) { + return false; + } + int leftColon = text.lastIndexOf(':', index); + if (leftColon < 0) { + return false; + } + int rightColon = text.indexOf(':', index); + if (rightColon < 0 || rightColon <= leftColon + 1) { + return false; + } + if (index <= leftColon || index >= rightColon) { + return false; + } + String candidate = text.substring(leftColon, rightColon + 1); + return DISCORD_ALIAS_EMOJI_PATTERN.matcher(candidate).matches(); + } + private static boolean isDelimiterActive(MarkdownState state, String delimiter) { return switch (delimiter) { case "***" -> state.bold && state.italic;