StrangeCraft CMS PlaVER

Интеграции: Discord и OAuth

CMS умеет: вход и регистрацию через Discord и Яндекс, привязку Discord к аккаунту (с сайта, из Discord и прямо из игры), синхронизацию ролей Discord с группами LuckPerms и ролями сайта, «связанные роли» (Linked Roles), лог наказаний в канал Discord и slash-команды модерации.

Настройка Discord-приложения и бота

Одно Discord-приложение обслуживает всё: вход через Discord, привязки, роли и slash-команды.

Шаг 1. Создайте приложение

  1. Откройте Discord Developer Portal и нажмите New Application.
  2. На странице General Information скопируйте Application ID (он же Client ID) и Public Key.
  3. В разделе OAuth2 скопируйте Client Secret (кнопка Reset Secret, если скрыт).
  4. В разделе Bot создайте бота и скопируйте его Token. Бот работает через обычные HTTP-запросы к Discord — подключать привилегированные Gateway Intents не требуется.

Шаг 2. Впишите ключи в CMS

Откройте Админка → Настройки → Регистрация и вход:

  • Вход через Discord — включите;
  • Discord Client ID и Discord Client Secret — из шага 1;
  • Discord Redirect URI — CMS сама подставляет https://ваш-сайт/auth/discord/callback; скопируйте этот адрес в портал Discord: OAuth2 → Redirects → Add Redirect;
  • Discord Bot Token — токен бота (нужен и для Linked Roles, и для выдачи ролей).

Остальные настройки Discord — на вкладке Админка → Настройки → Discord:

  • ID сервера Discord (guild) — сервер, где бот выдаёт роли. Включите в Discord режим разработчика (Настройки → Расширенные), кликните правой кнопкой по серверу → «Копировать ID»;
  • Public Key приложения Discord — из General Information (нужен для slash-команд);
  • Webhook лога наказаний — URL вебхука канала (настройки канала → Интеграции → Вебхуки): туда будут уходить выдачи и снятия банов/мутов. Пусто — выключено;
  • Slash-команды наказаний (/ban, /unban, /mute, /unmute, /history) и slash-команды привязки (/link, /unlink) — отдельные переключатели.

Шаг 3. Если нужны slash-команды

  1. В приложении Discord (General Information) укажите Interactions Endpoint URL: https://ваш-сайт/api/discord/interactions — Discord сразу проверит адрес (подпись проверяется вашим Public Key, поэтому сначала сохраните его в настройках).
  2. Зарегистрируйте команды: выполните на сервере сайта php artisan discord:register-commands.
  3. Пригласите бота на свой сервер Discord. Для выдачи ролей ему нужно право Manage Roles, а его роль в списке ролей сервера должна стоять выше выдаваемых.

Команды наказаний доступны только тем, чей Discord привязан к аккаунту сайта с правом модерации; /link и /unlink — всем участникам.

Привязка ролей Discord к группам CMS

Раздел Админка → Связи групп — таблица соответствий «группа LuckPerms ↔ роль сайта ↔ роль Discord» (плюс необязательный числовой уровень группы для Linked Roles).

  1. Включите Настройки → Discord → «Синхронизация групп включена».
  2. В «Связях групп» добавьте строки: например, группа LuckPerms vip → роль сайта «VIP» → ID роли Discord.
  3. Изменение маппинга автоматически ставит полную синхронизацию в очередь; есть и кнопка ручного запуска.

Дальше всё само: купил игрок привилегию — получил группу LuckPerms, роль сайта и роль в Discord; привязал/отвязал Discord — роли выдались/снялись. Роли выдаёт бот (поэтому нужны guild ID, токен бота и права из шага 3).

Linked Roles (связанные роли)

Альтернатива ролям от бота: Discord сам выдаёт роль по условиям на метаданных аккаунта. CMS публикует 4 метаданных: «Аккаунт привязан», «Донатер» (по списку групп из настройки «Группы-донаты»), «На сайте с» и «Уровень группы» (наивысший уровень из «Связей групп» — так строится иерархия ролей без бота).

