物理鍵の貸出・返却を管理する Discord Bot です。ボタン/スラッシュコマンドで打刻し、Google スプレッドシートへのログ記録、Discord チャンネルへの通知、Microsoft Teams への Webhook 通知、返却期限(18:30 JST)を過ぎた際のアラートまでを自動化します。
📖 詳細なドキュメントは VitePress ドキュメントサイト を参照してください(ローカルでの閲覧方法は下記)。
- 🔓🔐 メッセージ下のボタン(鍵取り/鍵返却)またはスラッシュコマンド
/keyでワンタップ打刻 /backdateで過去(直近1週間以内)の打刻を遡り登録/backdate-fixで直近の打刻時刻を修正- 打刻内容を Google スプレッドシートに二重記録(月別の一覧シート+年別の詳細ログシート)
- 専用チャンネルへの操作ログ投稿と、常設の「現在の貸し出しステータス」メッセージの自動更新
- Microsoft Teams への Webhook 通知(任意設定)
- 返却期限(18:30 JST)超過時の自動アラート。SQLite にペンディング状態を永続化しており、プロセス再起動後も再スケジュールされる
- Go 1.26 系 / Echo v5(HTTP ルーティング)
- Discord Interactions API(Ed25519 署名検証つき Webhook エンドポイント)
- Google Sheets API(
google.golang.org/api/sheets/v4) - SQLite(
modernc.org/sqlite、CGO 不要) - Docker(マルチステージビルドで配布)
cmd/server/ エントリーポイント(main.go)
internal/config/ 環境変数からの設定読み込み
internal/discordapi/ Discord REST API クライアント・署名検証・型定義
internal/httpserver/ HTTP ルーティングと Interaction のディスパッチ
internal/keymanager/ 鍵管理機能の本体(コマンド処理・Sheets 連携・アラート・Teams通知)
internal/sqlitedb/ 共有 SQLite コネクションのオープン処理
docs/ VitePress ドキュメントサイト
- Go 1.26 以上
- Google スプレッドシートを読み書きできるサービスアカウントの認証情報(JSON キー)
- Discord Bot(Application ID / Bot Token / Public Key、および Interactions Endpoint URL の設定)
.env などで以下を設定します(ENV_FILE_PATH で指定したファイルにステータスメッセージIDが自動で追記されるため、.env は起動後も書き換えられる前提で運用してください)。
| 変数名 | 必須 | 既定値 | 説明 |
|---|---|---|---|
PORT |
- | 8080 |
HTTP サーバーの待受ポート |
DISCORD_PUBLIC_KEY |
推奨 | (空) | 署名検証用の公開鍵。未設定だと検証をスキップ(ローカル動作確認用) |
BOT_TOKEN |
✅ | - | Discord Bot トークン |
APPLICATION_ID |
✅ | - | Discord アプリケーションID |
TEAMS_WEBHOOK_URL |
- | (空) | Teams への通知を送る場合の Webhook URL |
SPREADSHEET_ID |
✅ | - | ログ記録先の Google スプレッドシートID |
KEY_BUTTON_CHANNEL_ID |
- | 固定チャンネルID | ボタン/ステータスメッセージを投稿するチャンネル |
LOG_CHANNEL_ID |
- | KEY_BUTTON_CHANNEL_ID と同じ |
操作ログ・アラートを投稿するチャンネル |
STATUS_MESSAGE_ID |
- | (空) | 常設ステータスメッセージのID(自動で永続化される) |
ENV_FILE_PATH |
- | .env |
STATUS_MESSAGE_ID を書き戻す対象ファイル |
SQLITE_DB_PATH |
- | ./data/nbc-bot.db |
アラート永続化用 SQLite ファイルのパス |
Google Sheets のサービスアカウント認証は Application Default Credentials(GOOGLE_APPLICATION_CREDENTIALS でサービスアカウントJSONを指すなど)を利用します。
go run ./cmd/server起動後、以下のエンドポイントが利用できます。
| エンドポイント | 用途 |
|---|---|
POST / |
Discord Interactions のWebhook本体(Discord Developer Portal に設定) |
POST /register-command |
/key /backdate /backdate-fix のスラッシュコマンドをグローバル登録 |
POST /send-button |
鍵取り/鍵返却ボタン付きメッセージを投稿し、ステータスメッセージも作成 |
初回セットアップ時は、デプロイ後に register-command と send-button をそれぞれ一度叩いてください。
go test ./...docker build -t nbc-bot .
docker run --rm -p 8080:8080 --env-file .env nbc-botdata/(SQLite)や Google サービスアカウントの認証情報など、永続化・シークレットが必要なファイルは適宜ボリュームマウント/環境変数で渡してください。
アーキテクチャの詳細、コマンド仕様、スプレッドシートのレイアウト、デプロイ手順などは docs/ 配下の VitePress サイトにまとめています。
npm install
npm run docs:dev # http://localhost:5173 でプレビュー
npm run docs:build # docs/.vitepress/dist に静的ビルド
npm run docs:preview # ビルド済みサイトのプレビュー