無限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
: データベーススキーマ