MAATRIX GAMES / Блог / Уровневая система (XP/levels) бота для активности в чате

Уровневая система (XP/levels) бота для активности в чате

MAATRIX GAMES

Комьюнити на 500+ человек живёт первые пару недель на энтузиазме, а потом активность проседает: в чате пишут одни и те же десять человек, остальные молча читают. Уровневая система с XP за сообщения и голосовые каналы — один из немногих механизмов геймификации, который реально возвращает людей писать в чат, а не просто заходит на сервер послушать музыку. В этой статье — как настроить XP-бота от начисления опыта до защиты от накрутки, с конкретными командами и конфигами.

Зачем серверу система уровней

Сама по себе цифра уровня рядом с ником — не самоцель. Работает связка: XP → уровень → роль → привилегия. Игрок видит прогресс, получает роль на 5, 15, 30 уровне, а роль открывает что-то реальное — доступ в закрытый канал, кастомный цвет ника, эмодзи-реакции, а на игровом сервере — донат-кит или временный VIP-статус без оплаты. Это тот самый цикл вовлечения, который держит людей в комьюнити дольше, чем просто интерес к самой игре.

Второй эффект менее очевидный, но важный для админа: XP-топ показывает, кто реально двигает комьюнити. Это готовый список кандидатов в модераторы или доверенных игроков — не по симпатии, а по объективной активности за месяцы.

Минус тоже есть, и о нём стоит сказать честно: уровневая система привлекает фарм-поведение. Люди начинают спамить односложными сообщениями ради циферки. Без нормального антиспама XP-бот скорее засоряет чат, чем оживляет его — этому разделу ниже уделено отдельное внимание.

Готовые боты: что выбрать

Если не хочется писать своего бота, есть несколько зрелых решений с готовой системой уровней. Сравнение по актуальным на конец 2026 года лимитам бесплатных тарифов:

БотБесплатноПлатноОсобенности
MEE6XP за текст, базовые роли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-бот сам по себе не знает про игровой сервер. Рабочая схема:

  1. Discord-бот пишет событие в базу или дёргает webhook при получении роли (у Arcane и большинства кастомных ботов есть событие on_level_up / on_role_add).
  2. Небольшой связующий сервис (можно на Python, discord.py + aiohttp) слушает это событие и по Discord ID игрока находит его игровой аккаунт — через привязку по команде типа /link <ник>, сохранённую в таблице players_link (discord_id, game_username).
  3. Сервис вызывает 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 и разговора с игроком.