Alex-Programer

Alex-Programer

随缘博客,不定期更新不确定的内容~
github
twitter

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 邊撸邊學,感覺太重。不過好在需求不複雜,沒讓我的這些不足體暴露太明顯。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。