深夜テンションの開発室公式DiscordBot用のレポです。
Python 3.13 向けの Discord Bot です。以下をまとめて実装しています。
- しりとり
- 実績管理
- ロール管理
- イベント管理
- Lavalink ベースの音楽再生
- AI チャットとモデル切り替え
- メッセージログ保存と会話要約
Ducky検知時の警告- 自己紹介チャンネルの自動リアクション
- VC 発狂検知とクリップ送信
- サーバー通貨とロール購入
- カジノ機能
- 自由編集できる検知トリガー
- Python 3.13 を使います。
- 依存関係を入れます。
py -3.13 -m pip install -e ..env.exampleを参考に.envを作成し、DISCORD_TOKENを設定します。- AI 機能を使う場合は
AI_BASE_URLを設定します。 OpenAI 互換 API を想定しているため、OpenAI / OpenRouter / LM Studio / vLLM などでも使えます。 API キー不要のローカル推論サーバー以外ではAI_API_KEYも設定してください。 AI の選択肢はgemini/gpt-oss:20b/gemma3:27bの 3 種類です。 実APIモデル名を変えたい場合はAI_MODEL_GEMINI/AI_MODEL_GPT_OSS_20B/AI_MODEL_GEMMA3_27Bを編集してください。 - 音楽機能を使う場合は、別途 Lavalink サーバーを起動して
LAVALINK_HOST/LAVALINK_PORT/LAVALINK_PASSWORDを設定します。 - Bot を起動します。
py -3.13 -m gr3nja_discord_botMessage Content IntentServer Members IntentVoice States
接頭辞は既定で ! です。
/ai ... は slash command、!ai ... は prefix command として使えます。
!shiritori start!shiritori stop!shiritori status!shiritori ranking
ひらがな・カタカナ前提です。漢字の読み推定までは行いません。
!achievement catalog!achievement list [@member]!achievement leaderboard!achievement create <points> <icon> 名前 | 説明!achievement grant @member <id>
!money [@member]!daily!role allow @Role!role disallow @Role!role toggle @Role!shop currency 通貨名!shop add @Role <price> [description]!shop list!shop buy @Role
!event create <YYYY-MM-DDTHH:MM> <reward> <max> タイトル | 説明!event list!event info <id>!event join <id>!event leave <id>!event cancel <id>!event complete <id>
!highlow <bet> <high|low>!blackjack <bet>!blackjack hit!blackjack stand!hangman <bet>!hangman guess <letter|word>!videopoker <bet>!videopoker hold 1 3 5!videopoker draw
!play <keyword|url>!stop
!play はキーワード検索または URL 再生に対応します。
再生中に !play を実行するとキューへ追加します。
/ai chat <message>/ai model [modelname]!ai chat <message>!ai model [modelname]
/summary recent [count]!summary recent [count]
現在のチャンネルの直近メッセージを要約します。 要約結果には、会話の流れ、主な話題、その話題を最初に出した人、決まったこと、未解決事項を含めます。
/ai model はモデル名を省略すると現在値を表示します。
指定できるモデルは gemini / gpt-oss:20b / gemma3:27b だけです。
モデル変更はサーバー管理権限が必要です。
会話履歴は「サーバー・チャンネル・ユーザー」単位で保持されます。
!trigger add <contains|exact|startswith|endswith|regex> キーワード | レスポンス!trigger list!trigger remove <id>
!config intro #channel 🤝!voice channel #clips!voice watch [threshold]!voice stop!voice status
Ducky を含むメッセージには 焼き鳥に修正してください と返信します。
- Bot が対象 VC に参加している必要があります。
!voice watchで監視開始します。 - Discord 側の音声受信拡張を使います。
- Python 3.13 では
audioopが削除されているため、依存にaudioop-ltsを含めています。 - クリップ送信先は
!voice channelで変更できます。
- 音楽再生は Lavalink を利用します。Bot 本体とは別に Lavalink サーバーが必要です。
- キーワード検索は
MUSIC_DEFAULT_SEARCHで切り替えられます。既定値はytsearchです。 - キューが空になると
MUSIC_IDLE_DISCONNECT_SECONDS後に自動切断します。 - 既に VC 監視が動作中のサーバーで
!playを使うと、先に VC 監視を停止してから音楽再生へ切り替えます。
Lavalink 公式ドキュメントどおり、Docker で別コンテナとして起動できます。最低限 SERVER_PORT と LAVALINK_SERVER_PASSWORD を合わせて、Bot 側の .env に同じ接続情報を設定してください。
services:
lavalink:
image: ghcr.io/lavalink-devs/lavalink:4-alpine
restart: unless-stopped
environment:
- SERVER_PORT=2333
- LAVALINK_SERVER_PASSWORD=youshallnotpass
ports:
- "2333:2333"/ai chatは OpenAI 互換のchat/completionsAPI を利用します。- 選択できる AI は
Gemini/gpt-oss:20b/Gemma3:27bの 3 種類です。 .envのAI_DEFAULT_MODELをサーバー既定として使い、/ai modelでギルド単位に上書きできます。- 実際に API へ送るモデル ID は
AI_MODEL_GEMINI/AI_MODEL_GPT_OSS_20B/AI_MODEL_GEMMA3_27Bで調整できます。 - slash command を使うには Bot の招待に
applications.commandsスコープが必要です。 - slash command は起動時に同期します。反映に少し時間がかかる場合は Bot を再起動してください。
- 通常メッセージは SQLite の
message_logsテーブルに保存します。Bot や prefix コマンドは要約対象から除外します。 !summary recent//summary recentは現在のチャンネルの直近ログを読み、会話の流れと主な話題を要約します。- 話題ごとに、ログ上で最初にその話題を出した人を AI に推定させて出力します。
- 保存済みログが少ない場合は、
SUMMARY_ENABLE_HISTORY_BACKFILL=trueなら Discord のチャンネル履歴を読んで補完します。 - 保存ログの保持日数は
SUMMARY_LOG_RETENTION_DAYSで調整できます。