多機能な Discord Bot プロジェクトです。リマインダー、ロールセレクター、メッセージピン留め、Lumacoin による独自通貨経済、モデレーションなどの機能を備えています。音声関連機能(VoiceVox 連携など)は後続フェーズで実装します。
- 固定メッセージの再掲: チャンネル下部に常時表示されるよう、ピン留め対象を複製して固定表示します。
- チンチロミニゲーム:
/chinchiroで Bot とサイコロ勝負。役判定とリプレイに対応。 - ポーカーミニゲーム:
/pokerで 5 カードポーカーをプレイし、役判定と勝敗を即座に表示します。 - Lumacoin エコノミー:
/lumacoinコマンドで残高確認・送金・デイリーボーナス受取ができ、ミニゲームでベット・配当が可能です(残高はギルド単位で管理されます)。 - 勝率補正機構: ミニゲームで連敗すると勝率が段階的に上昇し、勝利すると既定値にリセットされるフェイルセーフ付き。
- 投票システム:
/poll createで匿名投票を作成し、リアルタイムに票数と割合を集計します。 - メモ/タスク管理:
/noteと/taskコマンドでギルド内の共有メモやタスクを管理します。 - サーバー統計と設定:
/server statsや/server configでメンバー状況の把握や自動ロール設定が可能です。 - アクティビティサマリー自動化: メッセージ数や VC 滞在時間を記録し、定期レポートとリーダーボードを提供します。
- パスワード認証ロール: 管理者が共有したパスワードを入力すると、指定ロールを自動付与できます。
- Node.js 24+
- Discord.js v14
- Prisma + MySQL
- node-cron
- Docker / Docker Compose
- Kubernetes + ArgoCD(デプロイ用マニフェストを同梱)
-
依存関係をインストールします。
npm install
-
.envを作成し、Discord Bot Token や DB 接続情報を記述します。copy .env.example .env
-
Prisma クライアントを生成し、DB をマイグレーションします。
npx prisma generate npx prisma migrate dev --name init -
Bot を起動します。
npm run dev
npm run dev— nodemon + Node を使って起動します(既定)。この場合 Node は.jsを読み込みます。npm run dev:bun— Bun で直接起動します(.tsをネイティブに読み込めるため、TypeScript 実装が優先されます)。npm run dev:node— Node をts-nodeの ESM ローダー付きで起動します(.tsを Node で読み込めるようにします)。
例(PowerShell):
# Bun で起動
npm run dev:bun
bun run dev
# Node を ts-node ローダで起動
npm run dev:nodeこのプロジェクトでは pino ベースのカスタムロガーを用意し、環境に応じて出力先を自動で切り替えています。
| 環境 | デフォルト出力 | 追加設定 |
|---|---|---|
NODE_ENV=development |
pino-pretty で整形したログ |
- |
NODE_ENV=production |
構造化 JSON を標準出力へ | LOG_FILE_PATH や LOG_DISCORD_WEBHOOK_URL を指定するとファイル/Discord にも送信 |
| 変数 | 説明 | 例 |
|---|---|---|
LOG_LEVEL |
ログレベルを上書きします(未設定なら本番info/開発trace)。 |
LOG_LEVEL=debug |
LOGGER_NAME |
ログの service フィールドに使用する名前。 |
LOGGER_NAME=shiro-bot-staging |
LOG_FILE_PATH |
指定時、本番環境でこのパスにファイル出力を追加。 | LOG_FILE_PATH=/var/log/shiro.log |
LOG_DISCORD_WEBHOOK_URL |
Discord Webhook に JSON ログを送信。設定しない限り無効。 | LOG_DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/... |
LOG_DISCORD_LEVEL |
Discord へ送るログレベルを個別に指定。 | LOG_DISCORD_LEVEL=error |
- コンテキスト付きロガーが必要な場合は
createLoggerヘルパー(src/utils/logger.js)を使ってtrace_idやuser_idなどを付けられます。 - Discord Webhook を使う場合は、上記の環境変数を Secret/SealedSecret に追加してデプロイしてください。
| コマンド | 説明 |
|---|---|
npm run dev |
開発モードで Bot を起動します(自動再起動付き)。 |
npm start |
本番モードで Bot を起動します。 |
npm run deploy:commands |
Slash Command を Discord にデプロイします。 |
npm run prisma:migrate |
Prisma のマイグレーションを実行します。 |
npm run prisma:generate |
Prisma Client を再生成します。 |
npm run prisma:studio |
Prisma Studio を起動します。 |
npm run lint |
ESLint で静的解析を実行します。 |
src/
bot/
client.js
events/
ready.js
interactionCreate.js
messageCreate.js
commands/
admin/
moderation/
utility/
services/
database/
utils/
config/
interactions/
prisma/
schema.prisma
scripts/
deploy-commands.js
現時点では自動テストは用意していません。静的解析(npm run lint)に通ることを確認してください。
| コマンド | 用途 |
|---|---|
/pin |
メッセージをチャンネルの最下部に固定/解除します。 |
/lumacoin balance / give / add / pay / daily |
Lumacoin の残高確認・送金・管理者付与・消費・デイリーボーナス受取を行います(残高はサーバーごとに独立)。 |
/chinchiro |
Bot と 1 対 1 のチンチロ勝負を行います(ベット対応)。 |
/poker |
Bot と 5 カードポーカーで勝負します(ベット対応)。役名とキッカー情報を確認できます。 |
/poll create / /poll close / /poll results |
投票の作成・締切・結果確認を行います。 |
/note add / /note list / /note delete |
ギルド共有メモを管理します。 |
/task add / /task list / /task update / /task complete |
タスクの登録・担当者設定・ステータス変更を行います。 |
/activity leaderboard |
直近のメッセージ数と VC 滞在時間のランキングを表示します。 |
/password |
管理者が設定したパスワードを入力し、ロールを取得します。 |
| コマンド | 用途 |
|---|---|
/server stats |
ギルドのメンバー統計とアクティビティ概要を表示します。 |
/server config view / /server config set |
自動ロールやログチャンネル、タイムゾーン設定を管理します。 |
/job activity enable / disable / configure / status |
アクティビティサマリーの自動配信を制御します。 |
/password-auth set / status / clear / announce |
パスワードと付与ロールの設定・確認・解除・案内メッセージ送信を行います。 |
/rolemenu など既存の管理系コマンドも継続利用できます。 |
パスワード認証の流れ:
- 管理者が
/password-auth setでパスワード・付与ロール・ヒント(任意)を登録します。 - 管理者は
/password-auth announceで指定したチャンネルに案内用の埋め込みを送信できます。ボタンを押すとモーダルが表示され、メンバーがパスワードを入力するとロールが自動付与されます。 /passwordコマンドを使った従来の入力方法も併用できます。- 正しいパスワードの場合は Bot がロールを付与し、誤りの場合はヒント(設定時のみ)を表示します。
パスワードはハッシュ化して保存されるため、Bot のログやデータベースには平文で残りません。 Slash Command を新規追加・更新した際は
npm run deploy:commandsを実行して Discord に反映してください。
グローバルコマンドとギルド限定コマンドの配信先は以下の環境変数で切り替えられます。
| 環境変数 | 既定値 | 説明 |
|---|---|---|
DEPLOY_GLOBAL |
true |
true の場合は全ワークスペースにグローバル登録します。false にするとグローバルコマンドを削除します。 |
DEPLOY_GUILD |
false |
true にすると DISCORD_GUILD_ID で指定したギルドへローカルコマンドを同期します。テスト用途でのみ有効化してください。 |
WIPE_ALL_COMMANDS |
false |
true にすると対象スコープのコマンドをすべて削除します(再登録は行われません)。緊急時以外は変更しないでください。 |
npm run deploy:commandsは既存コマンドを保持したまま、名称ベースで新規作成・更新・削除を行う差分更新方式になりました。内容に変更がないコマンドについては API リクエストを発行せず、その分だけ高速に完了します。- 強制的にすべてのコマンドを消したい場合は
WIPE_ALL_COMMANDS=trueを設定してからコマンドを実行し、必要に応じてフラグを戻して再デプロイしてください。 - グローバルコマンドの反映には最大 1 時間ほどかかる場合があります。再認証は不要なので、待機または一時的に
DEPLOY_GUILD=trueを用いたギルドコマンドで挙動を確認してください。
ローカル開発用の Dockerfile と docker-compose.yml を用意しています。MySQL コンテナと Bot コンテナをまとめて起動できます。
docker compose up --buildk8s/ 配下に Kubernetes マニフェスト、argocd/ 配下に ArgoCD Application の定義を用意しています。環境に応じて値を調整してから適用してください。
今後のロードマップ:
- VoiceVox API を用いた音声読み上げ
- 自動ロール付与の高度化
- 監視ダッシュボード