Проблемы с командами в диссон-боте
Раздражающийся бот, который я пишу, правильно распознает одну команду, но игнорирует другую
Предполагается, что бот отправляет dm указанному пользователю и обрабатывает это нормально. Однако бот не отвечает на команду помощи.
@SubscribeEvent
public void onMessageRecived(GuildMessageReceivedEvent event) {
Member member = event.getMessage().getMentionedMembers().get(0);
System.out.println("message recived");
event.getAuthor().getName();
event.getMessage().getContentDisplay();
if (event.getMessage().getContentRaw().equals("!help")) {
event.getChannel().sendMessage("!help: displays this messgae" +
"!love (@user): Sends a dm to specified user that says 'I love you' in one of 102 languages").queue();
}
if (event.getMessage().getContentRaw().toLowerCase().startsWith("!love")) {
event.getChannel().sendMessage(member.getUser().getName() + " has been loved").queue();
Бот должен вывести:
!help: Displays this message
!love (@user): Sends a dm to specified user that says 'I love you' in one of 102 languages
Но ничего не выводится при запросе с помощью! Help
1 ответ
Первое, что я заметил, что может быть неправильно в вашем примере, это написание имени вашего метода. Это называется полученным, а не полученным. Обратите внимание, что Guild MessageReceivedEvent запускается только для сообщений, полученных в гильдии, если вы используете прямые сообщения, они не будут запущены.
Существует два способа реализации обработки событий в JDA.
InterfacedEventManager (по умолчанию)
Документация: InterfacedEventManager, ListenerAdapter
Создание класса слушателя
public class MessageListener extends ListenerAdapter {
@Override // this is good practice, it fails compilation if the method doesn't overeride
public void onMessageReceived(MessageReceivedEvent event) {
// your code here
}
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
// your code here
}
}
Ваш метод должен иметь то же имя, видимость и параметры, чтобы правильно переопределить определение из ListenerAdapter
, Использование @Override
обеспечивает это, генерируя ошибку компиляции, если переопределение неправильно сформировано.
Регистрация ListenerAdapter
JDABuilder builder = new JDABuilder(BOT_TOKEN);
builder.setEventManager(new InterfacedEventManager()); // this can be omitted, its the default
builder.addEventListener(new MessageListener());
JDA api = builder.build();
Требуется, чтобы каждый слушатель реализовывал EventListener
интерфейс для этого менеджера событий. Это делается транзитивно ListenerAdapter
,
AnnotatedEventManager
Документация: AnnotatedEventManager, SubscribeEvent
Создание метода слушателя
public class MessageSubscriber {
@SubscribeEvent // required annotation
public void onMessage(MessageReceivedEvent event) {
// your code here
}
@SubscribeEvent // required annotation
public void onGuildMessage(GuildMessageReceivedEvent event) {
// your code here
}
}
Вы можете добавить @SubscribeEvent
аннотация на методы-члены и методы класса (статические методы).
Зарегистрировать подписчика
JDABuilder builder = new JDABuilder(BOT_TOKEN);
builder.setEventManager(new AnnotatedEventManager());
builder.addEventListener(new MessageSubscriber());
JDA api = builder.build();
Если вы аннотировали методы класса, вы можете просто использовать addEventListener(MessageSubscriber.class)
для методов-членов это должен быть новый экземпляр new MessageSubscriber()
!
Если это не отвечает на ваш вопрос, у вас, вероятно, есть проблема, которая не может быть интерпретирована из вашего текущего вопроса. Пожалуйста, ограничьте его конкретной проблемой, отладив код и создав MCVE.