Проблемы с командами в диссон-боте - PullRequest
0 голосов
/ 14 апреля 2019

Раздражающий бот, который я пишу, правильно распознает одну команду, но игнорирует другую

Предполагается, что бот отправляет 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 Ответ

1 голос
/ 15 апреля 2019

Первое, что я заметил, что может быть неправильно в вашем образце, это написание имени вашего метода. Он называется получено , а не получено . Обратите внимание, что 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 .

.
...