디스코드 레벨링 봇 만들기

2026. 5. 13. 16:59·봇 개발 팁/Discord.py

채팅이 조용한 서버를 살리겠다고 레벨링부터 붙였는데, 정작 늘어나는 건 짧은 도배 메시지뿐이라면 설계 방향이 잘못된 겁니다.

레벨링의 핵심은 숫자를 올리는 기능이 아니라 멤버가 오래 머물 이유를 만드는 활동 루프입니다.

이 글에서는 메시지 활동을 기준으로 경험치를 쌓고 일정 구간마다 레벨업 안내를 보내는 가장 작은 레벨링 구조를 만들면서, 왜 쿨타임과 알림 채널이 먼저 필요한지도 같이 봅니다.

1. 레벨링은 장기 활동 리듬을 만들 때 붙인다

초반 서버에서는 멤버가 다시 말을 걸 이유가 부족해서 채팅이 쉽게 식습니다.

레벨링은 그 공백을 메우는 장치입니다.

특히 질문, 잡담, 커뮤니티형 서버에서 장기 활동 흔적을 만들 때 자주 씁니다.

보통 아래 목적에 잘 맞습니다.

  • 채팅 참여 유도
  • 장기 활동 유저 구분
  • 역할 보상이나 이벤트 기준 만들기

역할 보상까지 연결하고 싶다면 반응 역할 디스코드 봇 만들기와 자동 역할 부여 디스코드 봇 만들기을 같이 보면 좋습니다.

2. 경험치는 너무 자주 주면 도배만 남는다

메시지 하나마다 바로 경험치를 주면 도배가 심해질 수 있습니다.

그래서 보통은 쿨타임을 둡니다.

예를 들어 30초에 한 번만 경험치를 주는 식이 무난합니다.

3. 경험치 채널과 역할 값 정리

DISCORD_TOKEN=여기에_봇_토큰
LEVEL_UP_CHANNEL_ID=레벨업알림채널_ID


레벨업 알림을 모든 채널에 뿌리지 않으려면 전용 채널이나 지정 채널 하나를 둬야 합니다.

4. 메시지당 경험치를 누적하는 코드

import os
import time
from collections import defaultdict

import discord
from dotenv import load_dotenv

load_dotenv()

TOKEN = os.getenv("DISCORD_TOKEN")
LEVEL_UP_CHANNEL_ID = int(os.getenv("LEVEL_UP_CHANNEL_ID"))
COOLDOWN_SECONDS = 30
xp_data = defaultdict(lambda: {"xp": 0, "level": 1, "last_gain": 0.0})

intents = discord.Intents.default()
intents.messages = True
intents.message_content = True
intents.guilds = True
client = discord.Client(intents=intents)


def xp_needed(level: int) -> int:
    return level * 100


@client.event
async def on_ready():
    print(f"로그인 성공: {client.user}")


@client.event
async def on_message(message: discord.Message):
    if message.author.bot or message.guild is None:
        return

    data = xp_data[message.author.id]
    now = time.time()

    if now - data["last_gain"] < COOLDOWN_SECONDS:
        return

    data["last_gain"] = now
    data["xp"] += 15

    target_xp = xp_needed(data["level"])
    if data["xp"] < target_xp:
        return

    data["xp"] -= target_xp
    data["level"] += 1

    channel = message.guild.get_channel(LEVEL_UP_CHANNEL_ID)
    if isinstance(channel, discord.TextChannel):
        await channel.send(f"{message.author.mention} 님이 레벨 {data['level']}이 되었습니다.")


if not TOKEN:
    raise ValueError("DISCORD_TOKEN 값이 없습니다.")

client.run(TOKEN)


레벨링 기본형은 의외로 단순합니다.
메시지 활동을 집계하고, 일정 수치가 차면 레벨을 올리면 됩니다.

5. 먼저 정할 것은 숫자가 아니라 보상 연결 시점이다

레벨업을 어디에 연결할지 먼저 정해야 합니다.

