HELPER REACTION ROLES РОЛИ ЗА РЕАКЦИИ /ROLEPANEL / EMOJI → ROLE / MESSAGE_ID SYNC / ADMIN MENU
Reaction Roles превращает выдачу ролей в понятную Discord-плашку: пользователь ставит emoji под сообщением и получает нужную роль. Администратор настраивает панели через сайт или через кнопку ⚙️ Управление, а HELPER обновляет уже опубликованное сообщение по message_id, не создавая дублей.
Что делает Reaction Roles
Модуль создаёт одну или несколько ролевых панелей. У каждой панели есть канал, сообщение, красивый embed, список связок emoji → role, режим снятия ролей, админ-кнопка и статус открытия. Пользователь взаимодействует без slash-команд — просто нажимает реакцию.
Панель
Администратор выбирает канал, текст, баннер, цвет и список ролей.
Emoji
Каждая реакция привязана к конкретной Discord-роли.
Реакция
При добавлении реакции бот выдаёт роль, при удалении может снять её.
Sync
Сайт ставит deploy_requested, а cog редактирует старую плашку.
Больше информации картинками
Полный путь: создание панели, добавление emoji → role, публичная плашка, реакция игрока, админ-меню, add-only режим, web-sync и закрытый disabled-state.
Команда Discord
В текущем модуле основная команда одна. Всё остальное вынесено в кнопки, select-меню и modal-окна, чтобы не плодить десятки slash-команд.
/rolepanel channel:#получение-ролейСоздаёт первую панель или открывает админ-меню первой существующей панели. Доступно администраторам сервера.
on_raw_reaction_add → add role
on_raw_reaction_remove → remove role if allow_remove=trueОбычный пользователь не вводит команды: он нажимает emoji под сообщением.
RolePanelPublicView → open_admin_menu → RolePanelAdminViewКнопка открывает private admin menu, если пользователь проходит can_manage_panel.
AddReactionRoleItemModal
DeleteReactionRoleItemModal
EditRolePanelTextModal
RoleEmojiPickerViewНастройка ролей и текста происходит без ручного редактирования JSON.
Путь роли от emoji до доступа
message_id
reaction
system/item
state/role
add/remove
Discord perms
Anti-duplicates
send_or_edit_panel редактирует старое сообщение по message_id и last_channel_id.
Hash sync
panel_hash сравнивает важные поля и не деплоит лишний раз.
Safe reaction
Если модуль или item выключен — реакция пользователя удаляется, а роль не выдаётся.
Что видит обычный участник
Что делает администратор
Создаёт роли
@Новости, @Розыгрыши, @Клиенты, @Boosty или любые роли доступа.
Настраивает панель
Канал, embed, баннер, цвет, auto legend и show admin button.
Добавляет emoji
Через сайт, modal или RoleEmojiPickerView выбирает emoji → роль.
Проверяет права
Роль бота должна быть выше выдаваемых ролей и иметь Manage Roles.
Практический совет
Сначала создай роли и выставь роль бота выше них, потом создавай плашку. Тогда HELPER сразу сможет проверить role_is_assignable и добавить реакции.
Настройка на сайте
Сайт хранит панели в data/reaction_roles_settings.json. Когда владелец меняет настройки, сайт ставит deploy_requested, а cog каждые 5 секунд синхронизирует Discord.
id / nameвнутренний ID и название панели.enabledоткрыта или закрыта конкретная плашка.channel_idканал публикации.message_id / last_channel_idсвязка с Discord-сообщением для edit без дублей.allow_removeможет ли пользователь снять роль сам.admin_role_idsдополнительные роли управления панелью.authorверхняя подпись панели.titleзаголовок embed.descriptionосновной текст.footerниз карточки + online/closed.image_url / thumbnail_urlбаннер и миниатюра.colorцвет embed-линии.Emoji, роли и описание
Хорошая ролевая плашка должна не просто показать emoji, а объяснить, какую роль получит участник и какой доступ она открывает.
emojiUnicode или custom emoji вида <:name:id>.role_idроль, которую выдаёт бот.labelкрасивое название в легенде.descriptionобъяснение, зачем нужна роль.enabledможно временно отключить отдельную связку.Снятие ролей на уровне панели
В v13 снятие роли контролируется всей плашкой, а не отдельной emoji-связкой. Это убирает конфликт, когда у разных item внутри одной панели были разные правила.
Где это видно
В auto legend появляется подсказка “🔒 нельзя снять самому”, а в admin menu есть кнопка “Снятие ролей”.
Права бота и типовые ошибки
Manage Roles
Без этого права бот не сможет выдавать и снимать роли.
Role position
Роль HELPER должна быть выше всех ролей, которые он выдаёт.
Add Reactions
Чтобы сам бот добавил emoji под embed-плашку.
Read History
Нужно для корректной работы reaction events и редактирования старых сообщений.
role_not_foundроль удалена или ID неверный.managed_roleроль интеграции нельзя выдать вручную.role_too_highроль выше или равна роли бота.missing_permissionsнет Manage Roles.administratorадминистратор сервера.manage_guildправо управления сервером.manage_rolesправо управления ролями.admin_role_idsдополнительные роли, указанные в панели.Если модуль выключен
Глобальный тумблер сайта меняет module_states.json. После этого cog пересинхронизирует опубликованные панели: embed становится красным, а реакции больше не выдают роли.
reaction_rolesосновной ключ.reaction-rolesalias для старых сохранений.role_panels / role-panelalias панели ролей.roleslegacy alias, проверяется последним.Карта технической логики
data/reaction_roles_settings.json — панели, items, embed, deploy.
data/module_states.json — глобальное включение/выключение.
site_sync_loop, deploy_system, reaction listeners и /rolepanel.
normalize_system, normalize_items, panel_hash и safe migrations.
public manage button, admin menu, role/emoji picker и modal-редактирование.
MAX_SYSTEMS25 панелейMAX_ITEMS20 emojiSYNC5 секундDEPLOY5 попытокSELECT25 optionsALLOWpanel leveldeploy_requestedсайт или modal просит обновить панель.panel_hashсравнение важных полей панели.send_or_edit_paneledit старого сообщения или send нового.sync_reactionsудаляет лишние реакции и добавляет актуальные.save_full_guild_settingsсохраняет message_id и last_channel_id.emoji_keyнормализация emoji.find_system_and_itemпо message_id + emoji.is_module_activeглобальное состояние модуля.role_is_assignableправа и позиция роли.add_roles/remove_rolesитоговое действие Discord.Ошибки и решения
Пользователь ставит реакцию, но роль не выдаётся
Проверьте, что модуль включён, панель enabled, item enabled, роль существует, а роль бота выше выдаваемой роли.
Плашка дублируется
Проверьте message_id и last_channel_id в settings. Если старое сообщение удалено или недоступно, бот создаст новое и сохранит новый ID.
Бот не может добавить custom emoji
У бота должен быть доступ к этому emoji. Внешние/Nitro emoji не обходятся.
Почему роль не снимается после удаления реакции?
На панели может быть allow_remove=false. Тогда пользователь может убрать реакцию, но роль остаётся до ручного снятия администратором.
Сайт сохранил, но Discord не обновился
Проверьте deploy_attempts, last_deploy_error и права бота в канале: View Channel, Send Messages, Embed Links, Add Reactions, Read Message History.
Кто может открыть ⚙️ Управление?
Администраторы, пользователи с Manage Guild / Manage Roles или роли, указанные в admin_role_ids конкретной панели.