RE:NODE

Discord Connector для Valheim: webhook, входы и смерти

Автор Команда RE:NODE
11 мин чтения


Discord Connector от nwesterhausen - обычный способ научить сервер Valheim общаться с Discord. Это плагин BepInEx, который работает только на выделенном сервере и отправляет сообщения в webhook Discord, когда сервер запускается, сохраняется и останавливается, когда игроки заходят, выходят, погибают, кричат или отмечают карту, и когда начинается случайный набег. Игрокам ничего устанавливать не нужно, поэтому мод работает и на кроссплей-серверах с игроками Xbox. Настройка состоит из трёх шагов: установить на сервер BepInEx и мод, создать webhook в Discord, вставить URL webhook в созданный конфиг и перезапустить. Затем потратьте пять минут на две настройки по умолчанию, которые большинству стоит изменить, - координаты игроков в сообщениях и упоминания, - пока ваша группа не узнала на горьком опыте, почему это важно.

Мод односторонний. Discord Connector отправляет сообщения из игры в Discord; он не переносит чат Discord обратно в игру и не позволяет выполнять команды из Discord.

Что Discord Connector делает и чего не делает#

Мод подключается к событиям сервера и превращает каждое в сообщение webhook. Текущий набор событий из документации мода:

ГруппаСобытия
Жизненный цикл сервераserverLaunch, serverStart, serverStop, serverShutdown, serverSave
МирnewDayNumber, eventStart, eventPaused, eventResumed, eventStop
ИгрокиplayerJoin, playerLeave, playerShout, playerPing, playerDeath
Первые разы игроковplayerFirstJoin, playerFirstLeave, playerFirstShout, playerFirstPing, playerFirstDeath
Таблицы лидеровactivePlayers, от leaderboard1 до leaderboard5

Эти названия понадобятся позже, когда вы будете направлять события в разные каналы. Помимо сообщений, мод ведёт небольшую базу данных об активности игроков, которая питает таблицы лидеров вроде числа смертей или времени в сети, и может объявлять "первые разы" - например, первую смерть игрока на сервере.

Чем он не является:

  • Не мост между чатами. Сообщения идут только из Valheim в Discord. Ничего из набранного в Discord в игру не попадает.
  • Не бот. Он использует webhook, поэтому нет ни аккаунта бота, ни слэш-команд, ни удалённого администрирования. Для этого см. Боты Discord для администрирования игровых серверов.
  • Не клиентский мод. Его никогда не нужно ставить на компьютеры игроков, и он не появляется в проверках версий. Его добавление не влияет на то, кто может зайти.

Последнее делает его одним из самых безопасных модов. Он ничего не меняет в игровом процессе, поэтому не вызовет рассинхронизацию мира и не выкинет никого из-за несовпадения версий. Если плагин сломается после обновления игры, худший случай - сервер не запустится, пока вы его не удалите, поэтому записывайте, что именно установлено.

Прежде чем начать: BepInEx на сервере#

Discord Connector - плагин BepInEx, поэтому сначала на сервере нужен BepInExPack для Valheim. В нативной установке на Linux это значит распаковать пакет в корневую папку сервера - вы получите каталог BepInEx, doorstop_libs и скрипт start_server_bepinex.sh, который становится командой запуска. В Docker с образом lloesche/valheim-server задайте BEPINEX=true. На панели либо используйте вариант игры с BepInEx, если ваш хостинг его предлагает, либо загрузите пакет через файловый менеджер и измените команду запуска. Все три способа описаны в статье Моды Valheim с BepInEx на сервере.

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

Установка мода#

  1. Скачайте Discord Connector с Thunderstore (пакет называется nwesterhausen-DiscordConnector). Если ваша группа пользуется r2modman, можно установить его в профиль и скопировать файлы оттуда, но на сервере нужны только сами файлы.
  2. Остановите сервер.
  3. Откройте zip. Скопируйте содержимое его папки plugins в BepInEx/plugins/ на сервере. В некоторых версиях больше одного .dll - копируйте все, они работают вместе.
  4. Запустите сервер, дайте ему полностью загрузиться, затем чисто остановите его.

