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

(JDA) How do I check for two different event types in the same method?

我知道这听起来超级简单和愚蠢,但老实说我是 java 的新手,我很难弄明白。

我有一个 class 用于检查反应的 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();
    }   
}

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

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

您不能用一种方法处理多个 Event-Types。就这么简单。事件结构对每个单独的事件调用通用方法 (EventListener#onEvent(GenericEvent e))。这包括所有内容,例如收到消息或新反应。

不过我假设您的 Listener 扩展了 ListenerAdapter-Class。 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 仍会使用每条消息的信息分别触发该方法两次。如果你想做一个准备检查(因为我假设你想做类似的事情)你必须保存你的游戏状态并根据你收到的消息更新它。

例如你可以拥有这样的 class 播放器:

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

然后在收到事件时更新 Player#ready 字段,然后检查所有玩家是否准备就绪。

希望这可以帮助您更好地理解 JDA 的 Event-Architecture :D