Приветственный бот для нового игрока на Discord-сервере
Новичок зашёл на ваш 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 (аналогично у остальных, различаются только названия пунктов меню):
- Заходите на dashboard бота, выбираете свой сервер.
- Модуль Welcome/Leave → включаете, выбираете канал (например, #новичкам) или тип «Direct Message» для личного сообщения.
- Пишете текст embed, например:
👋 Привет, {user}! Добро пожаловать на {server}.
Загляни в #правила и #как-начать — там всё по подключению к серверу.
Роль «Игрок» уже выдана, доступ к игровым каналам открыт.
- Модуль Autorole → добавляете роль «Игрок» (или «Новичок», если у вас есть отдельная ступень верификации перед полным доступом).
- Сохраняете, тестируете вторым аккаунтом или через альт — большинство панелей позволяют предпросмотр без реального захода.
Ограничение готовых ботов — как только нужна логика «на входе выдать роль ИЛИ отправить на верификацию по нику в игре, а не всем подряд одну и ту же роль», встроенных настроек уже не хватает, и тут либо ищете плагин под конкретный кейс, либо пишете свой код.
Свой бот на 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 или платным доступом:
- Новичок заходит → получает нижнюю служебную роль «Новичок» (видит только #правила, #приветствие, #как-начать).
- Читает правила, жмёт реакцию/кнопку «Согласен» (через Rules Screening Discord или через
on_raw_reaction_addв своём коде). - По подтверждению бот меняет роль «Новичок» на «Игрок» — открывается доступ к игровым каналам и, если 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», а мультиязычность добавляйте, когда реально появится заметная доля англоязычных новичков, а не заранее.