При первом запуске мод создаёт конфигурацию. Начиная с версии 2.1.0 он использует отдельную папку, а не один файл:

code
BepInEx/config/games.nwest.valheim.discordconnector/  discordconnector.cfg               main settings, webhooks  discordconnector-messages.cfg      the text of each message  discordconnector-toggles.cfg       which messages and details are on  discordconnector-variables.cfg     custom variables for messages  discordconnector-leaderBoards.cfg  leaderboard definitions  config-debug.json                  a dump of the config, webhooks redacted  records.db                         player activity database

В BepInEx/LogOutput.log должна быть строка о загрузке плагина с его версией, примерно такая: Loading [DiscordConnector 3.1.0]. Если папка не создалась, плагин не загрузился - см. раздел о решении проблем.

Создание webhook в Discord#

Webhook - это URL, который позволяет всему, что им обладает, писать в один канал. Вам нужно право Manage Webhooks на сервере Discord.

  1. В Discord откройте настройки канала, в который должны идти сообщения.
  2. Перейдите в Integrations, затем Webhooks, затем New Webhook.
  3. Дайте ему имя и, если хотите, аватар - мод может переопределить и то и другое.
  4. Скопируйте URL webhook.

Создавайте отдельный webhook для каждого канала, в который нужны сообщения. Обычная схема: один публичный канал для активности игроков и один закрытый канал для админов с сообщениями о жизненном цикле сервера. О webhook подробнее, включая ограничения скорости, рассказано в статье Webhook Discord для статуса сервера.

Основной файл конфигурации#

Откройте discordconnector.cfg. Файлы конфигурации BepInEx - обычный текст, над каждой настройкой стоит комментарий с её описанием и значением по умолчанию. Значения не берутся в кавычки. Настройки, важные в первый день:

discordconnector.cfg (relevant lines)
Webhook URL = https://discord.com/api/webhooks/REPLACE/MEWebhook Events = ALLWebhook Username Override = ValheimSecondary Webhook URL =Secondary Webhook Events = ALLSend Positions with Messages = falseAllow Mentions for @here and @everyone = falseAllow Role Mentions = falseAllow User Mentions = falseIgnored Players =Collect Player Stats = trueAnnounce Player Firsts = true

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

КлючПо умолчаниюЧто делает
Webhook URLпустоОсновной webhook. Пока он не задан, ничего не отправляется
Webhook EventsALLКакие события идут в основной webhook
Secondary Webhook URLпустоНеобязательный второй webhook
Secondary Webhook EventsALLКакие события идут во второй webhook
Webhook Username OverrideпустоИмя, показываемое в сообщениях
Webhook Avatar OverrideпустоURL изображения для аватара
Use fancier discord messagesfalseИспользует embed, в основном для подробностей о положении
Send Positions with MessagestrueДобавляет в сообщения координаты
Collect Player StatstrueЗаписывает активность в records.db
Announce Player FirststrueПубликует первый вход игрока, первую смерть и так далее
Ignored PlayersпустоИмена, которые нужно пропускать, через ;
Ignored Players (Regex)пустоРегулярное выражение .NET для имён, которые нужно пропускать
Allow Mentions for @here and @everyonefalseРазрешает сообщениям упоминать всех
Allow Role MentionstrueРазрешает сообщениям упоминать роли
Allow User MentionstrueРазрешает сообщениям упоминать пользователей

Названия ключей и значения по умолчанию менялись между крупными версиями мода. Если ваш файл отличается от этой таблицы, прав ваш файл для вашей версии - комментарии над каждой настройкой являются документацией, которая соответствует ей. После редактирования перезапустите сервер, чтобы новые значения были прочитаны.

Распределение событий по разным каналам#

Webhook Events принимает либо ALL, либо список названий событий через точку с запятой. Помимо отдельных названий из первой таблицы, есть сокращения: serverLifecycle (launch, start, stop, shutdown), eventLifecycle (начало, пауза, возобновление и конец набега), playerAll, playerFirstAll и leaderboardsAll.

