首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java反应堆- if/else链接(过滤)

Java反应堆- if/else链接(过滤)
EN

Stack Overflow用户
提问于 2020-10-31 14:13:53
回答 1查看 336关注 0票数 1

我正在改写我的不和谐机器人,从Discord4J v2到基于反应堆的v3。我对反应性编程特别是Java反应堆很陌生。我想用三种类型的命令来实现一个命令系统:

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

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

我不知道如何以反应的方式实现这一切,而且我也找不到Discord4J wiki上的必要信息。这就是我目前的情况:

代码语言:javascript
复制
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();

这段代码看起来很好,允许我处理管理公会命令,也就是说,由“权限级别”(最高角色级别)的成员在我的不和谐服务器文本通道中发送的命令至少是我指定的一个。

但是我如何正确地实现其余的命令(反作用和很好地)?我还没有在反应堆中找到任何类似if/ filter(...)链接的东西,而且我真的不想重复上面的代码几次,只更改1-2个filter(...)行。

EN

回答 1

Stack Overflow用户

发布于 2020-11-20 10:37:02

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

  1. 添加散列映射命令名=>通道/私有
  2. 添加散列映射命令名=>最小角色
  3. 添加哈希映射命令名=>命令

然后构建你的流程:

  1. 从第一张地图获取命令(或者返回错误“我不知道该命令”)
  2. 使用第一次地图检查命令是否与请求类型(私有/通道)匹配(或返回错误“我不知道该命令”)
  3. 使用第二个映射检查用户角色(或返回错误“拒绝访问”)
  4. 从第三张地图获取命令实例
  5. 运行命令
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64622624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档