(JDA)如何用同一方法检查两种不同的事件类型?

时间:2020-09-18 02:23:29

标签: java discord discord-jda

我知道这听起来非常简单和愚蠢,但老实说对Java来说是新的,并且很难弄清楚。

我有一个Reacts类,用于检查反应,还有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();
    }   
}

之前,我有Game类需要MessageReceivedEvent。但这当然意味着我需要将其作为上述类中的参数。当将其添加到上述类中时,我不能再覆盖并且它不起作用。 因此,然后让我的Game类具有一个方法,该方法与MessageReceivedEvent一起运行,该方法刚刚传入空值。但是,当然这行不通,我需要真正的价值。有人知道如何做到这一点吗?

我还有另一个错误是,我想在播放器1和播放器两个通道中检查表情响应。当两者都存在响应时,开始游戏。我试图在上面写,但是每次都运行Waiting....。感谢您的任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

您不能使用一种方法处理多个事件类型。就这么简单。事件结构在每个单独的事件上调用通用方法(EventListener#onEvent(GenericEvent e))。其中包括一切,例如接收消息或新的反应。

但是,我认为您的监听器扩展了ListenerAdapter类。此类实现一些逻辑,该逻辑将所有事件拆分为单独的方法。这些方法是您要重写的方法。这些仅提供给单一事件(尽管有一些事件的超类型)。如果您希望在两种不同的事件类型上发生某些事情,则基本上有两种选择:

  • 您使用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