(JDA) Как мне проверить наличие двух разных типов событий в одном и том же методе?

#java #discord #discord-jda

#java #Discord #discord-jda

Вопрос:

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

У меня есть класс Reactions, который проверяет реакцию, и метод onGameStart, который запускает «игру», которую я создал (или сделаю)

 @Override
public void onMessageReactionAdd(MessageReactionAddEvent e) {
    Game start = new Game();
    TextChannel pOneChannel = e.getGuild().getTextChannelsByName("player-1",true).get(0);
    TextChannel pTwoChannel = e.getGuild().getTextChannelsByName("player-2",true).get(0);
    
    if(e.getTextChannel().getIdLong() == channelID) {
        pOneChannel.sendMessage(playerOne()).queue();
        pTwoChannel.sendMessage(playerTwo()).queue();
    }
    if(e.getTextChannel() == pOneChannel) {
        if(e.getTextChannel() != pTwoChannel)
            printMessage("Waiting for players...", e);
        else
            start.onGameStart();
    }
    else if(e.getTextChannel() == pTwoChannel) {
        if(e.getTextChannel() != pOneChannel)
            printMessage("Waiting for players...", e);
        else
            start.onGameStart();
    }   
}
  

Раньше у меня была игра класса, требующая MessageReceivedEvent . Но, конечно, это означало бы, что мне это понадобится в качестве параметра в вышеупомянутом классе. При добавлении его в вышеуказанный класс я больше не могу переопределять, и он не работает.
Итак, затем я создал в своем классе Game метод, который запускается с MessageReceivedEvent, который только что передается с нулевым значением. Но, конечно, это не работает, мне нужно реальное значение. Кто-нибудь знает, как это сделать?

Также другая ошибка, с которой я столкнулся, заключается в том, что я хотел бы проверить ответ на эмоцию в каналах player 1 и player two. Когда существует ответ в обоих, запустите игру. Я пытался написать это выше, но он просто запускается в ожидании игроков.. каждый раз. Любая помощь приветствуется, спасибо.

Ответ №1:

Вы не можете обрабатывать несколько типов событий одним методом. Это так просто. Структура событий вызывает общий метод ( EventListener#onEvent(GenericEvent e) ) для каждого отдельного события. Это включает в себя все, например, получение сообщения или новую реакцию.

Однако я предполагаю, что ваш слушатель расширяет ListenerAdapter -Class . Этот класс реализует некоторую логику, которая разделяет все события на отдельные методы. Эти методы вы переопределяете. Они предоставляются только для особых событий (хотя есть некоторые супертипы событий). Если вы хотите, чтобы что-то произошло с двумя разными типами событий, у вас есть в основном два варианта:

  • Вы используете GenericEvent и анализируете все самостоятельно (я не рекомендую это делать, но это возможно)
  • Вы переопределяете все нужные вам события и вызываете вспомогательный метод, как показано ниже:
 @Override
public void onMessageReceivedEvent(MessageReceivedEvent event) {
    utilMethod(/*add Args here*/);
}

@Override
public void onMessageReceivedEvent(MessageReceivedEvent event) {
    utilMethod(/*add Args here*/);
}

private void utilMethod(/*add Args here*/) {
    // do stuff
}
  

Однако эти методы по-прежнему вызываются для каждого события по отдельности. Предположим, вы и друг отправляете два сообщения одновременно (теоретически). JDA все равно будет запускать метод два раза с информацией для каждого сообщения в отдельности. Если вы хотите выполнить проверку готовности (поскольку я предполагаю, что вы хотите сделать что-то подобное), вам нужно сохранить состояние вашей игры и обновить его в зависимости от получаемых сообщений.

Например, у вас может быть такой классный проигрыватель:

 public class Player {
    long id; // Represents the Discord ID
    boolean ready = false; // Update this on a message
    // ... some other stuff
}
  

а затем обновите Player#ready поле при получении события, а затем проверьте, готовы ли все игроки.

Надеюсь, это поможет вам немного лучше понять событийную архитектуру JDA: D