diff --git a/core/build.gradle b/core/build.gradle index ec157bf7..00ef7a81 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -23,6 +23,8 @@ dependencies { shadow api("com.squareup.okhttp3:okhttp:${okhttp_version}") shadow api("io.netty:netty-handler:${netty_version}") + + shadow api("net.fellbaum:jemoji:${jemoji_version}") } jar { @@ -69,6 +71,8 @@ shadowJar { relocate "org.jetbrains", "dmcc_dep.org.jetbrains" relocate "org.slf4j", "dmcc_dep.org.slf4j" relocate "org.yaml", "dmcc_dep.org.yaml" + // TODO does not work + // relocate "net.fellbaum", "dmcc_dep.net.fellbaum" from "../LICENSE" } diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordMessageParser.java b/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordMessageParser.java index ed714a94..0a4af78e 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordMessageParser.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordMessageParser.java @@ -12,6 +12,7 @@ import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel; import net.dv8tion.jda.api.entities.sticker.StickerItem; +import net.fellbaum.jemoji.EmojiManager; import java.awt.Color; import java.util.ArrayList; @@ -561,9 +562,9 @@ public class DiscordMessageParser { private static void collectUnicodeEmojiTokens(String raw, List tokens) { Matcher matcher = UNICODE_EMOJI_PATTERN.matcher(raw); while (matcher.find()) { - String emoji = matcher.group(); - String shortCode = EmojiShortCodeMapper.getShortCode(emoji); - TextSegment seg = new TextSegment(shortCode, false, "yellow"); + String unicodeEmoji = matcher.group(); + String alias = EmojiManager.replaceAllEmojis(unicodeEmoji, emoji -> emoji.getDiscordAliases().getFirst()); + TextSegment seg = new TextSegment(alias, false, "yellow"); tokens.add(new TokenSpan(matcher.start(), matcher.end(), seg)); } } diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/EmojiShortCodeMapper.java b/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/EmojiShortCodeMapper.java deleted file mode 100644 index 149cb2eb..00000000 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/EmojiShortCodeMapper.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.xujiayao.discord_mc_chat.server.discord; - -import java.util.HashMap; -import java.util.Map; - -/** - * Maps common Unicode emoji characters to their short-code representations. - *

- * This is a lightweight mapper covering frequently used emojis. Unknown emojis - * will fall back to their original Unicode character. - * - * @author Xujiayao - */ -public class EmojiShortCodeMapper { - - private static final Map EMOJI_MAP = new HashMap<>(); - - static { - // Smileys & People - EMOJI_MAP.put("\uD83D\uDE00", ":grinning:"); - EMOJI_MAP.put("\uD83D\uDE01", ":grin:"); - EMOJI_MAP.put("\uD83D\uDE02", ":joy:"); - EMOJI_MAP.put("\uD83D\uDE03", ":smiley:"); - EMOJI_MAP.put("\uD83D\uDE04", ":smile:"); - EMOJI_MAP.put("\uD83D\uDE05", ":sweat_smile:"); - EMOJI_MAP.put("\uD83D\uDE06", ":laughing:"); - EMOJI_MAP.put("\uD83D\uDE07", ":innocent:"); - EMOJI_MAP.put("\uD83D\uDE08", ":smiling_imp:"); - EMOJI_MAP.put("\uD83D\uDE09", ":wink:"); - EMOJI_MAP.put("\uD83D\uDE0A", ":blush:"); - EMOJI_MAP.put("\uD83D\uDE0B", ":yum:"); - EMOJI_MAP.put("\uD83D\uDE0C", ":relieved:"); - EMOJI_MAP.put("\uD83D\uDE0D", ":heart_eyes:"); - EMOJI_MAP.put("\uD83D\uDE0E", ":sunglasses:"); - EMOJI_MAP.put("\uD83D\uDE0F", ":smirk:"); - EMOJI_MAP.put("\uD83D\uDE10", ":neutral_face:"); - EMOJI_MAP.put("\uD83D\uDE11", ":expressionless:"); - EMOJI_MAP.put("\uD83D\uDE12", ":unamused:"); - EMOJI_MAP.put("\uD83D\uDE13", ":sweat:"); - EMOJI_MAP.put("\uD83D\uDE14", ":pensive:"); - EMOJI_MAP.put("\uD83D\uDE15", ":confused:"); - EMOJI_MAP.put("\uD83D\uDE16", ":confounded:"); - EMOJI_MAP.put("\uD83D\uDE17", ":kissing:"); - EMOJI_MAP.put("\uD83D\uDE18", ":kissing_heart:"); - EMOJI_MAP.put("\uD83D\uDE19", ":kissing_smiling_eyes:"); - EMOJI_MAP.put("\uD83D\uDE1A", ":kissing_closed_eyes:"); - EMOJI_MAP.put("\uD83D\uDE1B", ":stuck_out_tongue:"); - EMOJI_MAP.put("\uD83D\uDE1C", ":stuck_out_tongue_winking_eye:"); - EMOJI_MAP.put("\uD83D\uDE1D", ":stuck_out_tongue_closed_eyes:"); - EMOJI_MAP.put("\uD83D\uDE1E", ":disappointed:"); - EMOJI_MAP.put("\uD83D\uDE1F", ":worried:"); - EMOJI_MAP.put("\uD83D\uDE20", ":angry:"); - EMOJI_MAP.put("\uD83D\uDE21", ":rage:"); - EMOJI_MAP.put("\uD83D\uDE22", ":cry:"); - EMOJI_MAP.put("\uD83D\uDE23", ":persevere:"); - EMOJI_MAP.put("\uD83D\uDE24", ":triumph:"); - EMOJI_MAP.put("\uD83D\uDE25", ":disappointed_relieved:"); - EMOJI_MAP.put("\uD83D\uDE26", ":frowning:"); - EMOJI_MAP.put("\uD83D\uDE27", ":anguished:"); - EMOJI_MAP.put("\uD83D\uDE28", ":fearful:"); - EMOJI_MAP.put("\uD83D\uDE29", ":weary:"); - EMOJI_MAP.put("\uD83D\uDE2A", ":sleepy:"); - EMOJI_MAP.put("\uD83D\uDE2B", ":tired_face:"); - EMOJI_MAP.put("\uD83D\uDE2C", ":grimacing:"); - EMOJI_MAP.put("\uD83D\uDE2D", ":sob:"); - EMOJI_MAP.put("\uD83D\uDE2E", ":open_mouth:"); - EMOJI_MAP.put("\uD83D\uDE2F", ":hushed:"); - EMOJI_MAP.put("\uD83D\uDE30", ":cold_sweat:"); - EMOJI_MAP.put("\uD83D\uDE31", ":scream:"); - EMOJI_MAP.put("\uD83D\uDE32", ":astonished:"); - EMOJI_MAP.put("\uD83D\uDE33", ":flushed:"); - EMOJI_MAP.put("\uD83D\uDE34", ":sleeping:"); - EMOJI_MAP.put("\uD83D\uDE35", ":dizzy_face:"); - EMOJI_MAP.put("\uD83D\uDE36", ":no_mouth:"); - EMOJI_MAP.put("\uD83D\uDE37", ":mask:"); - EMOJI_MAP.put("\uD83D\uDE38", ":smile_cat:"); - EMOJI_MAP.put("\uD83D\uDE39", ":joy_cat:"); - EMOJI_MAP.put("\uD83D\uDE3A", ":smiley_cat:"); - EMOJI_MAP.put("\uD83D\uDE3B", ":heart_eyes_cat:"); - EMOJI_MAP.put("\uD83D\uDE3C", ":smirk_cat:"); - EMOJI_MAP.put("\uD83D\uDE3D", ":kissing_cat:"); - EMOJI_MAP.put("\uD83D\uDE3E", ":pouting_cat:"); - EMOJI_MAP.put("\uD83D\uDE3F", ":crying_cat_face:"); - EMOJI_MAP.put("\uD83D\uDE40", ":scream_cat:"); - EMOJI_MAP.put("\uD83D\uDE4B", ":raising_hand:"); - EMOJI_MAP.put("\uD83D\uDE4C", ":raised_hands:"); - EMOJI_MAP.put("\uD83D\uDE4D", ":person_frowning:"); - EMOJI_MAP.put("\uD83D\uDE4E", ":person_pouting:"); - EMOJI_MAP.put("\uD83D\uDE4F", ":pray:"); - - // Common symbols - EMOJI_MAP.put("\u2764", ":heart:"); - EMOJI_MAP.put("\u2764\uFE0F", ":heart:"); - EMOJI_MAP.put("\uD83D\uDC94", ":broken_heart:"); - EMOJI_MAP.put("\uD83D\uDC4D", ":thumbsup:"); - EMOJI_MAP.put("\uD83D\uDC4E", ":thumbsdown:"); - EMOJI_MAP.put("\uD83D\uDC4C", ":ok_hand:"); - EMOJI_MAP.put("\u270C", ":v:"); - EMOJI_MAP.put("\u270C\uFE0F", ":v:"); - EMOJI_MAP.put("\uD83D\uDC4F", ":clap:"); - EMOJI_MAP.put("\uD83D\uDC4B", ":wave:"); - EMOJI_MAP.put("\uD83D\uDD25", ":fire:"); - EMOJI_MAP.put("\u2B50", ":star:"); - EMOJI_MAP.put("\uD83C\uDF1F", ":star2:"); - EMOJI_MAP.put("\u2705", ":white_check_mark:"); - EMOJI_MAP.put("\u274C", ":x:"); - EMOJI_MAP.put("\u2753", ":question:"); - EMOJI_MAP.put("\u2757", ":exclamation:"); - EMOJI_MAP.put("\u26A0", ":warning:"); - EMOJI_MAP.put("\u26A0\uFE0F", ":warning:"); - EMOJI_MAP.put("\uD83D\uDCAF", ":100:"); - EMOJI_MAP.put("\uD83C\uDF89", ":tada:"); - EMOJI_MAP.put("\uD83C\uDF8A", ":confetti_ball:"); - } - - /** - * Gets the short-code representation for a Unicode emoji. - * - * @param emoji The Unicode emoji string. - * @return The short-code (e.g. ":blush:"), or the original Unicode character if unknown. - */ - public static String getShortCode(String emoji) { - String code = EMOJI_MAP.get(emoji); - if (code != null) { - return code; - } - // Fallback: return the original emoji character as-is - return emoji; - } -} diff --git a/gradle.properties b/gradle.properties index 7793d48a..2de6d485 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,7 +27,4 @@ jackson_dataformat_yaml_version=2.20.1 jackson_annotations_version=2.20 okhttp_version=5.3.2 netty_version=4.2.9.Final -# implementation("net.fellbaum:jemoji:VERSION") -# https://github.com/felldo/JEmoji -# Use this instead of emoji-java, as it is more up to date and has better support for newer emojis. jemoji_version=1.7.6