【发布时间】:2021-02-13 18:09:50
【问题描述】:
我正在将我的 Discord 机器人从 Discord4J v2 重写为基于 Reactor 的 v3。我是响应式编程的新手,尤其是 Java Reactor。我想用三种类型的命令实现一个命令系统:
- DM 命令 — 用户作为直接消息发送给机器人的命令,
-
公共公会命令 — 用户在我的 Discord 服务器中的特殊频道
#bot-commands中发送的命令 — 每个具有特定角色 X 的人都可以使用这些命令,并且 - 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