#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))