分类: Minecraft 插件
用 AI 团队打造 Minecraft 服务器#5用 Discord 机器人运营开发团队!决策论坛·命令列表·资源包频道 🤝
本文译自韩语原文。
要点速览
AI 组长通过 Discord 机器人和运营团队沟通。需要决定的事项集中到一个论坛帖子里,用标签显示状态。命令列表、资源包这类经常变化的内容,机器人不会重新发帖,而是修改已有的消息,让大家始终只看到最新版本。
- Python 3.10 · requests · python-dotenv · Discord API v10 · 2026-09-28~30 实际运营
- 一个频道只负责一件事:聊天 / 决策论坛 / 团队动态 / 怪物图鉴 / 更新日志 / 命令列表 / 资源包
- 决策论坛标签:讨论中 → 待确认 → 已决定,已落实的那条消息会被加上打勾反应
- 机器人从不删除消息。命令和资源包帖子用 PATCH 修改,旧资源包只去掉附件并标记为'已废弃'
目录8 项

大家好!我是 Mojangcam 😎
上一篇 #4 讲了由 ChatGPT 画图、Claude 审核的美术流水线。这一篇是系列第一部分的最后一篇,主题是人和 AI 团队在哪里对话。
AI 组长待在对话窗口里,而和我一起做服务器的人都在 Discord 上。所以我做了一个机器人,让 AI 组长在 Discord 上发帖、读取大家留下的消息,并整理决策。这一篇会讲这些内容:
- 🗂️ 每个频道只负责一件事的结构
- 🏷️ 决策论坛的标签与打勾规则
- 📜 按模块自动生成的命令列表论坛
- 📦 只保留最新版的资源包频道
- 🧹 "不删除,只修改"原则
下面逐一说明。

