디스코드 봇 만들기 #29화폐·상점(Economy) 시스템 만들기! 코인 벌어서 아이템 사기 (파이썬 예제)
이번 #29편에서는 디스코드 봇에 화폐·상점(Economy) 시스템을 만들어 볼게요. 출석 체크로 코인을 벌고, /상점에서 드롭다운으로 아이템을 고르고, /지갑으로 내 인벤토리를 확인하는 것까지 한 번에 완성해요.
최신순
이번 #29편에서는 디스코드 봇에 화폐·상점(Economy) 시스템을 만들어 볼게요. 출석 체크로 코인을 벌고, /상점에서 드롭다운으로 아이템을 고르고, /지갑으로 내 인벤토리를 확인하는 것까지 한 번에 완성해요.
AI 개발팀과 사람이 디스코드에서 결정을 주고받는 방법이에요. 채널마다 역할을 하나씩, 결정-포럼 태그와 체크 표시 규칙, 모듈별 명령어 포럼, 최신본만 남기는 리소스팩 채널, 그리고 '메시지는 지우지 않고 고친다' 원칙까지.

디스코드 봇으로 서버 로그 채널을 만들어 봐요. 지워진 메시지 내용과 누가 지웠는지, 입퇴장·역할 변경·추방·차단까지 임베드로 자동 기록하는 로그봇을 discord.py 2.x 예제로 처음부터 만듭니다.

