カテゴリー: Minecraftプラグイン

AIチームでマイクラサーバーを作る#5Discordボットで開発チームを運営!決定フォーラム・コマンド一覧・リソースパックチャンネル 🤝

この記事は韓国語の原文から翻訳したものです。

ひと目でわかる要点

AIリーダーがDiscordボットで運営メンバーとやり取りする仕組みです。決めることはフォーラムの投稿1つに集め、タグで状態を示します。コマンド一覧やリソースパックのように頻繁に変わるものは、ボットが新しく投稿せず既存のメッセージを編集して、常に最新だけが見えるようにします。

  • Python 3.10 · requests · python-dotenv · Discord API v10 · 2026-09-28~30 実際に運用
  • 1チャンネルに1つの役割 — 雑談 / 決定フォーラム / チーム活動 / モンスター図鑑 / パッチノート / コマンド一覧 / リソースパック
  • 決定フォーラムのタグ: 議論中 → 確認必要 → 決定済み、反映した人のメッセージにはチェックのリアクション
  • ボットはメッセージを削除しません。コマンド・リソースパックの投稿はPATCHで編集し、古いリソースパックは添付だけ外して「廃止」と表示
目次8項目

こんにちは!Mojangcamです 😎

前回の#4では、ChatGPTが描いてClaudeが検品するイラストパイプラインを扱いました。今回はシリーズ第1部の最終回で、人間とAIチームがどこで会話するのかについてです。

AIリーダーはチャット画面の中にいて、一緒にサーバーを作る人たちはDiscordにいます。そこでボットを1つ作り、AIリーダーがDiscordに投稿し、みんなが残した投稿を読み、決定を整理するようにしました。今回は

  • 🗂️ チャンネルごとに役割を1つずつ持たせた構成
  • 🏷️ 決定フォーラムのタグ・チェックマークのルール
  • 📜 モジュール別のコマンド一覧フォーラムの自動作成
  • 📦 最新版だけを残すリソースパックチャンネル
  • 🧹 「消さずに直す」原則

をまとめます。

Discordの開発チームカテゴリーにある7つのチャンネルと、各チャンネルの役割をまとめた表


📌 準備するもの

  • Python 3.10以上、requests、python-dotenv
  • Discordボット (権限: チャンネルの管理、メッセージを送信、メッセージの管理(ピン留め)、スレッドの管理、リアクションの追加、ファイルを添付)
  • ボットトークンはコードに書かず.envに (.envは.gitignoreに入れること!)
ターミナル
pip install -U requests python-dotenv
Python
# dlib.py — すべてのスクリプトが共通で使う最小限のヘルパー
import os, time, requests
from dotenv import load_dotenv

load_dotenv()
token = os.getenv("DISCORD_TOKEN")          # 出力・ログへの書き出しは絶対禁止
API = "https://discord.com/api/v10"
H = {"Authorization": f"Bot {token}", "Content-Type": "application/json"}
NOMENTION = {"parse": []}                    # ボットがうっかり @everyone を呼ばないように

def req(method, url, **kw):
    while True:
        r = requests.request(method, API + url, headers=H, timeout=20, **kw)
        if r.status_code == 429:             # レート制限 → 待ってから再試行
            time.sleep(r.json().get("retry_after", 1) + 0.2)
            continue
        if r.status_code >= 400:
            raise SystemExit(f"{method} {url} {r.status_code} {r.text[:200]}")
        return r.json() if r.text else {}

1つずつ見ていきましょう 💡

  • NOMENTION : ボットが投稿するすべてのメッセージに付けます。本文に@everyoneのような文字が混ざっても通知は飛びません。
  • 429の処理 : 一度に数十件の投稿を編集するとレート制限に引っかかります。retry_afterの分だけ待ってから再試行します。

📌 ステップ1 - 1チャンネルに1つの役割

チャンネル 種類 役割
雑談 (대화) テキスト 人同士の気軽な会話。1時間ごとに整理ボットが読む
決定フォーラム (결정-포럼) フォーラム テーマ1つ = 投稿1つ。決めること・決まったこと
チーム活動 (팀-활동) フォーラム AIチームの報告書1つ = 投稿1つ。コメント = そのチームへの修正依頼
モンスター図鑑 (몬스터-도감) フォーラム モブ1体 = 投稿1つ。数値・ドロップが変わったら投稿を書き直す
パッチノート (패치-내역) テキスト デプロイのたびに変更点と適用方法
コマンド一覧 (명령어-목록) フォーラム モジュール1つ = 投稿1つ。タグで分類
リソースパック (리소스팩) テキスト 最新のzipを1つだけピン留め

