Java Reactor-if / else链接过滤

问题描述

我正在将我的discord机器人从Discord4J v2改写为基于Reactor的v3。我是反应式编程(尤其是Java Reactor)的新手。我想用三种类型的命令来实现命令系统:

  1. DM命令-用户作为直接消息发送给机器人的命令,
  2. 公共行会命令-用户在我的discord服务器中通过特殊通道#bot-commands发送的命令-每个具有特定角色 X 的人都可以使用这些命令,和
  3. 管理员协会命令-与公共相似,但用户必须具有某些角色 Y (高于 X )。

如果用户尝试执行某些特定命令,但没有获得所需的角色,则机器人应将其告知他们。否则,应执行命令(考虑到发件人(消息作者),发送此命令的 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();

代码似乎可以正常工作,并且允许我处理管理员行会命令,即“权限级别”(最高角色级别)处于“许可级别”(最高角色级别)的成员在我的discord服务器的文本通道中发送的命令我指定的至少一个

但是我该如何正确地(反应良好地)实现其余命令??我没有在Reactor中找到诸如if / else链之类的东西,而且我真的不想重复上面的代码多次更改,仅更改了1-2 filter(...)行。

解决方法

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

  1. 添加哈希图[命令名=>通道/私有]
  2. 添加哈希图[命令名=>最低角色]
  3. 添加哈希图[命令名称=>命令]

然后建立您的流程:

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