MAATRIX GAMES / Блог / Приветственный бот для нового игрока на Discord-сервере

Приветственный бот для нового игрока на Discord-сервере

MAATRIX GAMES

Новичок зашёл на ваш Discord-сервер, увидел десяток непонятных каналов, ни одной роли и тишину — и через пять минут вышел, так и не поняв, куда писать и что вообще тут происходит. Это не гипотетика, а типичная воронка любого растущего игрового комьюнити: без явного «привет, вот что делать дальше» вы теряете часть новых игроков ещё до того, как они успели зайти на сам сервер. Разберём, как поднять приветственного бота — от встроенных функций Discord без единой строчки кода до своего бота на discord.py с автовыдачей роли и ссылкой на правила.

Зачем вообще нужен приветственный бот

Задача приветственного бота простая на бумаге и легко проваливается на практике: за первые секунды на сервере новичок должен понять три вещи — куда его вписали (какая роль/статус), где почитать правила и куда идти дальше (канал знакомств, гайд по подключению к игровому серверу). Без этого новичок либо молча выходит, либо начинает спамить вопросами в общий чат, на которые каждый раз отвечают одни и те же старожилы — а это выгорает быстрее, чем кажется.

Три конкретных эффекта, которые даёт нормально настроенный welcome-флоу:

  • Меньше оттока в первые минуты. Человек видит структуру и понимает, что делать — не закрывает вкладку от растерянности.
  • Меньше нагрузки на модераторов. Базовые вопросы («где правила», «как получить роль игрока») закрываются автоматически, а не в личке модератора в 2 часа ночи.
  • Управляемый доступ. Пока новичок не получил базовую роль, он физически не видит игровые каналы, RCON-статистику сервера или приватные разделы — это управляемая точка входа, а не дыра в модерации.

Разложим задачу на три независимых кусочка: сообщение при входе (в канал или в личку), автовыдача базовой роли, и ссылка на правила/гайд. Их можно закрыть как встроенными функциями Discord, так и ботом — готовым или своим.

Встроенные функции Discord: Welcome Screen и System Messages

Прежде чем городить бота, стоит знать, что часть задачи Discord решает без сторонних инструментов вообще.