Разумное разделение для группового сервера:

discordconnector.cfg (two channels)
# #valheim - what players care aboutWebhook URL = https://discord.com/api/webhooks/1111/aaaaWebhook Events = playerAll;playerFirstAll;eventLifecycle;leaderboardsAll# #server-admin - what admins care aboutSecondary Webhook URL = https://discord.com/api/webhooks/2222/bbbbSecondary Webhook Events = serverLifecycle;serverSave

Маршрутизация лишь решает, куда пойдёт сообщение. Отправляется ли оно вообще, решает discordconnector-toggles.cfg, в котором есть разделы для сообщений, положений, статистики и отладочного вывода. Если вы направили serverSave в канал, а ничего не появляется, скорее всего, сообщение о сохранении выключено в файле переключателей. Сообщения о сохранении шумные - одно на каждый интервал сохранения, - поэтому лучше оставить их выключенными или отправлять только в админский канал.

Свои тексты сообщений#

В discordconnector-messages.cfg лежит текст каждого события. Сообщения об игроках по умолчанию - простые строки:

discordconnector-messages.cfg (player messages)
Player Join Message = %PLAYER_NAME% has joined.Player Leave Message = %PLAYER_NAME% has left.Player Death Message = %PLAYER_NAME% has died.Player Ping Message = %PLAYER_NAME% pings the map.Player Shout Message = %PLAYER_NAME% shouts **%SHOUT%**.

Поместите несколько сообщений в одну настройку через ;, и мод будет выбирать случайное каждый раз:

ini
Player Death Message = %PLAYER_NAME% has gone to Valhalla.;%PLAYER_NAME% died. Again.;Odin claims %PLAYER_NAME%.

Разметка Discord в сообщениях работает, так что **жирный** в Discord будет жирным. Доступные переменные:

ПеременнаяЗначение
%PLAYER_NAME%Имя персонажа
%PLAYER_ID%Идентификатор игрока на платформе (%PLAYER_STEAMID% - старое название)
%POS%Координаты игрока
%SHOUT%Выкрикнутый текст, только в сообщениях о крике
%WORLD_NAME%Мир, доступно после его загрузки
%NUM_PLAYERS%Игроков в сети
%DAY_NUMBER%Игровой день
%JOIN_CODE%Код подключения кроссплея, пусто без кроссплея
%PUBLICIP%Публичный адрес сервера
%TIMESTAMP%Метка времени Discord, показываемая в часовом поясе каждого читателя
от %VAR1% до %VAR10%Ваши значения из discordconnector-variables.cfg

Две из них стоит использовать осознанно. %JOIN_CODE% в сообщении о запуске сервера решает проблему кроссплея, при которой код подключения меняется при каждом перезапуске: новый код сам попадает в Discord. А пользовательские переменные позволяют хранить один фрагмент текста - адрес сервера, ссылку на правила - в одном месте и использовать его в разных сообщениях. Имейте в виду, что %PUBLICIP% получается из внешнего сервиса при запуске сервера, поэтому он зависит от того, разрешены ли серверу исходящие соединения. Как работает код подключения, объясняет статья Кроссплей Valheim и игроки Xbox.

Приватность, упоминания и таблицы лидеров#

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

Положения. Send Positions with Messages по умолчанию равно true, поэтому сообщения о входе, выходе, смерти, крике и отметке несут координаты. На частном сервере среди друзей это удобно - сообщение о смерти с координатами служит бесплатной меткой надгробия. На PvP-сервере или любом публичном сервере это публикует, где у каждого база и где каждый игрок выходит из игры. Отключите это глобально или используйте раздел положений в файле переключателей, чтобы оставить только для смертей.

Упоминания. Упоминания ролей и пользователей по умолчанию разрешены, и документация прямо говорит, что ввод игроков не фильтруется. Крик, содержащий упоминание роли, может через webhook пинговать эту роль. Отключите упоминания ролей и пользователей, если они не нужны, а если нужны, используйте Specifically Allowed Role Mentions и Specifically Allowed User Mentions, чтобы перечислить точные идентификаторы, которые можно упоминать. @here и @everyone держите выключенными.

