{
"title": "Discord - Stepn 社区机器人起源",
"tags": [
"post",
"经验分享"
],
"sources": [
"xlog"
],
"external_urls": [
"https://alex-programer.xlog.app/discord-for-stepn"
],
"date_published": "2023-04-12T01:51:42.075Z",
"content": "## 背景\n\n这是从21年11月开始的故事,那个时候 Stepn 开始受到很多用户的青睐。回到老东家后临危受命的第一个紧要需求,就是团队计划在 discord 社区来发展用户,为了提高社区的活跃度,希望做一个 discord 机器人脚本来做一些事情。大概需要的功能有:\n\n* 每当用户邀请的人数达到m,就赋予这个用户一个n角色\n* 抢答以获取奖励角色\n* 进入社区的身份验证\n等等...\n\n> invite-tracker 虽然可以做到邀请计数再赋予角色的功能。但是它有一个明显的缺陷,就是会重复统计。\n\n## 困难\n\n在这个业务方向公司并没有任何经验积累,需要自行探索,而且想招对口的人也招不到。好在 bot 开发本身的逻辑并不复杂,特别是在有了经验之后。但是最大的难点还是在于不能写测试代码,另外自己在服务端的开发经验又极度欠缺,不知道有哪些事情是需要注意的。\n\ndiscord bot 的上线过程很简单,就是把脚本跑起来就行了,各种 id 的配置全换成线上的就行,由于没有自动化测试支持,只能在脚本写好后,自己创建一个私有的 server,然后把机器人邀请进去人为测试。\n\n\n> 测试方案可以用 Cypress 之类的 e2e 框架来模拟。但是 discord 对登录限制得很严格,如果多次登录导致需要做 google recaptcha 验证,那测试代码就废了。\n\n\n## Discord 自身的缺陷\n\n有几个问题都是在线上才发现的,主要原因在于当时缺少文档说明:\n* 在真实环境里运行才知道,discord 提供的可交互按钮,有 debouce 限制,这是好事,但糟糕的是这个按钮在多次点击后会显示报错,对用户来说那就是我们的问题了。\n* 在用户量暴涨的几天里经用户反馈才知道,discord 提供的邀请链接只有1千个。\n \n> 关于控制交互控件 debouce 的问题, 官方最后单方面关闭了,[参考issues链接](https://github.com/discordjs/discord.js/issues/7005)。如果你的机器人用到了它的控件,并且你的用户可能疯狂的点击,最好别用。 \n\n\n邀请链接数量受限,也就意味着用户量涨幅被限制了。为了应急,写了一个脚本。每分钟去检查邀请链接的数量是否达到了上限。可是即便用脚本来清,也只能解燃眉之急。\n\n\n## 重新设计\n\n为了解决邀请链接受限的问题,只好放弃基于 Discord 自身的邀请逻辑,自己重新设计:\n- 为了确保唯一性,提供了一个频道和一个指令,让用户自己去认领自己的邀请链接。\n- 只有通过定制化的邀请链接进来的用户,才会统计邀请次数,达标时以获得奖励角色。\n\n这样做的好处首先是摆脱了 Discord 自身的限制,同时数据方面可以完全自理。落地后经观察发现,用户量的涨幅从每天几千到了每天几万。\n\n## 运营\n\n有了大量的用户群体,就有了更多反馈问题的人,公司运营也会非常受限。顾虑到这个问题,我为运营同事提供了一些快捷指令:\n\n- 查某个人是被谁邀请进来的\n- 查某个人邀请了哪些人\n\n等等...\n\n当时还做了一个有趣的功能。社区一直有一个抢答送奖励角色的活动,每当有人获胜时我们会在指定的频道来为这个人庆祝。庆祝的时候会携带一张有趣的图片;Jerry 希望图片可以在庆祝的时候出现,并且从 MEME 频道获取。我想了想,直接从大量的消息数据里面爬取不太合适,因为要是有人发了一些敏感的图片就不好了,加之上传到频道里的图片链接,是 discord 自己维护的,所以我提出:\n\n- 监听管理员的 reaction 行为\n- 只要是管理员添加了 😍 表情的消息,就把这个消息里携带的图片链接缓存下来\n- 每次庆祝的时候,就随机抽取一个图片链接嵌入过去\n\n落地后的社区氛围其乐融融。\n\n\n## 总结\n\nStepn 不再像去年那样火爆了,机器人还在跑的功能也没几个了。一年多过去虽然统计到的用户量有 190万+,但目前还在的用户不多了。于我个人来说,服务端开发的经验肯定是见长了,但我还是更倾向于深耕前端。对于服务端学到的东西并不多,个人浅见:\n\n- 日志大于功能代码\n- 运行内存的CRUD比数据库的CRUD快很多,更可靠\n\n不足的也很明显:\n- 工程化上自己没能探索出最佳实践,整体缺乏架构组织\n- 没有考虑解决内存占用的问题(幸好领导阔绰单独给我一台机器跑程序)\n\n不想直接硬着头皮上 nestjs 边撸边学,感觉太重。不过好在需求不复杂,没让我的这些不足体暴露太明显。\n ",
"attributes": [
{
"value": "discord-for-stepn",
"trait_type": "xlog_slug"
}
]
}