Welcome Screen (Server Settings → Onboarding → Welcome Screen) — экран, который новый участник видит сразу после захода на сервер, до того как попадёт в чат. Настраивается список из до 5 «рекомендованных каналов» с иконкой и описанием (например, #правила, #роли, #новичкам) — по сути, оглавление сервера в одном экране.

System Messages (Server Settings → Overview → System Messages Channel) — Discord умеет сам слать сообщение в выбранный канал при входе участника, с рандомизированной фразой вида «Добро пожаловать, @Ник, надеемся, ты не приведёшь с собой рейд ботов». Плюс — работает всегда, без завязки на аптайм стороннего бота. Минус — сообщение статичное и не умеет выдавать роль или подставлять кастомную ссылку на правила, только текст и упоминание.

Membership Screening / Правила сервера (Server Settings → Safety Setup → Rules Screening) — экран с обязательным принятием правил до того, как участник сможет писать в чат. Полезная штука для антирейда и юридической подстраховки («участник согласился с правилами»), но сама по себе роль не выдаёт.

Практичная связка для минимального сетапа: Welcome Screen с оглавлением + Rules Screening с правилами + системное сообщение в #general. Это закрывает часть задачи за 10 минут без единого бота, но не даёт автороли и кастомной логики — для них идём дальше.

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

Создать сервер

Готовые боты: Carl-bot, MEE6, Dyno

Если нужна автовыдача роли и кастомный текст (а не рандомная фраза Discord), проще всего взять готового бота — почти все крупные модерационные боты умеют welcome-модуль из коробки.

Carl-bot — гибкий бесплатный вариант, приветствия настраиваются командой >welcome или через веб-дашборд. Можно задать embed с произвольным текстом, картинкой, и подставить переменные {user}, {server}, {membercount}. Автороль — отдельный модуль >autorole add @Роль, срабатывает при каждом входе без ограничений бесплатного тарифа.

MEE6 — веб-панель Welcome/Leave Message, включается тумблером, текст и картинка настраиваются визуально, автороль — в разделе Reaction Roles или отдельным модулем Auto Role в зависимости от версии дашборда. Бесплатного тарифа для базового приветствия и автороли обычно достаточно — платные ограничения у MEE6 в основном касаются продвинутой автомодерации и уровней, не welcome-флоу.

Dyno — модуль Autoroles и Automod → Welcome/Leave message, конфигурируется через веб-панель Dyno. Чуть менее раскрученный интерфейс, чем у MEE6, но стабильный и с меньшим количеством платных ограничений на базовые функции.

Типовая настройка на примере Carl-bot (аналогично у остальных, различаются только названия пунктов меню):

  1. Заходите на dashboard бота, выбираете свой сервер.
  2. Модуль Welcome/Leave → включаете, выбираете канал (например, #новичкам) или тип «Direct Message» для личного сообщения.
  3. Пишете текст embed, например:
   👋 Привет, {user}! Добро пожаловать на {server}.
   Загляни в #правила и #как-начать — там всё по подключению к серверу.
   Роль «Игрок» уже выдана, доступ к игровым каналам открыт.
  1. Модуль Autorole → добавляете роль «Игрок» (или «Новичок», если у вас есть отдельная ступень верификации перед полным доступом).
  2. Сохраняете, тестируете вторым аккаунтом или через альт — большинство панелей позволяют предпросмотр без реального захода.

Ограничение готовых ботов — как только нужна логика «на входе выдать роль ИЛИ отправить на верификацию по нику в игре, а не всем подряд одну и ту же роль», встроенных настроек уже не хватает, и тут либо ищете плагин под конкретный кейс, либо пишете свой код.

Свой бот на discord.py: код welcome-события

Если нужна кастомная логика (например, роль зависит от того, указал ли новичок игровой ник, или приветствие ведёт на выбор роли по игре — Minecraft/Rust/CS2), пишем минимального бота на discord.py 2.x.

Установка:

python -m venv venv
source venv/bin/activate
pip install discord.py

Обязательно включаем привилегированный интент members в Discord Developer Portal (Bot → Privileged Gateway Intents → Server Members Intent), иначе событие входа участника не придёт вообще:

import discord

intents = discord.Intents.default()
intents.members = True  # без этого on_member_join не сработает

client = discord.Client(intents=intents)

WELCOME_CHANNEL_ID = 123456789012345678
AUTOROLE_ID = 234567890123456789
RULES_CHANNEL_MENTION = "<#345678901234567890>"

@client.event
async def on_ready():
    print(f"Бот запущен как {client.user}")

@client.event
async def on_member_join(member: discord.Member):
    # 1. Выдаём базовую роль
    role = member.guild.get_role(AUTOROLE_ID)
    if role:
        await member.add_roles(role, reason="Автовыдача базовой роли новичку")

    # 2. Сообщение в канал
    channel = member.guild.get_channel(WELCOME_CHANNEL_ID)
    if channel:
        embed = discord.Embed(
            title=f"Добро пожаловать, {member.display_name}!",
            description=(
                f"Ты теперь {member.mention} на сервере **{member.guild.name}**.\n\n"
                f"Правила: {RULES_CHANNEL_MENTION}\n"
                f"Роль «Игрок» уже выдана — заходи в игровые каналы."
            ),
            color=0x2ecc71,
        )
        embed.set_thumbnail(url=member.display_avatar.url)
        await channel.send(embed=embed)

    # 3. Личное сообщение (может не дойти, см. следующий раздел)
    try:
        await member.send(
            f"Привет! Ты на сервере {member.guild.name}. "
            f"Загляни в {RULES_CHANNEL_MENTION} и на канал знакомств."
        )
    except discord.Forbidden:
        pass  # у пользователя закрыты личные сообщения от участников сервера — это нормально

client.run("ВАШ_ТОКЕН_БОТА")

Токен бота не хардкодьте в коде, который коммитите в git: выносите в переменную окружения (os.environ["DISCORD_TOKEN"]) или .env-файл с python-dotenv, добавив .env в .gitignore. Для запуска на постоянку — systemd-юнит или Docker-контейнер на той же машине, где крутится игровой сервер, либо отдельная лёгкая VPS: боту на discord.py хватает 256-512 МБ RAM с запасом.

Права боту нужны точечные: Manage Roles (для автороли — при этом роль бота в иерархии должна стоять выше роли, которую он выдаёт, иначе Discord API вернёт ошибку 403) и Send Messages в welcome-канале. Administrator для этой задачи не нужен вообще.

Личка или канал: куда слать приветствие

Тут нет универсально правильного ответа, у обоих вариантов свои грабли.

Личное сообщение (DM). Плюс — не засоряет общий канал, ощущается как персональное обращение. Минус — по умолчанию у части пользователей отключены «Direct Messages from server members» в настройках приватности, и бот получит discord.Forbidden при попытке написать. Рассчитывать, что ЛС дойдёт до каждого новичка, нельзя.

Сообщение в канале. Плюс — гарантированно видно всем, включая тех, у кого закрыты ЛС, и создаёт социальный эффект («вижу, что кто-то новый пришёл, могу поздороваться»). Минус — на активном сервере с частым притоком новичков быстро превращается в стену из однотипных приветствий, которую никто не читает.

Рабочий компромисс из примера выше: пробовать личку как дополнение, а основным способом держать канал — либо выделенный #новичкам, который не тонет в общем потоке, либо Welcome Screen, если хочется вообще без шума в чате. Если приток большой (сотни входов в день), тихий отдельный канал для приветствий однозначно лучше общего чата.

Ссылка на правила и роль как точка входа

Приветствие без явной ссылки на правила решает только половину задачи — новичок поздоровался, но всё ещё не знает, что можно, а что нельзя, и не знает, откуда взять роль для доступа к игровым каналам, если автороль не настроена сразу.

Практичная схема для сервера с whitelist или платным доступом:

  1. Новичок заходит → получает нижнюю служебную роль «Новичок» (видит только #правила, #приветствие, #как-начать).
  2. Читает правила, жмёт реакцию/кнопку «Согласен» (через Rules Screening Discord или через on_raw_reaction_add в своём коде).
  3. По подтверждению бот меняет роль «Новичок» на «Игрок» — открывается доступ к игровым каналам и, если whitelist привязан к Discord-роли, к самому игровому серверу.

Это тот же паттерн верификационного гейта, что и в RP-комьюнити с тикетами на доступ — подробно разобран в статье про Discord-интеграцию для RP-сервера: там показана связка «прошёл гейт → получил роль → роль синхронизирована с whitelist игры». Если структура каналов сервера ещё не продумана, стоит сначала разобраться со структурой каналов Discord-сервера сообщества — бот работает лучше, когда новичку есть куда идти дальше.

Отдельно стоит подумать про антирейд: массовый заход свежесозданных ботов-аккаунтов, которые тоже попадут под автороль и приветствие, если не фильтровать. Базовая защита — не выдавать автороль мгновенно аккаунтам младше нескольких дней (member.created_at), а ставить их в отдельную очередь на ручную проверку. Подробнее про фильтрацию рейдов и связку с модерацией — в статье про Discord-бота для модерации чата сообщества.

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

Создать сервер

Частые вопросы

Личное сообщение не приходит новичку — это баг бота?

Скорее всего нет. Discord с 2022 года по умолчанию закрывает ЛС от участников сервера, если человек не в друзьях и не переписывался с ботом раньше (настройка Privacy & Safety → «Direct Messages»). Код должен ловить discord.Forbidden и не падать — это нормальная ситуация, а не ошибка.

Автороль не выдаётся, хотя код без ошибок.

Почти всегда причина — роль бота в иерархии сервера стоит ниже той, что он пытается выдать (Discord запрещает управлять ролями выше собственной), либо забыт привилегированный интент Server Members Intent в Developer Portal — без него on_member_join не срабатывает вообще, даже без явной ошибки в логах.

Можно ли обойтись вообще без бота, только встроенными функциями Discord?

Частично — Welcome Screen и System Messages закроют приветственный текст и оглавление сервера, но автовыдачу роли по кастомной логике (не всем одну роль, а в зависимости от ответа/реакции) без бота не сделать, для этого нужен хотя бы Carl-bot с модулем Reaction Roles.

Сколько ресурсов нужно на такого бота, если запускать на своей VPS?

Для чистого welcome-функционала — минимально, 256-512 МБ RAM с большим запасом хватает даже при активном сервере на пару тысяч участников; узкое место обычно не ресурсы, а rate limit Discord API на массовые действия при рейде, а не при обычном притоке новичков.

Стоит ли писать приветствие только на русском, если сервер интернациональный?

Нет смысла усложнять для старта — сделайте один язык с явной подписью «English rules: #rules-en», а мультиязычность добавляйте, когда реально появится заметная доля англоязычных новичков, а не заранее.