無限LT会を管理するDiscordボット
- LTの登録・編集・管理
- 次回発表者自動通知
- LT会開始管理
- 依存関係をインストール:
bun install- 環境変数を設定 (.envファイルを作成):
DISCORD_TOKEN=your_bot_token
ADMIN_USER_ID=your_admin_user_id
DATABASE_URL=your_database_url
...- ボットを起動:
bun run dev- コマンドを登録:
bun run register/register-lt [title] [ready] [description]- LTを登録/edit-lt- 登録済みLTを編集
/next-lt [limit]- 次回のLT発表者を通知 (管理者専用)/start-lts- LT会を開始 (管理者専用)
bun run dev- 開発モードで起動bun run register- コマンドを登録bun run delete- コマンドを削除bun run prisma-fmt- Prismaスキーマをフォーマット
- Bun v1.0 - JavaScriptランタイム (代替: Node.js)
- TypeScript v5.0 - 静的型付け言語
- Discord.js v14.17 - Discord APIクライアントライブラリ
- Prisma v6.2 - ORM (データベース操作)
- Zod v3.24 - スキーマバリデーション
graph TD
A[Discordクライアント] -->|イベント| B[イベントハンドラ]
B -->|コマンド| C[コマンドハンドラ]
B -->|ボタン| D[ボタンハンドラ]
B -->|メニュー| E[メニューハンドラ]
C --> F[サービス層]
D --> F
E --> F
F --> G[データ層]
G --> H[(データベース)]
src/
├── buttons/ # Discordボタンインタラクション処理
├── commands/ # スラッシュコマンド実装
├── eventHandlers/ # Discordイベントハンドラ
├── services/ # 主要ビジネスロジック
├── stringSelectMenus/ # セレクトメニュー処理
├── tables/ # データモデル定義 (Prismaスキーマ)
├── types/ # 型定義
id: 自動採番IDspeaker: 発表者名title: LTタイトルdescription: LT説明 (デフォルト: 空文字)state: LT状態 (UNREADY/READY/DOING/DONE)priority: 優先度 (デフォルト: 0)createdAt: 作成日時updatedAt: 更新日時notificationMessage: 通知メッセージとのリレーションnextLightningTalk: 次回LT情報とのリレーション
UNREADY: 準備未完了READY: 準備完了DOING: 発表中DONE: 発表完了
id: 自動採番IDmessageId: DiscordメッセージID (ユニーク)lightningTalk: LT情報とのリレーションlightningTalkId: LT情報ID (ユニーク)createdAt: 作成日時updatedAt: 更新日時
id: 自動採番IDlightningTalk: LT情報とのリレーションlightningTalkId: LT情報ID (ユニーク)order: 発表順序 (ユニーク)done: 発表完了フラグ (デフォルト: false)createdAt: 作成日時updatedAt: 更新日時
-
スキーマ編集:
prisma/schema.prismaを編集- モデル定義やリレーションを変更
-
マイグレーション作成:
bunx prisma migrate dev --name "変更内容の説明" -
クライアント生成:
bunx prisma generate
-
スキーマフォーマット:
bun run prisma-fmt
-
src/services/: アプリケーションビジネスロジック- Discord連携やフロー制御など、アプリケーション固有の処理
- 例: LT登録時の通知処理、状態管理
-
src/tables/: エンタープライズビジネスロジック- データベース操作 (Prismaクライアントを使用したCRUD)
- データ整合性チェックやトランザクション管理
-
prisma/: データモデル定義schema.prismaにデータベーススキーマを定義bunx prisma generateで型を自動生成
-
起動処理 (
src/index.ts):- Discordクライアントの初期化
- 環境変数の読み込み (
src/env.ts) - イベントハンドラの登録
- コマンド/ボタン/メニューの登録
-
イベント処理 (
src/eventHandlers/):clientReadyHandler.ts: ボット起動時の初期化処理interactionCreateHandler.ts: ユーザーインタラクションの振り分け- コマンド受信 → 該当コマンドへルーティング
- ボタンクリック → 該当ボタンハンドラへルーティング
- セレクトメニュー → 該当メニューハンドラへルーティング
-
コマンド処理 (
src/commands/):- スラッシュコマンドのパラメータ検証
- サービス層への処理委譲
- レスポンスの構築
-
サービス層 (
src/services/):- アプリケーション固有のビジネスロジック
- Discord APIとの連携
- データ層の呼び出し
-
データ層 (
src/tables/):- Prismaクライアントを使用したDB操作
- トランザクション管理
- データ整合性チェック
- ユーザーが
/register-ltコマンド実行 interactionCreateHandlerがコマンドを検出し、registerLTCommandにルーティングregisterLTCommand:- パラメータ検証
LTManagementService.registerLTを呼び出し
LTManagementService:- ビジネスロジック実行
lightningTalkTable.insertLTを呼び出し
lightningTalkTable:- Prismaを使用してDBにLTを登録
LTManagementService:- 登録結果を基に
LTNotificationService.notifyRegistrationを呼び出し
- 登録結果を基に
LTNotificationService:- Discordチャンネルに通知を送信
-
コマンドファイル作成:
src/commands/に新しいコマンドファイルを作成- 例:
src/commands/newCommand.ts
-
コマンド登録:
src/commands/index.tsに新しいコマンドを追加- 例:
import { newCommand } from './newCommand'; export const commands = [..., newCommand];
-
コマンド実装:
- スラッシュコマンドの定義 (name, description, options)
- 入力パラメータのパースとバリデーション
src/services/の適切なサービスを呼び出し
-
ビジネスロジック追加:
- アプリケーション層 (
src/services/):- Discord連携やフロー制御
- データ層 (
src/tables/):- 必要なデータ操作を実装
- アプリケーション層 (
-
データモデル変更:
prisma/schema.prismaを編集- マイグレーション作成とクライアント生成
-
コマンドをDiscordに反映:
bun run registerを実行してコマンドを登録
-
ボタンファイル作成:
src/buttons/に新しいボタンファイルを作成- 例:
src/buttons/newButton.ts
-
ボタン登録:
src/buttons/index.tsに新しいボタンを追加- 例:
import { newButton } from './newButton'; export const buttons = [..., newButton];
-
ボタン実装:
- ボタンインタラクションの処理を実装
src/services/の適切なサービスを呼び出し
-
メニューファイル作成:
src/stringSelectMenus/に新しいファイルを作成- 例:
src/stringSelectMenus/newMenu.ts
-
メニュー登録:
src/stringSelectMenus/index.tsに追加- 例:
import { newMenu } from './newMenu'; export const menus = [..., newMenu];
-
メニュー実装:
- 選択時の処理を実装
src/services/の適切なサービスを呼び出し
src/index.ts: エントリポイントsrc/env.ts: 環境変数管理prisma/schema.prisma: データベーススキーマ