作品一覧へ戻る

05 / PROJECT DETAIL

Discord Recruitment Bot

実運用しているBotから、公開配布に必要な8コマンドを独立させ、サーバー間のデータ分離と最小権限をテストで固定したDiscord.js製の募集・日程調整Botです。

技術スタック

  • Node.js 24
  • JavaScript
  • Discord.js 14
  • Docker Compose
  • GitHub Actions
  • IGDB API

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のホスト操作は公開版の責務に含めない
作品一覧へ戻る