RE:NODE

Minecraft10 мин чтения

Настройка DiscordSRV: чат Minecraft в Discord

Как связать сервер Minecraft с Discord через DiscordSRV: создание бота, intents, мост чата, безопасный канал консоли, привязка аккаунтов и синхронизация ролей.

0 прочтений

DiscordSRV - это плагин для Paper, который входит в Discord как бот и связывает ваш сервер с Discord вашего сообщества: игровой чат появляется в канале Discord, а сообщения из Discord - в игре, сообщения о входе, выходе, смерти и достижениях публикуются автоматически, канал консоли может показывать лог сервера и принимать команды, а игроки могут привязать аккаунты Minecraft и Discord, чтобы роли следовали за рангами. Настройка занимает около пятнадцати минут: создайте бота на портале разработчиков Discord, включите два привилегированных intents, пригласите бота, вставьте токен и ID каналов в config.yml и перезапустите сервер. Единственное, к чему стоит отнестись серьёзно, - канал консоли, потому что любой, кто может в нём писать, выполняет команды от имени консоли сервера.

Что делает DiscordSRV и чем он не является#

DiscordSRV работает внутри процесса сервера Minecraft. Это не отдельный бот, которого вы где-то хостите; аккаунт бота - лишь его личность в Discord. Когда сервер выключен, бот уходит в офлайн вместе с ним. Обычно это как раз то, что нужно, - его присутствие показывает, работает ли сервер, - но это же значит, что DiscordSRV не может сообщить о падении сервера. Сообщения о статусе, которые переживают выключение сервера, описаны в статье вебхуки Discord для статуса сервера.

ФункцияГде настраивается
Мост чата между игрой и Discordconfig.yml
Форматы сообщений чата, входов, смертейmessages.yml
Канал консолиconfig.yml
Привязка аккаунтов и доступ только для привязанныхlinking.yml
Синхронизация ролей и группsynchronization.yml
Собственные оповещения о событияхalerts.yml

DiscordSRV предназначен для серверов семейства Bukkit: Paper, Spigot, Purpur и подобных. Серверам на Fabric и NeoForge нужен другой мод (мост чата есть в нескольких модах сообщества); мост на уровне прокси для сетей на Velocity - отдельный проект. Проверьте, что существует для вашей платформы и версии, а не втискивайте плагин Paper в модовый сервер.

Создание бота Discord#

  1. Откройте Discord Developer Portal и создайте New Application. Назовите его в честь сервера: это имя увидят игроки.
  2. В разделе Bot сбросьте и скопируйте token. Это пароль бота. Показывается он один раз; если потеряете, сбросьте снова.
  3. На той же странице включите два Privileged Gateway Intents, которые нужны DiscordSRV: Server Members Intent и Message Content Intent. Без Message Content бот не может читать, что люди пишут в Discord, и мост работает только в одну сторону.
  4. В разделе OAuth2 воспользуйтесь генератором URL: scopes bot и applications.commands и права из таблицы ниже. Откройте сгенерированный URL и добавьте бота на свой сервер Discord.
ПравоЗачем нужно
View Channels, Read Message HistoryЧтение каналов моста
Send Messages, Embed Links, Attach FilesПубликация чата и событий
Manage WebhooksПоказ игроков с их собственным ником и скином
Manage RolesСинхронизация ролей
Manage NicknamesСинхронизация ников

Выдавайте только то, чем пользуетесь. Бот с правом Administrator означает полный захват вашего Discord, если токен утечёт, а токен лежит в обычном текстовом файле на игровом сервере.

Установка плагина и первый конфиг#

Положите jar DiscordSRV в plugins/, один раз запустите сервер, чтобы создалась plugins/DiscordSRV/, затем остановите его и отредактируйте config.yml. Ключи, которые важны для первой настройки:

plugins/DiscordSRV/config.yml (excerpt)
BotToken: "paste-the-bot-token-here"Channels: {"global": "112233445566778899"}DiscordConsoleChannelId: "998877665544332211"DiscordGameStatus: ["Minecraft"]Experiment_WebhookChatMessageDelivery: true

Что делает каждый из них:

  • `BotToken` - токен из шага 2.
  • `Channels` - сопоставляет игровые каналы чата с ID каналов Discord. global - основной игровой чат. Включите режим разработчика в настройках Discord, затем щёлкните по каналу правой кнопкой и выберите Copy Channel ID. Плагины со своими каналами чата (через интеграцию с плагином чата) могут добавить сюда больше записей.
  • `DiscordConsoleChannelId` - канал консоли, о нём ниже. Если он вам не нужен, оставьте заглушку из нулей.
  • `Experiment_WebhookChatMessageDelivery` - публикует игровой чат через вебхук, чтобы каждое сообщение показывало ник игрока и голову его скина, а не приходило всё от бота. Выглядит гораздо лучше, требует Manage Webhooks.

