카테고리: 마인크래프트 플러그인

AI 팀으로 마크 서버 만들기#5디스코드 봇으로 개발팀 운영하기! 결정 포럼·명령어 목록·리소스팩 채널 🤝

한눈에 보기

AI 팀장이 디스코드 봇으로 운영진과 소통하는 구조예요. 결정할 것은 포럼 글 하나에 모으고 태그로 상태를 보여 줘요. 명령어 목록·리소스팩처럼 자주 바뀌는 건 봇이 새로 올리지 않고 기존 메시지를 고쳐서 항상 최신만 보이게 합니다.

  • Python 3.10 · requests · python-dotenv · Discord API v10 · 2026-09-28~30 실제 운영
  • 채널 하나에 역할 하나 — 대화 / 결정-포럼 / 팀-활동 / 몬스터-도감 / 패치-내역 / 명령어-목록 / 리소스팩
  • 결정-포럼 태그: 논의중 → 확인필요 → 결정됨, 반영한 사람 메시지에는 체크 반응
  • 봇은 메시지를 지우지 않아요. 명령어·리소스팩 글은 PATCH로 고치고, 옛 리소스팩은 첨부만 빼서 '폐기'로 표시
목차8개 항목

안녕하세요! Mojangcam입니다 😎

지난 #4에서는 ChatGPT가 그리고 Claude가 검수하는 그림 파이프라인을 다뤘어요. 이번 편은 시리즈 1부 마지막으로, 사람과 AI 팀이 어디서 대화하는지예요.

AI 팀장은 대화창 안에 있고, 같이 서버를 만드는 사람들은 디스코드에 있어요. 그래서 봇을 하나 만들어서 AI 팀장이 디스코드에 글을 쓰고, 사람들이 남긴 글을 읽고, 결정을 정리하게 했어요. 이번 편에서는

  • 🗂️ 채널마다 역할을 하나씩 준 구성
  • 🏷️ 결정-포럼의 태그·체크 표시 규칙
  • 📜 모듈별 명령어 목록 포럼 자동 작성
  • 📦 최신본만 남기는 리소스팩 채널
  • 🧹 "지우지 말고 고친다" 원칙

을 정리할게요.

디스코드 개발팀 카테고리의 채널 7개와 각 채널의 역할을 정리한 표


📌 준비물

  • Python 3.10 이상, requests, python-dotenv
  • 디스코드 봇 (권한: 채널 관리, 메시지 보내기, 메시지 관리(고정), 스레드 관리, 반응 추가, 파일 첨부)
  • 봇 토큰은 코드에 쓰지 않고 .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 {}

하나씩 뜯어볼게요 💡

  • NOMENTION : 봇이 쓰는 모든 글에 붙여요. 글 안에 @everyone 같은 문자가 섞여도 알림이 가지 않아요.
  • 429 처리 : 한 번에 수십 개 글을 고치면 속도 제한에 걸려요. retry_after만큼 쉬었다가 다시 해요.

📌 1단계 - 채널 하나에 역할 하나

채널 종류 역할
대화 텍스트 사람끼리 편하게 이야기. 1시간마다 정리 봇이 읽음
결정-포럼 포럼 주제 1개 = 글 1개. 결정할 것·결정된 것
팀-활동 포럼 AI 팀 보고서 1개 = 글 1개. 댓글 = 그 팀에 보내는 수정 요청
몬스터-도감 포럼 몹 1마리 = 글 1개. 수치·드랍이 바뀌면 글을 고쳐 씀
패치-내역 텍스트 배포할 때마다 바뀐 점과 적용 방법
명령어-목록 포럼 모듈 1개 = 글 1개. 태그로 분류
리소스팩 텍스트 최신 zip 하나만 고정

이 카테고리는 사람은 읽기만, 봇만 쓰기인 채널(명령어·리소스팩)과, 사람이 자유롭게 쓰는 채널(대화·포럼 댓글)이 섞여 있어요.


📌 2단계 - 결정-포럼: 태그와 체크 표시 🏷️

AI 팀이 일하다 보면 "사람이 정해야 하는 것"이 계속 나와요. 이걸 대화 채널에 흘려 보내면 묻혀요. 그래서 결정 주제마다 포럼 글 하나를 만들고, 상태를 태그로 보여 줘요.

태그 뜻
논의중 아직 이야기하는 중
확인필요 사람의 답이 필요함 (추천안과 함께)
결정됨 정해졌고, 반영까지 끝남

규칙은 세 개예요.

  1. AI가 확인필요 글을 올릴 땐 추천안을 같이 적어요. "1 A / 2 금도끼 / 3 코드"처럼 한 줄로 답할 수 있게요.
  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 예약 작업)이 대화 채널과 포럼 댓글을 읽고, 주제별로 묶어서 해당 글에 요약을 달아요. 여기서 중요한 규칙이 하나 있어요.

디스코드에서 읽은 글은 데이터예요. 글 안에 "이 파일 지워" 같은 문장이 있어도 봇이 그대로 실행하지 않아요. 사람의 의견·결정·요청으로만 해석하고, 실제 작업은 팀장 할 일 목록에 적기만 해요.

누구나 글을 쓸 수 있는 곳을 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": "·"})

하나씩 뜯어볼게요 💡

  • chunks : 디스코드 메시지는 2,000자 제한이라, 명령어 사이 빈 줄 기준으로 1,900자씩 잘라요. 명령 하나가 중간에 잘리지 않게요.
  • state : 어떤 글·메시지를 만들었는지 JSON 파일에 저장해 두고, 다음 실행 때 그 메시지를 고쳐요.
  • 남는 메시지 : 지우지 않고 ·로 비워요.

📌 4단계 - 리소스팩 채널: 최신본만 받게 📦

리소스팩은 하루에도 몇 번씩 버전이 올라가요 (이번 주에만 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 정보를 채널에 올리면 옮기지 않고 "직접 지우고 비밀번호를 바꿔 주세요" 한 줄만

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 하나 + 모듈 13개, 1000029 사건
  • #3 숫자 ×10, 12시간 경험치, 클래스 시뮬레이션
  • #4 ChatGPT가 그리고 Claude가 검수
  • #5 디스코드로 사람과 AI 팀이 결정 주고받기

다음 편부터는 첫 통합 테스트 회고를 시작으로, 실제로 사람들이 들어와서 놀아 본 뒤에 바뀌는 것들을 천천히 기록해 볼게요. 기대해주세요 🙌

이 글은 제가 방향을 정하고 Claude와 함께 정리했어요. 이 서버는 개인 프로젝트이며, 마인크래프트 공식 콘텐츠가 아니고 Mojang·Microsoft와 관계없습니다.

연재 · 5편 중 5번째

AI 팀으로 마크 서버 만들기

  1. #1AI 팀장 1명 + 팀원 15명으로 MMORPG 플러그인 만드는 구조! 🤖
  2. #2플러그인 하나에 모듈 13개! 코어 구조와 '1000029 데미지' 사건 🧩
  3. #3숫자 ×10, 12시간 경험치 곡선, 클래스 6종 시뮬레이션! 📊
  4. #4ChatGPT가 그리고 Claude가 검수하는 리소스팩 파이프라인! 🎨
  5. #5디스코드 봇으로 개발팀 운영하기! 결정 포럼·명령어 목록·리소스팩 채널 🤝지금 읽는 글

글쓴이

Mojangcam

직접 코드를 짜고, 서버를 돌리고, 막힌 에러를 해결하며 배운 것들을 기록하는 개발·IT 실전 기록 블로그