Как получить смайлики из сообщения? - PullRequest
0 голосов
/ 12 октября 2019

Я создаю несогласного бота, который получит любые смайлики в сообщении, а затем отреагирует на это сообщение этими смайликами.

Я пробовал и event.getMessage().getEmotes(), и event.getMessage().getEmotesBag(). Однако оба возвращают пустой список / сумку.

Вот мой текущий код:

@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: []

Я ожидал / хотел, чтобы он вывел всесмайлики, которые есть в сообщении и добавляют их как реакцию на сообщение.

1 Ответ

0 голосов
/ 12 октября 2019

В документации упоминается Emote только для пользовательских эмодзи серверов. Чтобы получить смайлики, вы должны использовать библиотеку смайликов, которая может найти и отфильтровать эмодзи из строки.

Вы можете использовать emoji-java для этого:

String content = message.getContentRaw();
List<String> emojis = EmojiParser.extractEmojis(content);
for (String emoji : emojis) {
    message.addReaction(emoji).queue();
}

Чтобы объединить это с пользовательскими эмоциями, вы можете использовать формат упоминания эмоций и юникодов, чтобы найти каждый индекс и упорядочить список.

// 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();
}

Обратите внимание, что дубликаты игнорируются этим, потому что реакции не могут бытьдублируется.

...