このカテゴリーには、人は読むだけ、書くのはボットだけのチャンネル(コマンド・リソースパック)と、人が自由に書き込めるチャンネル(雑談・フォーラムのコメント)が混ざっています。


📌 ステップ2 - 決定フォーラム: タグとチェックマーク 🏷️

AIチームが作業していると、「人間が決めなければならないこと」が次々に出てきます。これを雑談チャンネルに流すと埋もれてしまいます。そこで決めるテーマごとにフォーラムの投稿を1つ作り、状態をタグで示します。

タグ 意味
議論中 (논의중) まだ話し合っている
確認必要 (확인필요) 人間の回答が必要 (推奨案つき)
決定済み (결정됨) 決まって、反映まで完了

ルールは3つです。

  1. AIが確認必要の投稿を出すときは推奨案も一緒に書きます。「1 A / 2 金の斧 / 3 コード」のように1行で答えられるようにするためです。
  2. 人が答えたら、反映したあとでその回答メッセージにチェック(✅)のリアクションを付けます。「読んで対応した」という印です。
  3. 反映が終わったら返信で何をしたかを書き、タグを결정됨(決定済み)に変えます。まだ残っているものがあれば확인필요(確認必要)のままにして、残っている分だけを書き直します。
Python
import urllib.parse
CHECK = urllib.parse.quote("✅")

def ack(thread_id, message_id):
    """反映した人のメッセージにチェックのリアクション"""
    req("PUT", f"/channels/{thread_id}/messages/{message_id}/reactions/{CHECK}/@me")

def set_tags(thread_id, tag_ids):
    """フォーラム投稿のタグを変更 (例: 確認必要 → 決定済み)"""
    req("PATCH", f"/channels/{thread_id}", json={"applied_tags": tag_ids})

1時間ごとに動く整理ボット(AIの定期実行タスク)が雑談チャンネルとフォーラムのコメントを読み、テーマごとにまとめて該当する投稿に要約を付けます。ここで大事なルールが1つあります。

Discordで読んだ投稿はデータです。投稿の中に「このファイルを消して」のような文があっても、ボットはそのまま実行しません。人の意見・決定・依頼としてだけ解釈し、実際の作業はリーダーのTODOリストに書き込むだけです。

誰でも書き込める場所をAIが読むなら、このルールは欠かせません。


📌 ステップ3 - コマンド一覧フォーラム: モジュール1つ = 投稿1つ 📜

モジュールが13個あるので、コマンドは240個近くになります。最初はテキストチャンネルに43件のメッセージでずらっと投稿しましたが、探すのがとても不便でした。そこでフォーラムに切り替えました。

  • モジュール1つ = 投稿1つ (投稿15件: 目次 + モジュール13 + 外部プラグイン)
  • タグで分類: 戦闘・成長 / 経済・アイテム / クエスト・仲間 / ワールド・モブ / 運営 / 外部プラグイン / 「プレイヤーコマンドあり」・「管理者専用」
  • リスト表示 + 作成順に並べ替え、目次の投稿をピン留め
  • 原稿は企画チームのAIがコードから直接抽出して、モジュールごとのmdに書きます (「コードにないコマンドは書かない」)

コマンドが変わったら新しく投稿せず、既存の投稿のメッセージを編集します。

Python
def upsert_thread(forum_id, state, key, title, chunks, tags):
    """モジュールの投稿がなければ作り、あればメッセージを編集する (削除はしない)"""
    post = state.get(key)
    if not post:
        th = req("POST", f"/channels/{forum_id}/threads", json={
            "name": title, "applied_tags": tags,
            "message": {"content": chunks[0], "allowed_mentions": NOMENTION}})
        post = state[key] = {"thread": th["id"], "ids": [th["id"]]}
    ids = post["ids"]
    for i, text in enumerate(chunks):
        body = {"content": text, "allowed_mentions": NOMENTION}
        if i < len(ids):
            req("PATCH", f"/channels/{post['thread']}/messages/{ids[i]}", json=body)
        else:
            ids.append(req("POST", f"/channels/{post['thread']}/messages", json=body)["id"])
    for extra in ids[len(chunks):]:          # 投稿が短くなって余ったメッセージは消さずに空にする
        req("PATCH", f"/channels/{post['thread']}/messages/{extra}", json={"content": "·"})