Админы и боты. Ignored Players принимает список имён, которые нужно исключить из сообщений, а Ignored Players (Regex) - шаблон. Используйте это для админских персонажей, которых вы не хотите объявлять, или для NPC, которых некоторые моды регистрируют как игроков.

База данных игроков хранит также идентификаторы платформ рядом с именами. Для таблицы лидеров это нормально, но это личные данные; если у вашего сообщества есть правила об этом, Collect Player Stats = false отключает сбор.

Таблицы лидеров

Файл таблиц лидеров определяет до пяти пользовательских таблиц плюс таблицу активных игроков, каждая отправляется по таймеру. Каждая выбирает статистику - смерти, входы, время в сети и так далее, - временной диапазон и число записей. Они читают данные из records.db, поэтому требуют включённого Collect Player Stats. Еженедельная таблица "больше всего смертей" - надёжный источник шуток для группы; ежедневную игнорируют. Начните с одной и посмотрите, будет ли её кто-нибудь читать.

How to discern players in Record Retrieval определяет, как таблица ведёт счёт: по идентификатору платформы, по имени персонажа или по обоим. Значение по умолчанию, PlayerId, объединяет всех персонажей игрока в одну запись. Выберите Name, если каждый персонаж должен считаться отдельно.

Решение проблем#

Папка конфигурации не появилась. Плагин не загрузился. Проверьте в BepInEx/LogOutput.log строку о загрузке плагина. Если самого BepInEx в логе нет, сервер запускается без него - проверьте команду запуска. Если BepInEx загрузился, а плагин выдаёт ошибку, убедитесь, что версия плагина поддерживает текущую версию игры и что вы скопировали все файлы из папки plugins в zip.

Конфигурация есть, но в Discord ничего не приходит. Проверьте по порядку: URL webhook полный и без кавычек, событие есть в Webhook Events, сообщение включено в файле переключателей, а сервер может выполнять исходящие соединения HTTPS. Задайте Log Debug Messages = true, перезапустите, и лог расскажет, что мод пытался отправить.

Сообщения перестали приходить после обновления Valheim. Возможно, плагин нужно обновить. Посмотрите его страницу на Thunderstore и список изменений. Моды, не затрагивающие игровой процесс, обычно обновляются быстро, но не всегда в тот же день. Общий порядок действий описан в статье Что делать, когда обновление мода всё сломало.

Дублирующиеся сообщения. Обычно в BepInEx/plugins две копии плагина - одна в подпапке от более ранней установки. Удалите старую.

Discord показывает "rate limited" или теряет сообщения. Слишком много событий в один webhook за короткое время, обычно сохранения или отметки на загруженном сервере. Отключите шумные или разделите их между webhook. Если вам нужна запись каждого события, она уже есть в логе сервера - см. чтение лога сервера Valheim.

FAQ#

Нужно ли игрокам устанавливать Discord Connector?

Нет. Он работает только на выделенном сервере. Игроки подключаются с немодифицированной игрой, включая игроков Xbox и Game Pass на кроссплей-сервере.

Может ли Discord Connector отправлять чат Discord в игру?

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

Где находится файл конфигурации Discord Connector?

В BepInEx/config/games.nwest.valheim.discordconnector/, создаётся при первом запуске после установки мода. Основной файл - discordconnector.cfg; сообщения, переключатели, переменные и таблицы лидеров лежат в отдельных файлах рядом с ним.

Как опубликовать в Discord код подключения кроссплея?

Добавьте %JOIN_CODE% в сообщение о запуске сервера в discordconnector-messages.cfg. Код подставляется после загрузки мира, а поскольку новый код создаётся при каждом перезапуске, сообщение само поддерживает Discord в актуальном состоянии.

Безопасно ли оставлять положения включёнными?

На небольшом частном сервере - да. На публичном или PvP-сервере - нет: координаты в сообщениях о входе, выходе и смерти показывают всем, где базы и игроки. Отключите Send Positions with Messages или ограничьте его смертями.