如何从消息中获取表情符号?
How to get emojis from a message?
我正在创建一个 discord 机器人,它将获取消息中的任何表情符号,然后用这些表情符号对该消息做出反应。
event.getMessage().getEmotes()
和event.getMessage().getEmotesBag()
我都试过了。但是 return 和一个空的 list/bag。
这是我当前的代码:
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event)
{
System.out.println("Event Fired");
if(event.getMessage().getChannel() == event.getGuild().getTextChannelById("632303757929086998"))
{
System.out.println("Found Message");
System.out.println("Emojis: " + event.getMessage().getEmotes());
for(Emote emote : event.getMessage().getEmotes())
{
System.out.println("Found emote" + emote);
event.getMessage().addReaction(emote).queue();
}
}
}
这会输出:Event Fired
、Found Message
和 Emojis: []
我 expected/wanted 它输出消息中的所有表情符号并将它们添加为对消息的反应。
如文档所述,Emote
仅适用于服务器的自定义表情符号。要检索表情符号,您必须使用表情符号库,它可以从字符串中查找并过滤掉表情符号。
您可以使用 emoji-java (updated in my fork) 为此:
String content = message.getContentRaw();
List<String> emojis = EmojiParser.extractEmojis(content);
for (String emoji : emojis) {
message.addReaction(emoji).queue();
}
要将其与自定义表情相结合,您可以使用表情的提及格式和 unicode 来查找每个索引并对您的列表进行排序。
// Collect emojis
String content = message.getContentRaw();
List<String> emojis = EmojiParser.extractEmojis(content);
List<String> customEmoji = message.getEmotes().stream()
.map((emote) -> emote.getName() + ":" + emote.getId())
.collect(Collectors.toList());
// Create merged list
List<String> merged = new ArrayList<>();
merged.addAll(emojis);
merged.addAll(customEmoji);
// Sort based on index in message to preserve order
merged.sort(Comparator.comparingInt(content::indexOf));
for (String emoji : merged) {
message.addReaction(emoji).queue();
}
请注意,重复项将被忽略,因为反应无法重复。
我正在创建一个 discord 机器人,它将获取消息中的任何表情符号,然后用这些表情符号对该消息做出反应。
event.getMessage().getEmotes()
和event.getMessage().getEmotesBag()
我都试过了。但是 return 和一个空的 list/bag。
这是我当前的代码:
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event)
{
System.out.println("Event Fired");
if(event.getMessage().getChannel() == event.getGuild().getTextChannelById("632303757929086998"))
{
System.out.println("Found Message");
System.out.println("Emojis: " + event.getMessage().getEmotes());
for(Emote emote : event.getMessage().getEmotes())
{
System.out.println("Found emote" + emote);
event.getMessage().addReaction(emote).queue();
}
}
}
这会输出:Event Fired
、Found Message
和 Emojis: []
我 expected/wanted 它输出消息中的所有表情符号并将它们添加为对消息的反应。
如文档所述,Emote
仅适用于服务器的自定义表情符号。要检索表情符号,您必须使用表情符号库,它可以从字符串中查找并过滤掉表情符号。
您可以使用 emoji-java (updated in my fork) 为此:
String content = message.getContentRaw();
List<String> emojis = EmojiParser.extractEmojis(content);
for (String emoji : emojis) {
message.addReaction(emoji).queue();
}
要将其与自定义表情相结合,您可以使用表情的提及格式和 unicode 来查找每个索引并对您的列表进行排序。
// Collect emojis
String content = message.getContentRaw();
List<String> emojis = EmojiParser.extractEmojis(content);
List<String> customEmoji = message.getEmotes().stream()
.map((emote) -> emote.getName() + ":" + emote.getId())
.collect(Collectors.toList());
// Create merged list
List<String> merged = new ArrayList<>();
merged.addAll(emojis);
merged.addAll(customEmoji);
// Sort based on index in message to preserve order
merged.sort(Comparator.comparingInt(content::indexOf));
for (String emoji : merged) {
message.addReaction(emoji).queue();
}
请注意,重复项将被忽略,因为反应无法重复。