如何解决Java Reactor-if / else链接过滤
我正在将我的discord机器人从Discord4J v2
改写为基于Reactor的v3
。我是反应式编程(尤其是Java Reactor)的新手。我想用三种类型的命令来实现命令系统:
- DM命令-用户作为直接消息发送给机器人的命令,
- 公共行会命令-用户在我的discord服务器中通过特殊通道
#bot-commands
发送的命令-每个具有特定角色 X 的人都可以使用这些命令,和 - 管理员协会命令-与公共相似,但用户必须具有某些角色 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,但我认为您应该逆向流程并为命令添加一些设置。
- 添加哈希图[命令名=>通道/私有]
- 添加哈希图[命令名=>最低角色]
- 添加哈希图[命令名称=>命令]
然后建立您的流程:
- 从第一个地图获取命令(或返回错误“我不知道该命令”)
- 使用第一个地图检查命令是否与请求类型(私有/通道)匹配(或返回错误“我不知道该命令”)
- 使用第二个地图检查用户角色(或返回错误“访问被拒绝”)
- 从第三张地图中获取命令实例
- 运行命令
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。