지난 편에서는 화폐·상점(Economy) 시스템을 만들어서 코인을 벌고 아이템을 사는 봇을 완성했어요. 서버에 "놀거리"가 하나 생긴 셈이죠! 이번 편에서는 서버 운영에 진짜 자주 쓰이는 기능, 투표·설문(Poll) 봇을 만들어볼게요. 두 가지 방식을 다 다룹니다.
지난 편(#27 티켓 담당자 배정·우선순위)에서는 문의 티켓을 스태프에게 자동으로 배정하는 시스템을 만들었어요. 이번 #28편에서는 분위기를 확 바꿔서, 서버를 시끌벅적하게 만드는 레벨·경험치(XP) 시스템을 만들어 볼게요!
아침에 구글 시트를 열었는데 어제 숫자가 그대로예요. 자동화가 아예 실행되지 않은 건지, 데이터를 읽다가 멈춘 건지, 마지막 저장만 실패한 건지 알 수가 없죠.
지난 #25편에서는 봇이 죽지 않게 에러 핸들링과 로깅 체계를 잡아봤어요. 이제 봇이 웬만해선 안 죽으니까, 이번엔 사람 손이 필요한 일을 봇이 대신 받아주게 만들어 볼게요.
지난 #24편에서는 채널 난독화(Channel Obfuscation)에 대응하는 법을 봤어요. 봇이 볼 수 없는 채널이 생겨도 안 터지게 만드는 작업이었죠.
지난 #22편에서는 /금지어추가, /금지어삭제 를 자동완성으로 만들었죠. 편해지긴 했는데, 그 데이터가 지금 어디에 있죠? data/bannedwords.json 이에요. #21의 경고 기록도 data/warns.json 이고요.
지난 #21편에서는 채팅을 지켜보는 cogs/automod.py를 만들었죠. 그런데 문제가 하나 있었어요. 금지어가 코드 안에 박혀 있었다는 것 😩
지난 #20편에서는 새 멤버가 들어오면 환영 카드를 띄우고, 규칙 동의 버튼으로 자동 역할 부여까지 되게 만들었죠. 사람 손 없이 신규 유저를 받는 문이 생긴 거예요 🚪
지난 #19편에서는 길어진 bot.py를 확장(Extension)과 Cog 구조로 쪼개고, !reload로 재시작 없이 코드를 다시 불러오는 것까지 만들었죠. 오늘부터가 진짜 재미있는 부분이에요. 그 구조 위에 기능 파일을 하나씩 얹어갑니다 🏗️
지난 #18편에서는 discord.Poll 로 네이티브 투표 기능을 만들었죠. 그런데 여기까지 오면서 눈치채신 분 계실 거예요. bot.py 파일이 슬슬... 아니 꽤 많이 길어졌잖아요? 😅 명령어 하나 고치려고 스크롤을 300줄씩 내리고 계신다면, 오늘 글이 딱입니다.
지난 #14편에서는 JSON과 SQLite로 봇에게 기억력을 만들어줬어요. 그런데 시리즈를 따라오면서 기능을 하나씩 붙이다 보니, 어느새 명령어가 열댓 개를 훌쩍 넘지 않았나요? 디스코드에서 /만 입력하면 명령어가 우르르 쏟아져서 정작 필요한 걸 찾기 힘들어지는 시점이 옵니다.
지난 #13편에서는 역할·채널 자동화로 서버 관리를 봇에게 통째로 맡겨봤어요. 그런데 한 가지 아쉬운 점이 있었죠. #13의 tempchannels처럼 변수에만 담아둔 데이터는 봇을 재시작하는 순간 전부 사라진다는 거예요.
디스코드 봇을 만들다 보면 꼭 만나는 벽이 하나 있어요. "봇이 보내는 메시지가 너무 밋밋한데요?" 그냥 텍스트로 이벤트 안내: 7월 1일 ~ 7월 31일 이렇게 보내면 아무도 안 읽어요. 그런데 색깔 띠가 붙고, 제목이 굵게 나오고, 이미지랑 표처럼 정리된 항목이 들어간…
지난 #12편에서는 명령어 쿨다운과 권한으로 봇을 안전하게 지키는 법을 배웠어요. 이번 #13편에서는 한 걸음 더 나아가, 서버 관리자의 반복 노동을 봇에게 통째로 넘겨볼게요. 오늘 만들 자동화는 딱 세 가지예요.
디스코드 봇 시리즈랑 파이썬 업무 자동화 #1 - 엑셀 자동화 글을 따라하다 보면 pip install을 정말 많이 하게 되죠? 그런데 프로젝트마다 라이브러리를 전부 컴퓨터 전체에 깔아버리면, 언젠가 버전이 충돌하면서 "어제까지 되던 봇이 오늘 안 돼요" 사태가 터져요 😅
혹시 요즘 Paper 서버를 돌리는데 자동 업데이트가 자꾸 구버전을 받아오거나, 아예 다운로드가 실패하지 않나요? 여러분 잘못이 아니에요! 2026년 7월 1일부터 PaperMC의 구 다운로드 API(v2)가 완전히 종료되면서, AMP·도커·자작 스크립트 등 옛날 API를…
디스코드 봇 만들기 시리즈를 9편까지 진행하면서 가장 많이 받는 질문이 뭔지 아세요? 바로 "봇이 안 켜져요", "에러가 떠요"예요! 사실 봇 개발에서 코드를 짜는 시간보다 에러랑 싸우는 시간이 더 길 때도 많죠 😅
지난 #8에서는 임베드(Embed)로 봇의 메시지를 예쁘게 꾸미는 방법을 배웠죠. 이번 편에서는 드디어 많은 분들이 기다리셨을 기능, 봇에 AI를 연동해볼게요! /ai 질문 이렇게 입력하면 Claude나 ChatGPT가 대답해주는 봇을 만듭니다.
지난 편(#8)까지 해서 버튼, 드롭다운, 모달, 임베드까지 갖춘 제법 그럴듯한 봇이 완성됐어요. 그런데 여기서 다들 똑같은 고민을 하게 됩니다. "내 컴퓨터를 끄면 봇도 꺼지는데... 24시간 켜두려면 어떻게 하죠?"
지난 #7편에서는 모달(Modal)로 사용자에게 입력을 받아봤어요. 이번 #8편에서는 봇이 보내는 메시지를 훨씬 예쁘게 만들어주는 임베드(Embed)를 다뤄볼게요!
디스코드 봇에서 슬래시 명령어를 사용하려면 discord.appcommands를 활용하면 됩니다. intents = discord.Intents.default() bot = commands.Bot(commandprefix="/", intents=intents)