Настоящий файл длинный и снабжён комментариями, а имена ключей иногда меняются от версии к версии. Меняйте то, что нужно, остальное не трогайте. После перезапуска консоль должна показать, что DiscordSRV подключается, а бот должен появиться в Discord в сети.

Форматы сообщений лежат в messages.yml: формат чата Minecraft в Discord, чата Discord в Minecraft, сообщений о входе и выходе, смертях, достижениях, запуске и остановке сервера. Значения по умолчанию разумные. Чаще всего меняют формат сообщений из Discord в игру, делая их короче, чтобы они не переносились в игровом окне чата.

Мост чата: что передаётся, а что не должно#

По умолчанию всё, что сказано в глобальном чате, публикуется в Discord, а всё, что написано в привязанном канале Discord, появляется в игре. Несколько вещей стоит решить осознанно:

  • Упоминания. Игроки, пишущие в игре @everyone, не должны пинговать весь ваш Discord. DiscordSRV по умолчанию вырезает или блокирует массовые упоминания; проверьте, что это по-прежнему работает после изменения форматов.
  • Замученные игроки. Если игрок замучен в игре плагином модерации, его сообщения тоже не должны попадать в Discord. DiscordSRV учитывает отмену события чата, а большинство плагинов мутов делают именно это; проверьте.
  • Личные сообщения и чат персонала нельзя пробрасывать в публичный канал. По умолчанию они и не пробрасываются, потому что это не глобальный чат, - но интеграция с плагином чата может их сопоставить, так что, добавляя такую, проверьте Channels.
  • Пользователи только из Discord. Люди, которые есть в вашем Discord, но не на сервере, теперь могут общаться с игроками в игре. Часто в этом и смысл; но это и ещё одна область модерации. Модерация вашего Discord теперь распространяется на игровой чат.
  • Частота. Чат загруженного сервера, отправляемый в Discord по одному сообщению, может упереться в лимиты частоты Discord. DiscordSRV ставит сообщения в очередь и повторяет попытки, но на очень загруженных серверах подумайте о том, чтобы пробрасывать в публичный канал только входы, смерти и объявления, а полный чат держать в отдельном. Лимиты частоты и ошибки 429 объясняются в статье о вебхуках.

Канал консоли без риска#

Канал консоли публикует лог сервера в канал Discord и выполняет всё, что там написано, как команду консоли. Для персонала, сидящего с телефона, это очень удобно. И это же самая опасная функция плагина.

Если вы его всё-таки настраиваете:

  1. Закройте канал. Приватный канал, видимый только роли, которая есть только у владельцев. Проверяйте переопределения прав самого канала, а не только права роли: в Discord права можно выдать на уровне отдельного канала.
  2. Используйте чёрный список команд. В DiscordSRV есть настройки, которые блокируют команды из канала консоли или превращают список в белый, чтобы выполнялись только перечисленные команды. Белый список из нескольких безопасных команд (list, tps, say, kick) гораздо надёжнее чёрного списка опасных.
  3. Помните, что в логе есть секреты. IP-адреса игроков появляются в строках о входе, плагины иногда пишут в лог токены и пароли. Канал консоли копирует всё это в Discord, где оно хранится вечно и доступно для поиска.
  4. Подумайте, нужен ли он вообще. Если у вашего персонала уже есть доступ к панели, консоль панели делает ту же работу с правами для каждого пользователя и журналом действий. В RE:NODE субпользователям можно выдать доступ к консоли без доступа к файлам и оплате, а панель записывает, что делал каждый, - это более подотчётный способ дать персоналу консоль, чем общий канал в Discord. Как ограничить такой доступ, разобрано в статье субпользователи и минимальные привилегии.

Привязка аккаунтов#

Привязка связывает аккаунт Minecraft (UUID) с аккаунтом Discord. Она включает синхронизацию ролей и ников и позволяет требовать привязанный аккаунт для игры.

Стандартный порядок:

  1. Игрок пишет в игре /discord link.
  2. DiscordSRV показывает четырёхзначный код.
  3. Игрок отправляет этот код боту в личные сообщения.
  4. Аккаунты привязаны. /discord linked в игре показывает привязку.

Привязки хранит DiscordSRV - в своих файлах или в базе данных, если она настроена. Администраторы могут привязывать и отвязывать аккаунты командами; /discord без аргументов выводит доступные вам подкоманды.

Вход только с привязанным аккаунтом

В linking.yml есть опция, которая не пускает игроков без привязки и кикает их с сообщением, содержащим их код. Вместе с собственной верификацией Discord (аккаунты с подтверждённым телефоном или почтой, шаг проверки участников) это превращает ваш Discord в ворота к серверу: чтобы играть, нужно состоять в Discord и пройти его проверки. Настройки рядом позволяют требовать членства на сервере Discord и конкретных ролей.