단순 재미인지, 활동 배지인지, 이벤트 참여 기준인지에 따라 봇 성격이 완전히 달라집니다.

아무 용도 없이 숫자만 올리면 초반엔 반응이 와도 오래 못 갑니다.

6. 경험치 누적과 쿨다운부터 확인

python main.py


테스트 채널에서 몇 번 메시지를 보내고, 30초 정도 간격을 두고 다시 보내 보면서 레벨업 알림이 뜨는지 확인합니다.

7. 레벨 계산에서 자주 틀리는 부분

  • 경험치가 너무 빨리 오르는 경우 쿨타임이 없거나 너무 짧을 수 있습니다.
  • 레벨업 알림이 안 보이는 경우 알림 채널 ID가 틀리거나 봇이 채널을 못 볼 수 있습니다.
  • 재시작하면 기록이 사라지는 경우 지금 구조는 메모리 저장이라 정상입니다.

    운영 단계에서는 파일이나 DB 저장을 붙여야 합니다.

8. 레벨링은 안티스팸과 한 세트로 본다

레벨링을 붙이면 일부 유저는 대화보다 경험치 파밍에 맞춰 움직이기 시작합니다.

짧은 메시지 반복이 늘어나는 순간 레벨링은 참여 장치가 아니라 채팅 품질 저하 장치가 됩니다.

그래서 레벨링과 안티스팸은 보통 같이 봐야 합니다.

이 부분은 스팸 방지 디스코드 봇 만들기와 묶어서 보면 좋습니다.

9. 역할 보상은 나중에 붙여도 된다

처음부터 레벨 5, 10, 20마다 역할 지급까지 넣지 않아도 됩니다.

우선 레벨 계산과 알림이 잘 도는지부터 확인해야 빠릅니다.

역할 연동은 나중에 자동 역할 로직과 섞는 방식이 안정적입니다.

10. 레벨링 다음에는 활동 무대를 같이 손본다

레벨링은 스팸 방지 디스코드 봇 만들기, 디스코드 이벤트 채널 기획법, 디스코드 서버 꾸미기, 채널 역할 배치 가이드를 함께 봐야 실제 참여 구조로 굳습니다.

'봇 개발 팁 > Discord.py' 카테고리의 다른 글

초대 링크 추적 디스코드 봇 만들기  (0) 2026.05.09
욕설 필터 디스코드 봇 만들기  (0) 2026.05.08
링크 차단 디스코드 봇 만들기  (0) 2026.05.07
스팸 방지 디스코드 봇 만들기  (0) 2026.05.06
처벌 로그 디스코드 봇 만들기  (0) 2026.05.04
'봇 개발 팁/Discord.py' 카테고리의 다른 글
  • 초대 링크 추적 디스코드 봇 만들기
  • 욕설 필터 디스코드 봇 만들기
  • 링크 차단 디스코드 봇 만들기
  • 스팸 방지 디스코드 봇 만들기
디스호스트
디스호스트
쉽고 안정적인 디스코드 봇 호스팅 서비스, 디스호스트의 기술 블로그입니다. 디스호스트는 24시간 구동되는 서버를 통해 디스코드 봇을 대신 구동시켜 드리는 서비스를 제공하고 있습니다.
  • 디스호스트
    디스호스트 기술 블로그
    디스호스트
  • 블로그 메뉴

    • 홈
    • 디스호스트 사용 가이드
    • 디스코드 봇 호스팅, 24시간 서버 구동
    • 분류 전체보기 (105) N
      • 디스코드 (9)
      • 디스호스트 가이드 (12)
      • 봇 개발 팁 (40) N
        • Discord.js (11)
        • Discord.py (28) N
      • DiscordJS 개발 튜토리얼 (15)
      • 디스코드 서버 운영 (18)
      • 디스코드 봇 오류 해결 (10) N
  • 링크

    • 디스호스트
  • hELLO· Designed By정상우.v4.10.3
디스호스트
디스코드 레벨링 봇 만들기
상단으로

티스토리툴바