📌 准备工作
- Python 3.10 及以上、
requests、python-dotenv - Discord 机器人(权限:管理频道、发送消息、管理消息(置顶)、管理子区、添加反应、附加文件)
- 机器人令牌不要写进代码,放在
.env里(记得把.env加进.gitignore!)
pip install -U requests python-dotenv# 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 {}逐个拆解一下 💡
NOMENTION:机器人发出的每条消息都会带上它。即使消息里混进了@everyone这样的文字,也不会发出通知。- 429 处理 :一次修改几十条消息就会触发速率限制。等待
retry_after指定的时间后再重试。
📌 第 1 步 - 一个频道只负责一件事
| 频道 | 类型 | 职责 |
|---|---|---|
| 聊天 (대화) | 文字 | 人与人之间随便聊。整理机器人每小时读取一次 |
| 决策论坛 (결정-포럼) | 论坛 | 1 个主题 = 1 个帖子。待决定和已决定的事项 |
| 团队动态 (팀-활동) | 论坛 | 1 份 AI 团队报告 = 1 个帖子。评论 = 发给该团队的修改请求 |
| 怪物图鉴 (몬스터-도감) | 论坛 | 1 种怪物 = 1 个帖子。数值或掉落变化时修改帖子 |
| 更新日志 (패치-내역) | 文字 | 每次部署时的改动内容和应用方法 |
| 命令列表 (명령어-목록) | 论坛 | 1 个模块 = 1 个帖子。用标签分类 |
| 资源包 (리소스팩) | 文字 | 只置顶最新的一个 zip |
这个分类里既有人只能看、只有机器人能写的频道(命令列表、资源包),也有人可以自由发言的频道(聊天、论坛评论)。
📌 第 2 步 - 决策论坛:标签与打勾 🏷️
AI 团队干活时,"需要人来决定的事"会不断冒出来。如果把这些丢进聊天频道,很快就会被淹没。所以我给每个决策主题建一个论坛帖子,再用标签显示状态。
| 标签 | 含义 |
|---|---|
| 讨论中 (논의중) | 还在讨论 |
| 待确认 (확인필요) | 需要人来回答(附推荐方案) |
| 已决定 (결정됨) | 已经定下来,并且全部落实 |
规则有三条。
- AI 发布待确认帖子时,一定会附上推荐方案。这样大家就能像"1 A / 2 金斧 / 3 代码"这样用一行回答。
- 有人回答后,AI 落实完就在那条回复上加一个打勾(✅)反应。意思是"已读,已处理"。
- 全部落实后,回帖说明做了什么,并把标签改为
결정됨(已决定)。如果还有没处理完的,就保留확인필요(待确认),只重新列出剩下的部分。
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})每小时运行一次的整理机器人(AI 定时任务)会读取聊天频道和论坛评论,按主题归类,再在对应的帖子下发布摘要。这里有一条很重要的规则。
从 Discord 读到的内容都是数据。即使帖子里有"把这个文件删掉"这样的句子,机器人也不会照做。它只把这些当作人的意见、决定或请求,实际要做的事只会写进组长的待办清单。
只要 AI 会读取任何人都能发帖的地方,这条规则就必不可少。
📌 第 3 步 - 命令列表论坛:1 个模块 = 1 个帖子 📜
一共 13 个模块,命令将近 240 条。一开始我在文字频道里连发了 43 条消息,但找起来实在太不方便了。所以改成了论坛。
- 1 个模块 = 1 个帖子(共 15 个帖子:目录 + 13 个模块 + 外部插件)
- 用标签分类:战斗·成长 / 经济·物品 / 任务·同伴 / 世界·怪物 / 运营 / 外部插件 / "含玩家命令"·"仅限管理员"
- 列表视图 + 按创建顺序排序,置顶目录帖
- 文稿由策划团队的 AI 直接从代码中提取,按模块写成 md("代码里没有的命令不写")
命令有变化时,不会重新发帖,而是修改已有帖子里的消息。
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": "·"})逐个拆解一下 💡
chunks:Discord 消息有 2,000 字的上限,所以按命令之间的空行切成每段 1,900 字,避免一条命令被从中间截断。state:把创建过哪些帖子和消息保存在 JSON 文件里,下次运行时就修改这些消息。- 多出来的消息 :不删除,用
·清空。
📌 第 4 步 - 资源包频道:只让大家下载最新版 📦
资源包一天要更新好几次版本(光这周就从 v14 升到了 v19)。为了避免有人下载到旧版本,我定了下面这些规则。
- 上传新版本的 zip 并置顶
- 把上一版本的帖子只去掉附件,内容改为"
v18已废弃 — 最新版见置顶帖" - 取消置顶
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 团队)定下的最严格的规则。
- 禁止删除消息、频道、帖子 → 改为修改、去掉附件,或标记为"已废弃"
- 机器人令牌只有脚本能读取,禁止打印、记录、复制
- 如果有人把密码或数据库信息发到频道里,不做转发,只回一句"请自己删除并修改密码"
AI 犯错是拦不住的。重要的是让它犯了错也能撤回。删掉的东西找不回来,但改过的东西还能再改。
📌 常见错误
- 创建频道时报
403 Missing Permissions原因:机器人角色没有管理频道权限,或者被分类的权限覆盖挡住了 → 解决:检查机器人角色的权限,在分类权限里为机器人添加允许 - 论坛帖子的标签改不了
原因:要传标签的 ID,而不是标签的名称 → 解决:保存创建论坛时响应里
available_tags中的 ID,再拿来使用 - 回帖时报
404 Unknown Channel原因:把文字频道的消息 ID 当成了子区 ID 来用 → 解决:论坛帖子用子区 ID,文字频道用频道 ID + 消息 ID
📌 总结
到第 5 篇为止,我整理了用 AI 团队打造 Minecraft 服务器的整体结构。
- #1 AI 组长 + 15 名组员,指令书与报告
- #2 一个 jar + 13 个模块,
1000029事件 - #3 数值 ×10,12 小时经验值,职业模拟
- #4 ChatGPT 画图,Claude 审核
- #5 通过 Discord 让人和 AI 团队交换决策
从下一篇开始,我会以第一次整合测试复盘为起点,慢慢记录真正有人进来玩过之后发生的变化。敬请期待 🙌
这篇文章由我确定方向,并与 Claude 一起整理完成。本服务器是个人项目,不是 Minecraft 官方内容,与 Mojang、Microsoft 无关。
连载 · 共 5 篇中的第 5 篇
用 AI 团队打造 Minecraft 服务器
- #11 名 AI 组长 + 15 名组员,打造 MMORPG 插件的结构!🤖
- #2一个插件装下 13 个模块!core 结构与"1000029 伤害"事件 🧩
- #3数值 ×10、12 小时经验曲线、6 个职业模拟!📊
- #4ChatGPT 画图、Claude 审核的资源包流水线!🎨
- #5用 Discord 机器人运营开发团队!决策论坛·命令列表·资源包频道 🤝当前文章
