ダンジョンコントローラー — DiscordでTRPGセッション管理するBot

Tool

概要

DungeonControllerは、Discord上でTRPGやロールプレイのセッション、キャンペーン、ユーザー、キャラクターを作成・変更・管理することを目的としたBotです。TypeScriptで実装され、Bunをランタイム兼パッケージマネージャとして利用する設計になっています。リポジトリはコマンド単位で機能を分割する典型的なボット構成を採り、スラッシュコマンドの登録や環境変数の管理(DISCORD_BOT_TOKEN、CLIENT_ID、GUILD_ID)を前提としたシンプルなワークフローが用意されています。

GitHub

リポジトリの統計情報

  • スター数: 1
  • フォーク数: 0
  • ウォッチャー数: 1
  • コミット数: 5
  • ファイル数: 11
  • メインの言語: TypeScript

主な特徴

  • Bunを利用した軽量で高速な開発フロー(bun install / bun dev / bun lint)
  • コマンド単位で分離された設計(commandsディレクトリ)
  • 環境変数でBotトークン・クライアントID・ギルドIDを指定する仕組み
  • TypeScriptによる型安全な実装とlint整備

技術的なポイント

このプロジェクトの注目点は、Bunをランタイムに採用している点と、コマンド駆動のアーキテクチャです。Bunは起動が速く依存管理が軽量なため、ローカル開発や頻繁な再起動を伴うBot開発でメリットがあります。リポジトリ構成からは、Slash Command登録(CLIENT_ID、GUILD_IDを利用)やインタラクション処理を行う設計が想定され、commandsディレクトリに機能ごとのファイルを配置することで拡張しやすくしています。TypeScript採用によりコマンド引数やレスポンスの型安全性を確保でき、lintスクリプトがあることでコード品質の維持が容易です。永続化層はリポジトリ内に見当たりませんが、キャンペーンやキャラクターのデータ保存には外部データベース(SQLite / PostgreSQL / MongoDBなど)やクラウドストレージを組み合わせる余地があります。運用面では、Botトークン管理、権限設定、スラッシュコマンドのスコープ管理(グローバル vs ギルド)に注意が必要です。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitignore: file
  • LICENSE: file
  • README.md: file
  • bun.lock: file
  • commands: dir
  • package.json (相当の設定): file(実体はbun環境に依存)
  • tsconfig.json: file(推測される)
  • .env の利用(DISCORD_BOT_TOKEN, CLIENT_ID, GUILD_ID)
  • その他 6 ファイル

(実際のファイル数はリポジトリに基づき11ファイル)

使い方(README抜粋)

  • 依存関係のインストール: bun install
  • 実行: bun dev
  • Lint: bun lint
  • .env に DISCORD_BOT_TOKEN, CLIENT_ID, GUILD_ID を配置して利用

改良提案と運用上の注意

  • 永続化: 現状は永続化レイヤが含まれていないように見えるため、セッションやキャラクター保存のためにDB導入を推奨(SQLite→小規模、Postgres→本番向け)。
  • 権限管理: コマンド実行に対するDiscordロールベースのアクセス制御を明確化することで誤操作を防止。
  • エラーハンドリングとログ: 運用時の障害対応のためにstructured logging(JSON)やSentry等の監視連携を追加。
  • デプロイ: Bunをサポートするホスティング(Fly, Railway, Docker化)を検討。Dockerイメージ化によりCI/CDでの自動デプロイが容易に。

まとめ

Bun + TypeScriptでシンプルに構成されたDiscord向けTRPGセッション管理Botの基盤。拡張性は高く、永続化と運用面を補えば実用的。

リポジトリ情報:

READMEの抜粋:

DungeonController

To install dependencies:

bun install

To run:

bun dev

To lint:

bun lint

To use:

On .env put DISCORD_BOT_TOKEN, CLIENT_ID and GUILD_ID…