太好了。顺便说一句,如果你决定再次开始编码,我很乐意考虑任何有用的通用改进。
好的,让我们慢慢来。我刚刚向这个仓库提交了我的第一个拉取请求
。
https://github.com/merefield/discourse-discord-bot/pull/3
已合并
谢谢!
嘿!我一直在寻找一个插件,能够根据用户在 Discourse 个人资料上的徽章,在 Discord 中为他们分配角色。你们的插件支持这个功能吗?如果不支持,这功能本身可行吗?谢谢!
目前还不行,但您完全可以 fork 这个项目,并添加一个合适的命令来实现该功能!
如果实现得当,我会考虑合并您的 Pull Request。不过,这可能过于特定,不太适合通用场景,因为您大概需要维护某种映射关系,除非徽章名称与角色名称完全一致?无论如何,您可能需要过滤掉其中大部分内容?这对于通用场景来说可能会变得混乱。如果您能找到一种非常简洁的通用管理方案,适用于该插件的普通用户,请随时告诉我。
不过,请随意 fork,尽情发挥!
我很想看看是否可行。那会让我对这个插件更感兴趣。![]()
只是一个小问题:每次想要更新角色时,我们必须手动运行 !discsync 吗,还是它是自动的?
不幸的是,确实如此。添加一个“在 x 小时后重复”的参数或许是一个不错的改进(欢迎提交 PR,或者可以雇佣我来实现),但正如我此前在该主题中提到的,更好的方案是由某人基于其 API 开发一个新插件,并创建一些计划性的 Sidekiq 任务来执行该功能。机器人是一个有趣的解决方案,但对于计划性同步而言,并非最佳的架构选择。
哦,谢谢。是的,我们已经考虑过一种可能的替代方案……
我们原本想将 Discourse 群组与 Discord 角色同步,但看起来目前没有完美的解决方案。
现在我们打算通过 Webhook 制作某种机器人:当用户群组更新(或用户名变更)时,Discourse 会向自定义解决方案触发一个 Webhook,然后该方案将在 Discord 中分配相应角色。我们将继续使用 Discord OAuth 来获取服务器(guilds),并通过创建自定义的 Data Explorer 查询,利用 API 获取这些服务器信息。
流程大致如下:
- 用户更改群组或用户名
- 触发指向自定义解决方案的 Webhook
- 该自定义解决方案回调 Data Explorer API,执行自定义查询以获取该用户的服务器列表
- 根据获取到的服务器信息,调用 Discord API 更新角色
采用适当的批处理作业会更好,这样可以避免因一次性事件故障而导致数据完整性受损。两者都非常完美。
嗯,我并没有那样做……![]()
我已经 Fork 了你的仓库,并创建了一个符合我们需求的新插件:
它基本上会自动将所有群组与 Discord 角色进行同步。当用户被添加到或从某个群组中移除时,系统会运行一个同步任务,并根据公开群组更新他们的角色。此外,我还添加了一个设置,用于标记“已验证角色”,该角色会自动分配给所有拥有 Discourse 账户的用户。同时,它还支持添加一个安全角色列表,机器人会在同步用户时忽略这些角色(例如,当你希望在服务器中设置与论坛不同的管理员和版主时非常有用)。
我还添加了一个用户名与昵称同步功能,可以强制要求用户的服务器昵称与论坛用户名保持一致。
在清理完一些细节后,我会创建一个插件主题,也许有人会觉得它有用。
@barreeeiroo 你的 fork 真正有趣的地方在于你巧妙地利用了 DiscourseEvents 钩子。
我曾以为这不可能实现,因为该机器人运行在独立的线程中。但正如你所发现的,我们似乎可以对事件做出反应并影响机器人的行为。因此非常感谢你,这是一个非常重要的见解,值得我们今后深入开发。
因此,我已在主仓库中开始采用这一技术,首先实现了在新帖子或主题发布时设置监控,并将这些内容公告到 Discord 的管理员频道。
目前该功能可能实用性不大,但它向其他人展示了这一概念,供他们借鉴使用。
好的,我已经进一步开发了该插件,并实现了双向通信的概念验证(POC):
以下是新设置:
- 您可以在插件设置中指定一个 Discord 公告频道。
- 现在,您可以在指定的 Discord 公告频道中输入内容,这会将您的消息发布到插件设置中指定的 Discourse 主题。
- 您可以设置一个 Discourse 分类列表,以便当有人在某个分类中发帖或创建新主题时(两者之一或两者皆可),将内容发布到您的 Discord 公告频道。
此外,我添加了一个新文件来管理由 discordrb API 支持的 Discord 事件,其中公告逻辑是第一个示例(如果您认为对社区有通用价值,欢迎开发新功能并提交 PR)。
我还移除了在 app.yml 中安装 libsodium-dev 所需的更改,因为现在更新依赖项后,这已是可选的,且当前插件并不需要它(无需处理语音功能)。这将使安装过程更加简单。
马克,抱歉,我不知怎么错过了这个。
你找到问题了吗?
请更新并尝试新版本,然后我们再继续。
Discourse 团队资助的重要更新 ![]()
-
新增命令
!disccopy <消息数量> <可选目标分类名称> <可选目标主题名称>,允许您在 Discord 聊天中将 Discord 消息历史记录(在该频道中)复制到您的 Discourse 实例。这可以安全地一次性处理数千条消息(但对于如此大的数量将需要一些时间)。 -
自动按频道进行每条消息的聊天复制,复制到 Discourse 中任何同名的分类:如果频道名称与分类名称匹配,并且启用了此功能,它将把消息复制到 Discourse 中:

-
对于任何从 Discord 复制到 Discourse 的消息,用户现在将正确显示,前提是该用户已通过 Discord 登录到 Discourse(因此 Discord Bot 能够匹配用户帐户)。
-
为许多功能添加了本地化支持。
感谢 @erlend_sh 和 Discourse 团队对这项工作的规范和赞助!! ![]()
更多机器人功能即将推出
![]()
如果他们使用 Discourse 身份验证或 Discord OAuth 以外的任何身份验证登录,此插件是否会忽略他们?
它没有忽略它们,只是无法在另一个系统上将用户与该人匹配。因此,复制的消息将显示为来自“系统”。
是否支持线程?
还没有,克劳斯,但有可能在计划中。等待 Ruby API 更新(阻塞),然后等待支持者添加该功能。


