Discord - Stepn 社区机器人起源

背景

这是从 21 年 11 月开始的故事，那个时候 Stepn 开始受到很多用户的青睐。回到老东家后临危受命的第一个紧要需求，就是团队计划在 discord 社区来发展用户，为了提高社区的活跃度，希望做一个 discord 机器人脚本来做一些事情。大概需要的功能有：

每当用户邀请的人数达到 m，就赋予这个用户一个 n 角色

抢答以获取奖励角色

进入社区的身份验证
等等...

invite-tracker 虽然可以做到邀请计数再赋予角色的功能。但是它有一个明显的缺陷，就是会重复统计。

困难

在这个业务方向公司并没有任何经验积累，需要自行探索，而且想招对口的人也招不到。好在 bot 开发本身的逻辑并不复杂，特别是在有了经验之后。但是最大的难点还是在于不能写测试代码，另外自己在服务端的开发经验又极度欠缺，不知道有哪些事情是需要注意的。

discord bot 的上线过程很简单，就是把脚本跑起来就行了，各种 id 的配置全换成线上的就行，由于没有自动化测试支持，只能在脚本写好后，自己创建一个私有的 server，然后把机器人邀请进去人为测试。

测试方案可以用 Cypress 之类的 e2e 框架来模拟。但是 discord 对登录限制得很严格，如果多次登录导致需要做 google recaptcha 验证，那测试代码就废了。

Discord 自身的缺陷

有几个问题都是在线上才发现的，主要原因在于当时缺少文档说明：

在真实环境里运行才知道，discord 提供的可交互按钮，有 debouce 限制，这是好事，但糟糕的是这个按钮在多次点击后会显示报错，对用户来说那就是我们的问题了。

在用户量暴涨的几天里经用户反馈才知道，discord 提供的邀请链接只有 1 千个。

关于控制交互控件 debouce 的问题， 官方最后单方面关闭了，参考 issues 链接。如果你的机器人用到了它的控件，并且你的用户可能疯狂的点击，最好别用。

邀请链接数量受限，也就意味着用户量涨幅被限制了。为了应急，写了一个脚本。每分钟去检查邀请链接的数量是否达到了上限。可是即便用脚本来清，也只能解燃眉之急。

重新设计

为了解决邀请链接受限的问题，只好放弃基于 Discord 自身的邀请逻辑，自己重新设计：

为了确保唯一性，提供了一个频道和一个指令，让用户自己去认领自己的邀请链接。

只有通过定制化的邀请链接进来的用户，才会统计邀请次数，达标时以获得奖励角色。

这样做的好处首先是摆脱了 Discord 自身的限制，同时数据方面可以完全自理。落地后经观察发现，用户量的涨幅从每天几千到了每天几万。

运营

有了大量的用户群体，就有了更多反馈问题的人，公司运营也会非常受限。顾虑到这个问题，我为运营同事提供了一些快捷指令：

查某个人是被谁邀请进来的

查某个人邀请了哪些人

等等...

当时还做了一个有趣的功能。社区一直有一个抢答送奖励角色的活动，每当有人获胜时我们会在指定的频道来为这个人庆祝。庆祝的时候会携带一张有趣的图片；Jerry 希望图片可以在庆祝的时候出现，并且从 MEME 频道获取。我想了想，直接从大量的消息数据里面爬取不太合适，因为要是有人发了一些敏感的图片就不好了，加之上传到频道里的图片链接，是 discord 自己维护的，所以我提出：

监听管理员的 reaction 行为

只要是管理员添加了 😍 表情的消息，就把这个消息里携带的图片链接缓存下来

每次庆祝的时候，就随机抽取一个图片链接嵌入过去

落地后的社区氛围其乐融融。

总结

Stepn 不再像去年那样火爆了，机器人还在跑的功能也没几个了。一年多过去虽然统计到的用户量有 190 万 +，但目前还在的用户不多了。于我个人来说，服务端开发的经验肯定是见长了，但我还是更倾向于深耕前端。对于服务端学到的东西并不多，个人浅见：

日志大于功能代码

运行内存的 CRUD 比数据库的 CRUD 快很多，更可靠

不足的也很明显：

工程化上自己没能探索出最佳实践，整体缺乏架构组织

没有考虑解决内存占用的问题（幸好领导阔绰单独给我一台机器跑程序）

不想直接硬着头皮上 nestjs 边撸边学，感觉太重。不过好在需求不复杂，没让我的这些不足体暴露太明显。