Use JEmoji

This commit is contained in:
Xujiayao 2026-03-16 21:06:04 +08:00 committed by Jason Xu
parent 758d1634d2
commit c6fd7a88fa
4 changed files with 8 additions and 136 deletions

View file

@ -23,6 +23,8 @@ dependencies {
shadow api("com.squareup.okhttp3:okhttp:${okhttp_version}") shadow api("com.squareup.okhttp3:okhttp:${okhttp_version}")
shadow api("io.netty:netty-handler:${netty_version}") shadow api("io.netty:netty-handler:${netty_version}")
shadow api("net.fellbaum:jemoji:${jemoji_version}")
} }
jar { jar {
@ -69,6 +71,8 @@ shadowJar {
relocate "org.jetbrains", "dmcc_dep.org.jetbrains" relocate "org.jetbrains", "dmcc_dep.org.jetbrains"
relocate "org.slf4j", "dmcc_dep.org.slf4j" relocate "org.slf4j", "dmcc_dep.org.slf4j"
relocate "org.yaml", "dmcc_dep.org.yaml" relocate "org.yaml", "dmcc_dep.org.yaml"
// TODO does not work
// relocate "net.fellbaum", "dmcc_dep.net.fellbaum"
from "../LICENSE" from "../LICENSE"
} }

View file

@ -12,6 +12,7 @@ import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel; import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.entities.sticker.StickerItem; import net.dv8tion.jda.api.entities.sticker.StickerItem;
import net.fellbaum.jemoji.EmojiManager;
import java.awt.Color; import java.awt.Color;
import java.util.ArrayList; import java.util.ArrayList;
@ -561,9 +562,9 @@ public class DiscordMessageParser {
private static void collectUnicodeEmojiTokens(String raw, List<TokenSpan> tokens) { private static void collectUnicodeEmojiTokens(String raw, List<TokenSpan> tokens) {
Matcher matcher = UNICODE_EMOJI_PATTERN.matcher(raw); Matcher matcher = UNICODE_EMOJI_PATTERN.matcher(raw);
while (matcher.find()) { while (matcher.find()) {
String emoji = matcher.group(); String unicodeEmoji = matcher.group();
String shortCode = EmojiShortCodeMapper.getShortCode(emoji); String alias = EmojiManager.replaceAllEmojis(unicodeEmoji, emoji -> emoji.getDiscordAliases().getFirst());
TextSegment seg = new TextSegment(shortCode, false, "yellow"); TextSegment seg = new TextSegment(alias, false, "yellow");
tokens.add(new TokenSpan(matcher.start(), matcher.end(), seg)); tokens.add(new TokenSpan(matcher.start(), matcher.end(), seg));
} }
} }

View file

@ -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.
* <p>
* 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<String, String> 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;
}
}

View file

@ -27,7 +27,4 @@ jackson_dataformat_yaml_version=2.20.1
jackson_annotations_version=2.20 jackson_annotations_version=2.20
okhttp_version=5.3.2 okhttp_version=5.3.2
netty_version=4.2.9.Final 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 jemoji_version=1.7.6