Уровневая система (XP/levels) бота для активности в чате
Комьюнити на 500+ человек живёт первые пару недель на энтузиазме, а потом активность проседает: в чате пишут одни и те же десять человек, остальные молча читают. Уровневая система с XP за сообщения и голосовые каналы — один из немногих механизмов геймификации, который реально возвращает людей писать в чат, а не просто заходит на сервер послушать музыку. В этой статье — как настроить XP-бота от начисления опыта до защиты от накрутки, с конкретными командами и конфигами.
Содержание
Зачем серверу система уровней
Сама по себе цифра уровня рядом с ником — не самоцель. Работает связка: XP → уровень → роль → привилегия. Игрок видит прогресс, получает роль на 5, 15, 30 уровне, а роль открывает что-то реальное — доступ в закрытый канал, кастомный цвет ника, эмодзи-реакции, а на игровом сервере — донат-кит или временный VIP-статус без оплаты. Это тот самый цикл вовлечения, который держит людей в комьюнити дольше, чем просто интерес к самой игре.
Второй эффект менее очевидный, но важный для админа: XP-топ показывает, кто реально двигает комьюнити. Это готовый список кандидатов в модераторы или доверенных игроков — не по симпатии, а по объективной активности за месяцы.
Минус тоже есть, и о нём стоит сказать честно: уровневая система привлекает фарм-поведение. Люди начинают спамить односложными сообщениями ради циферки. Без нормального антиспама XP-бот скорее засоряет чат, чем оживляет его — этому разделу ниже уделено отдельное внимание.
Готовые боты: что выбрать
Если не хочется писать своего бота, есть несколько зрелых решений с готовой системой уровней. Сравнение по актуальным на конец 2026 года лимитам бесплатных тарифов:
| Бот | Бесплатно | Платно | Особенности |
|---|---|---|---|
| MEE6 | XP за текст, базовые роли | MEE6 Premium — кастомные XP-карты, множители, больше уровневых ролей | Огромное комьюнити, простая веб-панель dashboard.mee6.xyz |
| Arcane | Текст + голос, гибкая настройка ролей | Arcane Premium — карточки ранга, мультипликаторы по каналам | Один из немногих бесплатных ботов с XP за войс из коробки |
| Tatsu | Текст + голос, экономика (валюта, магазин) | Tatsu Premium — профили, больше слотов ролей | Совмещает уровни с виртуальной экономикой |
| Amari Bot | Текст + голос, гибкие уровневые роли | Amari Premium — импорт/экспорт XP, весовые множители | Хорош для миграции с других XP-ботов |
Для чисто игрового сервера логичнее Arcane или Amari Bot — оба дают XP за время в голосовых каналах бесплатно, а именно войс-активность обычно лучше коррелирует с реальной вовлечённостью, чем текстовые сообщения. MEE6 удобнее, если сервер в основном текстовый (RP, ФАЙВМ-комьюнити с активным чатом ролей).
Настройка на примере Arcane: заходите в панель через /dashboard в самом Discord или на arcane.bot, раздел Leveling → включаете XP for Text и XP for Voice, задаёте диапазон XP за сообщение (по умолчанию у большинства ботов рандом в диапазоне 15–25 XP) и кулдаун между начислениями.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверКак начисляется XP: формула и кулдауны
Большинство ботов используют похожую логику начисления, стоит понимать её, даже если вы берёте готового бота:
- за одно засчитанное сообщение начисляется случайное количество XP в заданном диапазоне (например, 15–25);
- между засчитанными сообщениями действует кулдаун — обычно 60 секунд по умолчанию, за это время новые сообщения XP не приносят;
- для перехода на следующий уровень нужно накопительно больше XP, чем на предыдущий — формула роста обычно квадратичная или около того (условно:
XP_для_уровня = 5 * (уровень^2) + 50 * уровень + 100— конкретная формула у каждого бота своя, это ориентир, а не точное значение для всех ботов); - голосовые каналы (если бот их поддерживает) начисляют XP не за сообщение, а за минуту пребывания в канале — обычно с условием, что в канале есть ещё хотя бы один человек, иначе фарм в одиночном канале с музыкой ничего не даёт.
В Arcane это настраивается в разделе Leveling → Voice XP: включаете, задаёте XP в минуту и обязательное условие «не менее N участников в канале» — без этого условия люди будут просто висеть одни в пустом канале с ботом-плеером и фармить уровни без единого слова в чате.
Важный нюанс: кулдаун должен быть больше, чем время набора короткого текста. Если поставить 10 секунд, люди начнут писать залпом по три коротких сообщения подряд, чтобы обойти защиту — это уже переход в раздел антиспама.
Роли за уровни и интеграция с игровыми привилегиями
Уровневые роли настраиваются как список пар «уровень → роль» в панели бота. Пример разумной лестницы для сервера на 500-1000 участников:
| Уровень | Роль | Что даёт |
|---|---|---|
| 5 | Активный | доступ в отдельный текстовый канал для устоявшихся участников |
| 15 | Проверенный | право постить ссылки без модерации, кастомный цвет ника |
| 30 | Ветеран | доступ в закрытый голосовой канал, участие в голосованиях по правилам |
| 50 | Легенда сервера | донат-кит на игровом сервере, упоминание в топе на сайте |
Связка с игровым сервером — самая интересная часть, и она требует отдельной прослойки, потому что Discord-бот сам по себе не знает про игровой сервер. Рабочая схема:
- Discord-бот пишет событие в базу или дёргает webhook при получении роли (у Arcane и большинства кастомных ботов есть событие
on_level_up/on_role_add). - Небольшой связующий сервис (можно на Python,
discord.py+aiohttp) слушает это событие и по Discord ID игрока находит его игровой аккаунт — через привязку по команде типа/link <ник>, сохранённую в таблицеplayers_link (discord_id, game_username). - Сервис вызывает RCON-команду на игровом сервере, выдающую кит или права — для Minecraft это может быть
lp user <ник> permission set kit.veteran trueчерез LuckPerms, для Rust/ARK — соответствующая консольная команда через RCON-протокол.
Это уже нетривиальная автоматизация — если раньше не приходилось работать с RCON-командами из внешнего скрипта, стоит сначала прочитать про работу с RCON-командами через Discord-бота — там разобрана база подключения и безопасность RCON-пароля.
Антиспам-защита от накрутки XP
Это раздел, из-за которого XP-система либо работает на пользу чату, либо превращает его в свалку из «+», «ку» и стикеров. Рабочий набор защит, который стоит включить сразу:
- Кулдаун между сообщениями — 45-60 секунд минимум. Большинство ботов позволяют настроить это в разделе Leveling → Cooldown.
- Минимальная длина сообщения — если бот поддерживает (Amari Bot и кастомные боты это умеют), сообщения короче 3-5 символов не засчитываются. Отсекает фарм одними эмодзи и точками.
- Игнор-каналы — исключите из начисления XP голосовой лобби-канал, канал с ботами, канал жалоб и тикетов. В Arcane это Leveling → Ignored Channels, в MEE6 — аналогичный список в настройках плагина Levels.
- Игнор при спам-детекте — если на сервере уже стоит бот-модератор с антиспам-фильтром (например, разобранный в статье про модерацию чата), убедитесь, что удалённые как спам сообщения не успевают начислить XP — порядок обработки ивентов между ботами имеет значение, антиспам должен реагировать быстрее XP-бота.
- Voice AFK-защита — если начисляете XP за войс, исключите AFK-канал сервера (Discord Server Settings → Overview → Afk Channel) и, если бот поддерживает, отключайте начисление при статусе mute+deaf одновременно — это почти всегда признак, что человек висит в канале без реального присутствия.
- Ручной сброс и бан по XP — держите под рукой команду сброса XP конкретного пользователя (
/level reset @userу большинства ботов) на случай, если кто-то нашёл дыру и нафармил уровни за ночь ботом-скриптом со своего аккаунта.
Ни одна из этих мер не даёт стопроцентной защиты сама по себе — комбинация из кулдауна, минимальной длины и игнор-каналов закрывает 90% типичных попыток накрутки без лишней бюрократии для обычных участников.
Свой бот на discord.py: минимальная реализация
Если готовые боты не устраивают гибкостью (например, нужна нестандартная формула роста или привязка XP напрямую к игровой статистике через API), несложно написать собственный. Минимальный скелет на discord.py с хранением в SQLite:
import discord
from discord.ext import commands
import sqlite3
import random
import time
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
db = sqlite3.connect("levels.db")
db.execute("""CREATE TABLE IF NOT EXISTS xp (
user_id INTEGER PRIMARY KEY,
xp INTEGER DEFAULT 0,
level INTEGER DEFAULT 0,
last_message REAL DEFAULT 0
)""")
COOLDOWN = 60 # секунд между засчитанными сообщениями
IGNORED_CHANNELS = {123456789012345678} # ID каналов без XP
def xp_for_level(level: int) -> int:
return 5 * (level ** 2) + 50 * level + 100
@bot.event
async def on_message(message):
if message.author.bot or message.channel.id in IGNORED_CHANNELS:
return
if len(message.content.strip()) < 5:
return
now = time.time()
row = db.execute("SELECT xp, level, last_message FROM xp WHERE user_id=?",
(message.author.id,)).fetchone()
if row is None:
db.execute("INSERT INTO xp (user_id) VALUES (?)", (message.author.id,))
xp, level, last_message = 0, 0, 0
else:
xp, level, last_message = row
if now - last_message < COOLDOWN:
await bot.process_commands(message)
return
xp += random.randint(15, 25)
leveled_up = False
while xp >= xp_for_level(level):
level += 1
leveled_up = True
db.execute("UPDATE xp SET xp=?, level=?, last_message=? WHERE user_id=?",
(xp, level, now, message.author.id))
db.commit()
if leveled_up:
await message.channel.send(f"{message.author.mention} достиг {level} уровня!")
await bot.process_commands(message)
bot.run("YOUR_BOT_TOKEN")
Это только каркас: нет обработки войс-XP, ролей за уровень и защиты от гонки при одновременных сообщениях (для продакшена лучше PostgreSQL с транзакциями вместо SQLite). Но даже такой минимум даёт полный контроль над формулой и позволяет напрямую писать в ту же базу, что использует остальная инфраструктура сервера — без прослойки webhook'ов, как в случае с готовыми ботами.
Токен бота получают в Discord Developer Portal — если сервер ещё не настроен и бот-приложение не создано, там же описан базовый процесс поднятия Discord-сервера под комьюнити с нуля.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверЧастые вопросы
Сколько XP давать за сообщение, если делаю своего бота?
Ориентируйтесь на диапазон 10-25 XP со случайным разбросом — это стандарт у большинства популярных ботов, проверенный годами использования. Точные цифры не так важны, как соотношение между текстом и войсом: войс-минута обычно даёт меньше XP, чем сообщение, потому что событий в единицу времени больше.
Нужно ли давать XP за войс, если сервер в основном текстовый?
Не обязательно. Если основная жизнь комьюнити в текстовых каналах (например, RP-сервер с тикетами и обсуждениями), войс-XP можно отключить полностью, чтобы не плодить фарм в пустых голосовых каналах.
Как перенести XP при смене бота?
У Amari Bot и некоторых аналогов есть встроенный импорт данных с других популярных ботов через команду администратора в панели — но полной совместимости между всеми ботами нет, часть прогресса участников почти наверняка потеряется при миграции, это стоит явно предупредить в чате заранее.
Может ли уровень в Discord влиять на права на игровом сервере напрямую?
Напрямую нет — Discord и игровой сервер это разные системы без встроенной связи. Нужна прослойка (свой скрипт или готовый connector), которая слушает события бота и вызывает RCON или API управления правами, как описано в разделе про интеграцию выше.
Что делать, если несколько участников жалуются на несправедливую накрутку у топ-игроков?
Проверьте историю сообщений через аудит-лог бота (у MEE6 и Arcane есть лог начислений), сравните частоту сообщений с кулдауном — если человек физически не мог столько написать за кулдаун, это повод для ручного сброса XP и разговора с игроком.