需要有关 Discord 机器人架构的建议

Need advice on architecture of a Discord bot

什么是 discord 角色?

角色是由服务器管理员创建的组。该角色具有权限、层次结构和名称。在这种情况下,重要的是玩家可以通过像这样引用他们的角色来一次引用多个玩家(“ping”他们)@RoleName.

上下文

我正在开发一个向用户发布临时角色的机器人。用户担任角色,以便其他人可以 ping 通他们。角色是在用户期望的持续时间内给出的。该机器人是用 Go. 编写的。整个应用程序主要由 Mongo 事件和用户向机器人键入的命令的处理程序组成。

每次用户通过向机器人输入命令来担任角色时,该用户的 Discord ID 都会存储在 Mongo 数据库中,并带有到期时间。一旦达到文档中存储的时间,文档将被删除 Mongo(为此使用 TTL 索引)。然后通过处理 Mongo 事件,机器人通过移除用户的角色来处理删除。 (另外,用户也可以抢先移除自己的角色,在这种情况下,角色被移除,相应的记录从数据库中移除。)

问题

当用户决定删除他的角色时,Mongo 删除事件处理程序将被触发,尽管用户的记录已在用户命令处理程序中被删除。所以,我认为可以在 Mongo 的事件处理程序中专门控制机器人。我可以在 Mongo 事件中这样做,而不是在与用户给出的命令相对应的处理程序中赋予和删除角色。例如,要取消用户的角色,我需要从命令处理程序内的数据库中删除他的记录。然后role会在对应的Mongo事件处理器里面自动被带走。

根据我的经验,我无法预见这将如何影响未来的机器人开发,所以我就此向您征求意见。这是个好主意吗?如果没有,什么是处理在上述情况下被解雇的 Mongo 处理程序的好方法?

我写得很烂,所以不要害羞地要求澄清。

如果数据库是用户拥有哪些角色的权限,那么您的机器人应用程序将充当桥梁,使 Discord 与该权限保持同步。

假设您只处理数据库事件的角色更新。在这种情况下,这意味着您的网桥应用程序必须 运行 并且正确连接到这两个服务,并且在每次到期时都不会发生任何错误。否则,状态将不同步。为了正确性,最好假设这三个服务中的任何一个或所有服务都可以随时下线。

为了让您的体验保持响应性和一致性,您应该在尽可能多的地方快速更新角色,以确保最终的一致性。这可能会导致冗余更新,因此请检查更新是否已应用并在必要时跳过它。

以下是更新案例的示例:

  • 在机器人应用程序启动时:更新所有用户
  • 发生数据库事件:更新用户
  • 根据用户命令:更新用户(可选,但如果数据库事件延迟,可能会提供更快的用户反馈)
  • 在用户加入服务器时:更新用户
  • 在 periodic/background 任务中:更新所有用户(可选,以防其他更新失败或角色被外部源修改)