Для сообщества, которое живёт в Discord, это разумная замена вайтлисту и барьер для всех остальных. Но это значит и то, что если бот не может достучаться до Discord, никто новый не сможет привязаться и зайти, - так что убедитесь, что персонал и существующий вайтлист продолжат работать при сбое Discord.

Синхронизация ролей и групп#

Если установлены Vault и плагин прав (LuckPerms), DiscordSRV может синхронизировать группы прав и роли Discord у привязанных игроков. Сопоставление лежит в synchronization.yml:

plugins/DiscordSRV/synchronization.yml (excerpt)
GroupRoleSynchronizationGroupsAndRolesToSync:  "vip": "223344556677889900"  "moderator": "334455667788990011"GroupRoleSynchronizationMinecraftIsAuthoritative: true

Имена групп слева - группы LuckPerms; числа - ID ролей Discord (копируются так же, как ID каналов). Настройка направления определяет, какая сторона побеждает при расхождении:

  • Главный Minecraft - купил VIP в игре, получил роль VIP в Discord. Обычный выбор, когда ранги приходят из магазина или за прогресс.
  • Главный Discord - выдали кому-то роль Moderator в Discord, и он получает группу модератора в игре. Удобно и рискованно: любой, кто может назначать роли в Discord, теперь может выдавать права в игре.

Синхронизируйте в направлении из Discord в игру только косметические или общественные роли. Никогда не синхронизируйте из Discord в игру группу с реальной властью - модерацию, администрирование, *. Тогда взломанный аккаунт модератора Discord становится взломанным сервером. Две независимые системы доверия надёжнее, чем одна, прикованная к другой. Как вообще строить эти группы, разобрано в статье о LuckPerms.

Самая высокая роль самого бота должна стоять в списке ролей Discord выше всех ролей, которыми он управляет, иначе изменения ролей будут молча проваливаться.

Производительность и типичные сбои#

DiscordSRV выполняет работу с Discord вне основного потока, поэтому правильно настроенный экземпляр на TPS не влияет. Что всё же может пойти не так:

Бот не появляется в сети. Неверный или отозванный токен, или не включены привилегированные intents. Ошибка в консоли при запуске говорит, что именно.

Сообщения идут из игры в Discord, но не обратно. Выключен Message Content Intent, или бот не видит канал. Проверьте и то и другое.

Игроки отображаются под именем бота, а не под своим. Доставка через вебхук выключена, или у бота нет права Manage Webhooks в этом канале.

Синхронизация ролей ничего не делает. Роль бота ниже ролей, которыми он управляет, игрок не привязан, или Vault не видит плагин прав. /discord debug загружает диагностический отчёт, в котором видно всё это; токен он вымарывает, но перед тем как кому-то показывать отчёт, всё равно прочитайте его.

Токен утёк. Немедленно сбросьте его на портале разработчиков - старый перестанет работать - и обновите config.yml. Затем проверьте журнал аудита вашего Discord на предмет действий бота, которые совершали не вы. Действуйте так, как описано в статье переменные окружения и секреты: токен - это пароль, а конфиги выкладывают в чатах поддержки чаще, чем кто-либо готов признать.

Бот работает внутри игрового сервера, поэтому собственный хостинг ему не нужен. Если вы из него вырастете - собственные команды, тикеты, инструменты модерации, - отдельный бот будет отдельной программой; этот путь описан в статье хостинг Discord-бота 24/7.

FAQ#

Нужно ли где-то хостить бота DiscordSRV?

Нет. Он работает внутри сервера Minecraft, поэтому он в сети всегда, когда работает сервер. На портале разработчиков Discord вы только создаёте аккаунт бота, чтобы получить токен.

Почему бот не читает сообщения из Discord?

На портале разработчиков не включён Message Content Intent, или у бота нет View Channels или Read Message History в этом канале. Включите intent, проверьте права канала и перезапустите сервер.

Может ли DiscordSRV работать в сети за прокси?

Каждый бэкенд может запускать свой DiscordSRV с одним и тем же токеном бота и одними и теми же каналами, и тогда чат каждого сервера попадает в один канал. Следите, чтобы канал консоли был только у одного из них, иначе команды будут выполняться не на том сервере.

Безопасен ли канал консоли?

Только если доступ к нему ограничен так же жёстко, как доступ к панели. Каждый, кто может туда писать, может выполнить любую команду консоли. Белый список команд уменьшает возможный ущерб; безопаснее всего обойтись без канала консоли вообще.

Можно ли требовать от игроков привязать Discord перед входом?

Да, через требование привязанного аккаунта в linking.yml. Непривязанных игроков кикает с кодом привязки, который они отправляют боту. Оставьте персоналу способ зайти на случай, если Discord или бот лежат.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000