HELPER WELCOME ВЕРИФИКАЦИЯ И ПРИВЕТСТВИЕ /WELCOME_SETUP / WELCOME_TEST / WELCOME_ACCEPT / CARD CACHE / SAFE ROLE GATE
Welcome встречает нового участника, отправляет красивую welcome-карточку с аватаром, показывает правила и выдаёт доступ только после нажатия кнопки подтверждения. Система защищает кнопку от чужих кликов через welcome_accept:user_id, проверяет права бота, роль в иерархии Discord и автоматически удаляет старые неподтверждённые сообщения.
Что делает Welcome Core
Модуль приветствия отвечает за первый контакт с новым участником. Когда человек заходит на сервер, HELPER отправляет в welcome_channel персональное сообщение с кнопкой, карточкой и правилами. После подтверждения бот выдаёт одну или несколько ролей из настроек и заменяет сообщение на success-state.
Join event
on_member_join ждёт 1.5 секунды и запускает send_welcome_message.
Welcome card
Renderer скачивает аватар, рисует карточку 900×300 и кладёт её в cache.
Verify button
Кнопка имеет custom_id welcome_accept:user_id, поэтому чужой участник не подтвердит доступ.
Role gate
Бот проверяет Manage Roles, hierarchy, missing roles и выдаёт доступ безопасно.
Больше информации картинками
Ниже полный сценарий: настройка, welcome-сообщение, карточка, кнопка, чужой клик, выдача ролей, success-сообщение, автоматическая очистка старых pending-сообщений и disabled-state.
Команды Discord
У модуля две админ-команды. Обычные пользователи не используют slash-команды: они просто нажимают кнопку в welcome-сообщении.
/welcome_setup welcome_channel:#верификация member_role:@УчастникСохраняет welcome_channel, member_role, member_role_ids, включает защиту от дублей и задаёт очистку старых pending-сообщений через 24 часа.
/welcome_testОтправляет тестовое welcome-сообщение для самого администратора. Удобно проверить картинку, кнопку, роль и disabled-state.
custom_id = "welcome_accept:{user_id}"Persistent-кнопка без отдельной View-класса. Обрабатывается listener-ом on_button_click.
MissingPermissions → "Команда доступна только администраторам"Обе команды требуют Administrator и работают только на сервере.
Путь новичка от входа до роли
member
guild
render
pending
verify
access
Guild-safe
Все настройки берутся из welcome_settings.json по guild_id. Серверы не смешиваются.
Verify lock
На время выдачи роли создаётся async lock по ключу guild_id:user_id, чтобы двойной клик не ломал процесс.
Success replace
После подтверждения старое welcome-сообщение может быть заменено или удалено, а JSON-record очищается.
Что видит новый участник
Что делает администратор
Выбирает канал
welcome_channel — место, куда бот отправляет welcome-сообщения.
Выбирает роли
member_role или member_role_ids — роли доступа после подтверждения.
Проверяет права
У бота должен быть Manage Roles, а выдаваемые роли должны быть ниже роли бота.
Запускает тест
/welcome_test показывает, как увидит сообщение новый пользователь.
Практический совет
Перед запуском подними роль HELPER выше роли @Участник. Иначе Discord не позволит боту выдать доступ, даже если настройки правильные.
Настройка на сайте
Dashboard хранит настройки в data/welcome_settings.json. Cog каждые 10 секунд смотрит deploy_requested, сбрасывает deploy attempts, фиксирует last_deploy_at и держит настройки в mtime-cache.
welcome_channelосновной канал приветствия.welcome_channel_id / WELCOME_CHANNEL_IDaliases канала.channel_idlegacy alias канала.member_roleглавная роль после проверки.member_role_idsнесколько ролей после проверки.verified_role_ids / welcome_role_idsaliases ролей.custom_titleзаголовок welcome embed.custom_descописание с шаблонами member/guild.custom_button_textтекст кнопки подтверждения.custom_footerfooter welcome embed.custom_colorцвет embed и fallback accent.custom_banner / welcome_bannerбаннер welcome или BannerManager.card_accent_coloraccent цвета welcome-карточки.welcomeосновной ключ.verification / verifyaliases верификации.verifкороткий alias.welcome_verificationединый alias.верификация / приветствиерусские aliases.Welcome-карточка с аватаром
Карточка генерируется через Pillow: фон, glow, сетка, круглый аватар, username, название сервера и номер участника. Renderer использует ProximaNova при наличии, а если шрифты не найдены — системные DejaVu/Liberation.
get_avatar_hashhash URL аватара.get_cache_pathguild/user/avatar_hash/member_count/style_version.CACHE_TTL_HOURS24 часа.cleanup_old_cacheудаляет старые картинки пользователя.render_semaphoreмаксимум 2 render-задачи одновременно.Безопасная выдача ролей
Перед выдачей бот собирает roles_to_add, missing_role_ids и all_configured_roles. Если у бота нет Manage Roles или роль выше/равна роли бота, пользователь получает понятную ошибку.
role_idsдолжны быть настроены, иначе просит /welcome_setup.member resolveполучает disnake.Member из inter.user или fetch_member.Manage Rolesбез права выдача невозможна.role hierarchyвыдаваемые роли должны быть ниже top_role бота.missing rolesесли часть role_id не найдена, это добавляется в success warning.Очистка старых сообщений и кэша
CACHE_DIRdata/cache/welcome.CACHE_TTL_HOURS24 часа.CARD_STYLE_VERSIONv4_no_status_single_banner.cleanup_old_cacheудаляет старые файлы welcome_card_*.png.Что хранится в welcome_messages.json
Эта запись нужна, чтобы удалить старый welcome-дубль или очистить неподтверждённое сообщение через TTL.
set_welcome_message_recordпосле отправки welcome.remove_welcome_message_recordпосле подтверждения или удаления.replace_welcome_messagesмассовое обновление после cleanup.JsonCachemtime-cache для чтения без лишних дисковых операций.Если модуль выключен
Отключение через module_states.json не удаляет welcome_settings.json, welcome_messages.json и кэш карточек. Оно только блокирует выдачу ролей и заменяет кнопку на безопасный красный disabled-state.
welcome_settings.jsonканал, роли, тексты, баннеры и цвета остаются.welcome_messages.jsonpending-записи не удаляются из-за выключения.cache/welcomeготовые карточки остаются до TTL.after enableпосле включения кнопка снова выдаёт роли.Карта технической логики
Экспортирует WelcomeCog и setup.
WelcomeCog, on_member_join, on_button_click, welcome_setup, welcome_test, cleanup loops и BannerManager hook.
WelcomeCardRenderer: avatar download/cache и генерация welcome-карточки через Pillow.
JsonCache, module state aliases, welcome_settings, welcome_messages и update helpers.
disabled embed/view, success embed и welcome verify button.
parse_bool, safe_int, parse_color, normalize_url, resolve_role_ids, template formatting и cache helpers.
SETTINGS_FILEwelcome_settings.jsonMESSAGES_FILEwelcome_messages.jsonMODULES_FILEmodule_states.jsonCACHE_DIRcache/welcomeCLEANUP24h / 30m loopDEPLOY5 attemptson_button_clickслушает custom_id welcome_accept:.target_user_idберётся из custom_id после двоеточия.verify lockasync lock на guild_id:user_id.resolve_role_idsподдерживает member_role_ids и legacy aliases.member.add_rolesвыдача ролей после всех проверок.on_banner_updatedреагирует на welcome / verification / verify.BannerManagerCog.get_bannerберёт баннер, если cog загружен.custom_bannerлокальный баннер из настроек.DEFAULT_BANNERfallback https://i.imgur.com/t54TUqH.jpeg.Ошибки и решения
/welcome_setup не сохраняет настройку
Проверьте, что команда вызвана администратором, канал текстовый, бот может отправлять сообщения и embed, а роль ниже роли бота.
Welcome-сообщение не отправляется
Проверьте welcome_channel / WELCOME_CHANNEL_ID, активность модуля welcome и права бота в канале.
Картинка не появилась
Проверьте загрузку аватара, Pillow/aiohttp и папку data/cache/welcome. Embed может отправиться без картинки, если renderer не смог её создать.
Роль не выдаётся
У бота должно быть Manage Roles, а выдаваемая роль должна быть ниже top_role бота. Также проверьте member_role_ids.
Пользователь нажал чужую кнопку
Это заблокировано: custom_id содержит user_id новичка, и бот сравнивает его с inter.user.id.
Старые welcome-сообщения висят в канале
Проверьте prevent_duplicate_welcome и welcome_cleanup_hours. pending_cleanup_loop работает каждые 30 минут.
После сайта ничего не поменялось
Проверьте deploy_requested, deploy_attempts, last_deploy_error и правильность ключей welcome_settings.json.
Модуль выключен, но настройки остались
Так и должно быть: module_states блокирует выдачу ролей, но настройки, pending-записи и кэш не удаляются.