【问题标题】:Java Reactor - if/else chaining (filtering)Java Reactor - if/else 链接(过滤)
【发布时间】:2021-02-13 18:09:50
【问题描述】:

我正在将我的 Discord 机器人从 Discord4J v2 重写为基于 Reactor 的 v3。我是响应式编程的新手,尤其是 Java Reactor。我想用三种类型的命令实现一个命令系统:

  1. DM 命令 — 用户作为直接消息发送给机器人的命令,
  2. 公共公会命令 — 用户在我的 Discord 服务器中的特殊频道 #bot-commands 中发送的命令 — 每个具有特定角色 X 的人都可以使用这些命令,并且
  3. admin guild commands — 类似于 public,但用户必须具有某些角色 Y(高于 X)。

如果用户尝试执行某些特定命令但他们没有获得所需的角色,机器人应该告诉他们这一点。否则应该执行命令(考虑到 sender(消息作者)、发送此命令的 channel 以及 command 本身(消息))。

我不确定如何响应式地实现这一切,而且我在 Discord4J wiki 上找不到必要的信息。这是我目前拥有的:

private final Set<DiscordCommand> discordGuildCommands = new HashSet<>();
private final Set<DiscordCommand> discordDmCommands    = new HashSet<>();

// ...

gateway = DiscordClient.create(discordToken).login().block();

// ...

        gateway.getEventDispatcher()
                .on(MessageCreateEvent.class)
                .filter(event -> !(event.getMessage().getChannel().block() instanceof PrivateChannel))
                .filterWhen(event -> event.getMember().get().hasHigherRoles(Roles.REFLEXBOT_CTRL_SINGLETON))
                .flatMap(event -> Mono.just(event.getMessage().getContent())
                        .flatMap(content -> Flux.fromIterable(discordGuildCommands)
                                .filter(cmd -> content.startsWith(DISCORD_COMMANDS_PREFIX + cmd.getName()))
                                .flatMap(cmd -> cmd.process(event))
                                .next()
                        )
                )
                .subscribe();

此代码似乎工作正常,允许我处理 admin guild commands,即“权限级别”(最高角色级别)为至少我指定了一个。

但是我如何正确地(反应性地和很好地)实现其余的命令?我还没有在 Reactor 中找到类似 if/else 链接的东西,我真的不想复制上述代码多次更改,仅更改了 1-2 filter(...) 行。

【问题讨论】:

  • 由于格式问题已将评论移至答案

标签: java discord reactive-programming reactor discord4j


【解决方案1】:

我不熟悉 Discord4J,但我认为您应该逆流并为您的命令添加一些设置。

  1. 添加哈希映射 [command name => channel/private]
  2. 添加哈希映射 [命令名 => 最小角色]
  3. 添加哈希映射 [command name => command]

然后构建您的流程:

  1. 从第一个地图获取命令(或返回错误“我不知道该命令”)
  2. 使用第一个映射检查命令是否与请求类型(私有/通道)匹配(或返回错误“我不知道该命令”)
  3. 使用第二个地图检查用户角色(或返回错误“访问被拒绝”)
  4. 从第三个地图获取命令实例
  5. 运行命令

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2019-05-17
    • 2019-09-20
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多