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 не работает, ничего из дальнейшего тоже не сработает, а ошибка будет выглядеть как вина мода, хотя это не так.
Установка мода#
- Скачайте Discord Connector с Thunderstore (пакет называется
nwesterhausen-DiscordConnector). Если ваша группа пользуется r2modman, можно установить его в профиль и скопировать файлы оттуда, но на сервере нужны только сами файлы. - Остановите сервер.
- Откройте zip. Скопируйте содержимое его папки
pluginsвBepInEx/plugins/на сервере. В некоторых версиях больше одного.dll- копируйте все, они работают вместе. - Запустите сервер, дайте ему полностью загрузиться, затем чисто остановите его.
При первом запуске мод создаёт конфигурацию. Начиная с версии 2.1.0 он использует отдельную папку, а не один файл:
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.
- В Discord откройте настройки канала, в который должны идти сообщения.
- Перейдите в Integrations, затем Webhooks, затем New Webhook.
- Дайте ему имя и, если хотите, аватар - мод может переопределить и то и другое.
- Скопируйте URL webhook.
Создавайте отдельный webhook для каждого канала, в который нужны сообщения. Обычная схема: один публичный канал для активности игроков и один закрытый канал для админов с сообщениями о жизненном цикле сервера. О webhook подробнее, включая ограничения скорости, рассказано в статье Webhook Discord для статуса сервера.
Основной файл конфигурации#
Откройте discordconnector.cfg. Файлы конфигурации BepInEx - обычный текст, над каждой настройкой стоит комментарий с её описанием и значением по умолчанию. Значения не берутся в кавычки. Настройки, важные в первый день:
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 Events | ALL | Какие события идут в основной webhook |
Secondary Webhook URL | пусто | Необязательный второй webhook |
Secondary Webhook Events | ALL | Какие события идут во второй webhook |
Webhook Username Override | пусто | Имя, показываемое в сообщениях |
Webhook Avatar Override | пусто | URL изображения для аватара |
Use fancier discord messages | false | Использует embed, в основном для подробностей о положении |
Send Positions with Messages | true | Добавляет в сообщения координаты |
Collect Player Stats | true | Записывает активность в records.db |
Announce Player Firsts | true | Публикует первый вход игрока, первую смерть и так далее |
Ignored Players | пусто | Имена, которые нужно пропускать, через ; |
Ignored Players (Regex) | пусто | Регулярное выражение .NET для имён, которые нужно пропускать |
Allow Mentions for @here and @everyone | false | Разрешает сообщениям упоминать всех |
Allow Role Mentions | true | Разрешает сообщениям упоминать роли |
Allow User Mentions | true | Разрешает сообщениям упоминать пользователей |
Названия ключей и значения по умолчанию менялись между крупными версиями мода. Если ваш файл отличается от этой таблицы, прав ваш файл для вашей версии - комментарии над каждой настройкой являются документацией, которая соответствует ей. После редактирования перезапустите сервер, чтобы новые значения были прочитаны.
Распределение событий по разным каналам#
Webhook Events принимает либо ALL, либо список названий событий через точку с запятой. Помимо отдельных названий из первой таблицы, есть сокращения: serverLifecycle (launch, start, stop, shutdown), eventLifecycle (начало, пауза, возобновление и конец набега), playerAll, playerFirstAll и leaderboardsAll.
Разумное разделение для группового сервера:
# #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 лежит текст каждого события. Сообщения об игроках по умолчанию - простые строки:
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%**.Поместите несколько сообщений в одну настройку через ;, и мод будет выбирать случайное каждый раз:
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 или ограничьте его смертями.


