作品一覧へ戻る 作品一覧へ戻る
05 / PROJECT DETAIL
Discord Recruitment Bot
実運用しているBotから、公開配布に必要な8コマンドを独立させ、サーバー間のデータ分離と最小権限をテストで固定したDiscord.js製の募集・日程調整Botです。
技術スタック
01
解きたかったこと
ゲームの参加者募集、イベントの日程調整、勉強会や作業会の呼びかけを、外部サイトへ移動せずDiscordの中で完結できるようにしました。一つのコミュニティ専用ではなく、導入した各サーバーが自分たちの募集だけを安全に管理できる公開Botとして整理しています。
02
構成
- 募集、参加、締切、一覧、日程調整、通知、テンプレート、統計を8つのスラッシュコマンドとして提供
- 募集・投票・テンプレート・設定をサーバーIDに結び付けたJSONストアへ保存
- ゲーム募集では任意でIGDB APIと連携し、候補検索とゲーム情報表示を補助
- Docker Composeでは外向き通信だけを使い、公開ポートやホスト制御を追加しない
03
設計と工夫
- DiscordのGuild InstallとGuild Contextだけを許可し、特権Intentを使わない最小権限構成
- ボタン操作と保存データのサーバーIDを毎回照合し、別サーバーの募集を参照・変更できない境界を実装
- トークンやClient IDはリポジトリへ置かず、入力長、Markdown、メンションを制限して意図しない通知を抑制
- 日本語の日付、全角数字、タイムゾーンを扱い、締切や開催前のリマインダーを自動送信
04
検証
- 20のテストファイルでコマンド、ボタン、日付解釈、永続化、サーバー間分離、通知処理を検証
- テスト時のカバレッジは行89.92%、分岐83.08%、関数89.21%を確認
- npm audit、Gitleaks、Docker buildを通し、GitHub Actionsで同じ品質ゲートを継続実行
- 公開リポジトリには実運用のトークン、ID、ログ、募集データ、ホスト制御を含めない
05
制約と次の一手
- JSONストアは単一プロセス向けで、大規模運用や複数インスタンス化にはデータベースへの移行が必要
- リマインダーはbest effortで、送信直前の障害など狭い条件では重複する可能性がある
- 利用にはDiscordアプリとBotトークンが必要で、ゲーム検索を使う場合だけIGDB認証情報も用意する
- 音声読み上げ、ホームラボ固有機能、Sub-PCのホスト操作は公開版の責務に含めない