Discord Bot 构建套件 🤖

太好了。顺便说一句,如果你决定再次开始编码,我很乐意考虑任何有用的通用改进。

2 个赞

好的,让我们慢慢来。我刚刚向这个仓库提交了我的第一个拉取请求 :smile:
https://github.com/merefield/discourse-discord-bot/pull/3

4 个赞

已合并 :slight_smile: 谢谢!

4 个赞

嘿!我一直在寻找一个插件,能够根据用户在 Discourse 个人资料上的徽章,在 Discord 中为他们分配角色。你们的插件支持这个功能吗?如果不支持,这功能本身可行吗?谢谢!

2 个赞

目前还不行,但您完全可以 fork 这个项目,并添加一个合适的命令来实现该功能!

如果实现得当,我会考虑合并您的 Pull Request。不过,这可能过于特定,不太适合通用场景,因为您大概需要维护某种映射关系,除非徽章名称与角色名称完全一致?无论如何,您可能需要过滤掉其中大部分内容?这对于通用场景来说可能会变得混乱。如果您能找到一种非常简洁的通用管理方案,适用于该插件的普通用户,请随时告诉我。

不过,请随意 fork,尽情发挥!

2 个赞

我很想看看是否可行。那会让我对这个插件更感兴趣。:smiley:

1 个赞

只是一个小问题:每次想要更新角色时,我们必须手动运行 !discsync 吗,还是它是自动的?

2 个赞

不幸的是,确实如此。添加一个“在 x 小时后重复”的参数或许是一个不错的改进(欢迎提交 PR,或者可以雇佣我来实现),但正如我此前在该主题中提到的,更好的方案是由某人基于其 API 开发一个新插件,并创建一些计划性的 Sidekiq 任务来执行该功能。机器人是一个有趣的解决方案,但对于计划性同步而言,并非最佳的架构选择。

2 个赞

哦,谢谢。是的,我们已经考虑过一种可能的替代方案……
我们原本想将 Discourse 群组与 Discord 角色同步,但看起来目前没有完美的解决方案。

现在我们打算通过 Webhook 制作某种机器人:当用户群组更新(或用户名变更)时,Discourse 会向自定义解决方案触发一个 Webhook,然后该方案将在 Discord 中分配相应角色。我们将继续使用 Discord OAuth 来获取服务器(guilds),并通过创建自定义的 Data Explorer 查询,利用 API 获取这些服务器信息。

流程大致如下:

  1. 用户更改群组或用户名
  2. 触发指向自定义解决方案的 Webhook
  3. 该自定义解决方案回调 Data Explorer API,执行自定义查询以获取该用户的服务器列表
  4. 根据获取到的服务器信息,调用 Discord API 更新角色
2 个赞

采用适当的批处理作业会更好,这样可以避免因一次性事件故障而导致数据完整性受损。两者都非常完美。

2 个赞

嗯,我并没有那样做……:sweat_smile:
我已经 Fork 了你的仓库,并创建了一个符合我们需求的新插件:

它基本上会自动将所有群组与 Discord 角色进行同步。当用户被添加到或从某个群组中移除时,系统会运行一个同步任务,并根据公开群组更新他们的角色。此外,我还添加了一个设置,用于标记“已验证角色”,该角色会自动分配给所有拥有 Discourse 账户的用户。同时,它还支持添加一个安全角色列表,机器人会在同步用户时忽略这些角色(例如,当你希望在服务器中设置与论坛不同的管理员和版主时非常有用)。
我还添加了一个用户名与昵称同步功能,可以强制要求用户的服务器昵称与论坛用户名保持一致。

在清理完一些细节后,我会创建一个插件主题,也许有人会觉得它有用。

7 个赞

@barreeeiroo 你的 fork 真正有趣的地方在于你巧妙地利用了 DiscourseEvents 钩子。

我曾以为这不可能实现,因为该机器人运行在独立的线程中。但正如你所发现的,我们似乎可以对事件做出反应并影响机器人的行为。因此非常感谢你,这是一个非常重要的见解,值得我们今后深入开发。

因此,我已在主仓库中开始采用这一技术,首先实现了在新帖子或主题发布时设置监控,并将这些内容公告到 Discord 的管理员频道。

目前该功能可能实用性不大,但它向其他人展示了这一概念,供他们借鉴使用。

5 个赞

好的,我已经进一步开发了该插件,并实现了双向通信的概念验证(POC):

以下是新设置:

  • 您可以在插件设置中指定一个 Discord 公告频道。
  • 现在,您可以在指定的 Discord 公告频道中输入内容,这会将您的消息发布到插件设置中指定的 Discourse 主题。
  • 您可以设置一个 Discourse 分类列表,以便当有人在某个分类中发帖或创建新主题时(两者之一或两者皆可),将内容发布到您的 Discord 公告频道。

此外,我添加了一个新文件来管理由 discordrb API 支持的 Discord 事件,其中公告逻辑是第一个示例(如果您认为对社区有通用价值,欢迎开发新功能并提交 PR)。

我还移除了app.yml 中安装 libsodium-dev 所需的更改,因为现在更新依赖项后,这已是可选的,且当前插件并不需要它(无需处理语音功能)。这将使安装过程更加简单。

9 个赞

我按照安装说明进行操作,一切都很顺利,直到重启。机器人没有加入房间,所以我检查了 /logs:

这是指 discord_bot_token 吗?它已填入,并且我已验证了该值。有什么线索吗?

3 个赞

马克,抱歉,我不知怎么错过了这个。

你找到问题了吗?

请更新并尝试新版本,然后我们再继续。

2 个赞

Discourse 团队资助的重要更新 :tada:

FEATURES: merefield · Pull Request #4 ·
merefield/discourse-discord-bot (github.com) 的新消息自动复制和历史记录复制命令

  1. 新增命令 !disccopy <消息数量> <可选目标分类名称> <可选目标主题名称>,允许您在 Discord 聊天中将 Discord 消息历史记录(在该频道中)复制到您的 Discourse 实例。这可以安全地一次性处理数千条消息(但对于如此大的数量将需要一些时间)。

  2. 自动按频道进行每条消息的聊天复制,复制到 Discourse 中任何同名的分类:如果频道名称与分类名称匹配,并且启用了此功能,它将把消息复制到 Discourse 中:
    image

  3. 对于任何从 Discord 复制到 Discourse 的消息,用户现在将正确显示,前提是该用户已通过 Discord 登录到 Discourse(因此 Discord Bot 能够匹配用户帐户)。

  4. 为许多功能添加了本地化支持。

感谢 @erlend_sh 和 Discourse 团队对这项工作的规范和赞助!! :pray:

更多机器人功能即将推出 :wink: :robot:

5 个赞

如果他们使用 Discourse 身份验证或 Discord OAuth 以外的任何身份验证登录,此插件是否会忽略他们?

1 个赞

它没有忽略它们,只是无法在另一个系统上将用户与该人匹配。因此,复制的消息将显示为来自“系统”。

2 个赞

是否支持线程?

4 个赞

还没有,克劳斯,但有可能在计划中。等待 Ruby API 更新(阻塞),然后等待支持者添加该功能。

2 个赞