背景#
これは 2021 年 11 月から始まった物語で、その時から Stepn は多くのユーザーに人気がありました。元の会社に戻った後、最初の緊急な要件は、チームが discord コミュニティでユーザーを育成することでした。コミュニティの活性化を高めるため、いくつかのことを行う discord ボットスクリプトを作成したいと思いました。必要な機能は次のとおりです:
- ユーザーが招待した人数が m に達するたびに、そのユーザーに n の役割を与える
- 報酬の役割を得るためのクイズに参加する
- コミュニティへのアクセスの身分確認
など...
invite-tracker は役割を与えるための招待カウントを行うことができますが、重複してカウントされるという明らかな欠点があります。
困難#
このビジネス領域では、会社には経験がなく、自分で探求する必要がありました。また、適切な人材を採用することもできませんでした。幸いなことに、ボットの開発自体は複雑ではありませんでしたが、テストコードを書くことができないという最大の難点がありました。また、自分自身のサーバーサイドの開発経験も非常に不足しており、注意すべき事項がわかりませんでした。
discord ボットのデプロイプロセスは非常に簡単で、スクリプトを実行するだけで済みます。すべての ID の設定をオンラインのものに置き換えるだけです。自動化されたテストサポートがないため、スクリプトを作成した後、私自身のプライベートサーバーを作成し、ボットを招待して手動でテストするしかありません。
Cypress などの e2e フレームワークを使用してテストプランをシミュレートすることができます。ただし、discord はログイン制限が非常に厳格であり、複数回のログインにより Google reCAPTCHA の検証が必要になると、テストコードは無効になります。
Discord 自体の欠陥#
いくつかの問題は本番環境でのみ発見され、主な原因は当時の文書化の不足にあります:
- 実際の環境で実行すると、discord が提供するインタラクティブなボタンにはデバウンス制限があることがわかりました。これは良いことですが、ボタンを複数回クリックするとエラーが表示されるため、ユーザーにとっては私たちの問題です。
- ユーザー数が急増した数日間のフィードバックからわかったことですが、discord が提供する招待リンクは 1000 個しかありません。
インタラクティブなコントロールのデバウンスを制御する問題について、公式は最終的に単独で閉じました。参考の issues リンク。もしボットがそのコントロールを使用しており、ユーザーが狂ったようにクリックする可能性がある場合は、使用しない方が良いです。
招待リンクの数が制限されているため、ユーザー数の増加が制限されます。緊急対策として、スクリプトを作成しました。毎分招待リンクの数が上限に達しているかどうかをチェックします。しかし、スクリプトを使用しても、火を消すことしかできません。
再設計#
招待リンクの制限を解決するために、Discord 自体の招待ロジックを放棄し、独自に設計し直しました:
- ユニーク性を確保するために、チャンネルとコマンドを提供し、ユーザーが自分自身の招待リンクを認証できるようにしました。
- カスタマイズされた招待リンクでのみ参加したユーザーの招待回数が統計され、基準を満たすと報酬の役割が与えられます。
この方法の利点は、まず Discord 自体の制限から解放されることです。また、データに関しても完全に自己管理できます。実装後、ユーザー数の増加は 1 日数千人から数万人に増えました。
運営#
大量のユーザーグループがいるため、問題のフィードバックも多くなり、会社の運営も非常に制約されるようになりました。この問題を考慮して、運営チームにいくつかのショートカットコマンドを提供しました:
- 特定の人物が誰によって招待されたかを調べる
- 特定の人物が誰を招待したかを調べる
など...
当時、興味深い機能も作成しました。コミュニティでは、報酬の役割を獲得するためのクイズイベントが常に開催されており、誰かが勝利するたびに指定されたチャンネルで祝福を行っていました。祝福の際には面白い画像が添付されます。Jerry は、祝福の際に画像が表示され、MEME チャンネルから取得されることを希望していました。私は考えましたが、大量のメッセージデータから直接取得することは適切ではないと思いました。なぜなら、誰かが機密性の高い画像を投稿した場合に問題が発生する可能性があるためです。また、チャンネルにアップロードされた画像リンクは discord 自体が管理しているため、私は次のように提案しました:
- 管理者のリアクション行動を監視する
- 管理者が😍の絵文字を追加したメッセージは、そのメッセージに含まれる画像リンクをキャッシュする
- 祝福のたびに、ランダムに 1 つの画像リンクを選択して埋め込む
実装後、コミュニティの雰囲気は非常に楽しいものになりました。
結論#
Stepn は昨年ほど人気がありませんし、ボットもほとんど機能していません。1 年以上経過しましたが、190 万人以上のユーザー数を統計していますが、現在はほとんどのユーザーがいません。個人的には、サーバーサイドの開発経験は確かに増えましたが、私は依然としてフロントエンドに専念する傾向があります。サーバーサイドで学んだことはあまりありませんが、個人的な意見は次のとおりです:
- 機能コードよりもログの方が重要です
- 実行メモリの CRUD はデータベースの CRUD よりもはるかに高速で信頼性があります
明らかな不足点もあります:
- エンジニアリング面で最適なプラクティスを見つけることができず、全体的にアーキテクチャの組織が不足しています
- メモリ使用量の問題を解決することを考慮していませんでした(幸い、リーダーシップが私にプログラムを実行するための専用のマシンを提供してくれました)
直接的に nestjs を使用して学びながら進めることは避けたいと思っています。要件が複雑ではないため、これらの不足点はあまり明確には露呈していません。