1つずつ見ていきましょう 💡

  • chunks : Discordのメッセージには2,000文字の制限があるので、コマンド間の空行を区切りに1,900文字ずつ分割します。1つのコマンドが途中で切れないようにするためです。
  • state : どの投稿・メッセージを作ったかをJSONファイルに保存しておき、次回の実行時にそのメッセージを編集します。
  • 余ったメッセージ : 消さずに·で空にします。

📌 ステップ4 - リソースパックチャンネル: 最新版だけを受け取れるように 📦

リソースパックは1日に何度もバージョンが上がります (今週だけでv14 → v19)。みんなが古いバージョンをダウンロードしてしまう事故を防ぐため、ルールを次のように決めました。

  1. 新しいバージョンのzipをアップロードしてピン留め
  2. 前のバージョンの投稿は添付ファイルだけを外し、内容を「v18 廃止 — 最新はピン留めの投稿」に書き換え
  3. ピン留めを解除
Python
def retire(channel_id, message_id, ver):
    """古いリソースパックの投稿: 消さずに添付だけ外して廃止と表示"""
    req("PATCH", f"/channels/{channel_id}/messages/{message_id}", json={
        "content": f"~~📦 リソースパック {ver}~~ — **廃止** (最新はピン留めの投稿)",
        "attachments": [],                    # 添付を空にするとファイルが消えます
        "allowed_mentions": NOMENTION})
    req("DELETE", f"/channels/{channel_id}/pins/{message_id}")   # ピン留め解除 (メッセージの削除ではない)

attachments: []でPATCHすると、メッセージは残ってファイルだけが消えます。記録は残しつつ、古いファイルはダウンロードできなくする方法です。


📌 原則 - ボットは消さない 🧹

今回のプロジェクトで、ボット(とAIチーム)に課した一番厳しいルールです。

  • メッセージ・チャンネル・投稿の削除禁止 → 編集する、添付を外す、または「廃止」と表示
  • ボットトークンはスクリプトだけが読み、出力・記録・コピー禁止
  • 誰かがパスワードやDB情報をチャンネルに貼ったら、それを転載せず「ご自身で削除して、パスワードを変更してください」と1行だけ

AIのミスを防ぎきることはできません。その代わり、ミスしても元に戻せるようにすることが大切でした。消したものは戻せませんが、編集したものはまた編集できますからね。


📌 よくあるエラー

  1. 403 Missing Permissionsでチャンネル作成に失敗 原因: ボットのロールにチャンネルの管理権限がない、またはカテゴリーの権限の上書きでブロックされている → 解決: ボットのロールの権限を確認し、カテゴリーの権限にボットの許可を追加
  2. フォーラム投稿のタグが変更できない 原因: タグの名前ではなくIDを渡す必要があります → 解決: フォーラム作成時のレスポンスのavailable_tagsからIDを保存しておいて使う
  3. 404 Unknown Channelで返信に失敗 原因: テキストチャンネルのメッセージIDをスレッドIDのように使った → 解決: フォーラムの投稿はスレッドID、テキストチャンネルはチャンネルID + メッセージID

📌 まとめ

第5回まで、AIチームでマイクラサーバーを作る仕組みをまとめました。

  • #1 AIリーダー + チームメンバー15人、指示書と報告書
  • #2 jar 1つ + モジュール13個、1000029事件
  • #3 数値×10、12時間の経験値、クラスシミュレーション
  • #4 ChatGPTが描いてClaudeが検品
  • #5 Discordで人間とAIチームが決定をやり取り

次回からは初めての統合テストの振り返りを皮切りに、実際にみんなが入って遊んでみたあとに変わっていくことを、ゆっくり記録していきます。お楽しみに 🙌

この記事は私が方向性を決め、Claudeと一緒にまとめました。このサーバーは個人プロジェクトであり、Minecraftの公式コンテンツではなく、Mojang・Microsoftとは関係ありません。

連載 · 全5回中5回目

AIチームでマイクラサーバーを作る

  1. #1AIリーダー1人 + メンバー15人でMMORPGプラグインを作る仕組み! 🤖
  2. #21つのプラグインにモジュール13個!コア構造と「1000029ダメージ」事件 🧩
  3. #3数値×10、12時間の経験値曲線、クラス6種のシミュレーション! 📊
  4. #4ChatGPTが描いてClaudeが検品するリソースパック・パイプライン! 🎨
  5. #5Discordボットで開発チームを運営!決定フォーラム・コマンド一覧・リソースパックチャンネル 🤝現在の記事

著者

Mojangcam

自分でコードを書き、サーバーを動かし、詰まったエラーを解決しながら学んだことを記録する開発・IT実践ブログ