Настройка:

  1. Один раз выполните php artisan discord:register-metadata — схема метаданных зарегистрируется в Discord.
  2. В портале Discord (General Information → Linked Roles Verification URL) укажите: https://ваш-сайт/discord/linked-roles/verify.
  3. В Discord-сервере в настройках роли → Ссылки добавьте требование от вашего приложения (например, «Уровень группы ≥ 3»).
  4. Игрок в профиле на сайте нажимает «Подтвердить в Discord» (блок «Связанные роли Discord») — и получает роли. Название платформы в карточке игрока задаётся настройкой «Название платформы».

Метаданные всех привязанных пользователей можно обновить командой php artisan discord:sync-roles.

Вход через Discord и Яндекс

Поддерживаются два OAuth-провайдера: Discord и Яндекс. Каждый включается отдельно в Настройки → Регистрация и вход; кнопки входа появляются на страницах входа и регистрации.

Настройка Яндекса аналогична Discord: создайте приложение на oauth.yandex.ru, впишите в CMS Yandex Client ID и Yandex Client Secret, а показанный в настройках Yandex Redirect URI (https://ваш-сайт/auth/yandex/callback) скопируйте в поле Redirect URI приложения Яндекса.

Как это работает для игрока:

  • Первый вход через провайдера: CMS попросит придумать ник Minecraft (3–16 символов, латиница/цифры/подчёркивание) и создаст аккаунт без пароля.
  • Повторный вход — просто вход в существующий аккаунт.
  • Если email из провайдера уже занят аккаунтом сайта, автоматической привязки не будет (защита от захвата аккаунта): нужно войти с паролем и привязать провайдера из профиля.
  • Привязка из профиля: в личном кабинете блок с провайдерами — кнопки «Привязать»/«Отвязать». Отвязать единственный способ входа при отсутствии пароля нельзя — сначала нужно установить пароль сайта.
  • Один Discord/Яндекс-аккаунт привязывается только к одному аккаунту сайта.

Привязка Discord из игры

Игрок пишет в игре команду /discord (команда cms-plugin) и получает шестизначный код и кликабельную ссылку. Действуют 10 минут. Дальше два пути:

  1. По ссылке: клик открывает сайт — входить в аккаунт не нужно, ссылка сама опознаёт игрока — и сразу перекидывает на авторизацию Discord. После подтверждения: «Discord привязан — возвращайтесь в игру».
  2. По коду: игрок пишет в вашем Discord-сервере /link <код> (если включены slash-команды привязки) — бот привяжет его Discord к аккаунту. Привязка кодом не даёт сайту OAuth-токенов, поэтому метаданные Linked Roles подтянутся позже — после «Подтвердить в Discord» в профиле; роли из «Связей групп» работают сразу.

Отвязка из игры — /discord unlink (или /unlink в Discord, или из профиля на сайте). Все способы привязки работают с одной и той же записью, поэтому рассинхронизация невозможна.

Если у игрока ещё нет аккаунта сайта, команда /discord подскажет сначала зарегистрироваться (/register в игре или на сайте).

Discord-бот: команды и логи

Помимо синхронизации ролей, бот умеет:

  • Slash-команды модерации: /ban, /mute, /unban, /unmute, /history, /status (карточка игрока: статистика + наказания). Права проверяются по привязанному аккаунту сайта.
  • Лог наказаний в выбранный канал — с причиной, сроком и источником (сайт / игра / Discord).
  • Лог статуса серверов — сообщения при падении и подъёме.

Каналы указываются в Настройках → Discord; сообщения идут через бота (или вебхук, если бот не настроен).

Telegram-уведомления

Настройки → Telegram: бот пишет админам о новых оплаченных заказах, тикетах и падении/подъёме серверов. См. «Первые шаги → Telegram-уведомления».