Проблема Discord4J: вместо этого отправка сообщений в цикле

#java #discord4j

Вопрос:

Ниже приведен код, который я использовал для тестовой команды в Discord4J

 gateway.on(MessageCreateEvent.class)
            .map(MessageCreateEvent::getMessage)
            .filter(message -> message.getContent().contains("test"))
            .flatMap(Message::getChannel)
            .flatMap(channel -> channel.createMessage("test!"))
            .subscribe();
 

но теперь, если вы наберете «тест» в discord, он продолжит отправлять сообщения, а не одно сообщение, как я ожидал. В чем здесь проблема? Он работает с equals() и equalsignorecase(), но со всеми другими методами проверки строк он переходит в цикл.

Ответ №1:

Это связано с тем, что вы также получаете a MessageCreateEvent за все сообщения, которые отправляете с помощью бота. Так как ваше сообщение есть createMessage("test!") , вы также получите сообщение, где getContent() возвращается "test!" . Это, очевидно, приведет к "test!".contains("test") , но не "test!".equals("test") .

Это можно предотвратить, проверив, является ли автор сообщения ботом.

 filter(message -> !message.getAuthor().map(User::isBot).orElse(true))