Назначение этого плагина
Этот плагин выполняет несколько задач:
-
Позволяет использовать ваш сервер Discourse для управления ботом Discord, связывая две системы. Разветвите этот репозиторий и расширьте его с помощью простого Ruby, чтобы создать всевозможный функционал бота.
-
Существующий функционал служит примерами и полезными утилитами:
- Обеспечивает двустороннюю автоматическую публикацию контента, соответствующего определенным критериям.
- Команда для разовой копирования сообщений в Discourse.
- Команда для синхронизации членства в группах с ролями вашего сервера Discord и экземпляра Discourse.
Плагин предоставляет расширяемый каркас, на основе которого вы можете создать дополнительные функции. Приветствуются PR с общедоступными улучшениями.
это не команды синхронизации, а лишь иллюстрация возможного взаимодействия бота. Вторая команда на скриншоте была устаревшей в процессе разработки
Настройка неизбежно сложна, но она отлично подходит для фанатов обеих систем, готовых потратить время на понимание того, как работает каждая из них, хотя бы на функциональном и концептуальном уровне. Чтобы извлечь максимум из этого плагина, вам необходимо понимать основы управления пользователями в Discourse и Discord.
Команды бота
Существует четыре команды:
- Ping!
- !disckick
- !discsync
- !disccopy
Ping!
Чтобы проверить, отвечает ли бот, просто введите «Ping!», и бот должен ответить «
: Pong!» — чудесно, не так ли?
(кстати, это немного мем!)
!disckick <min_trust_level: по умолчанию 2>
Ввод этой команды выгонит любого пользователя, существующего в вашем Discourse, но имеющего Уровень доверия (Trust Level) ниже указанного вами значения. По умолчанию, если значение не указано, оно равно 2.
Например:
!discsync <clean up: по умолчанию false, min_visibility: по умолчанию 0, include automated groups: по умолчанию false>
Эта команда попытается скопировать все группы в Роли на Discord, соответствующие заданным критериям (или значениям по умолчанию, если они не указаны). Затем она попытается наполнить роли в соответствии с членством в группах в Discourse. Это односторонняя синхронизация. Данные в Discourse никогда не изменяются.
!disccopy <number_of_messages> <optional_target_category_name> <optional_target_topic_name>
Позволяет копировать историю сообщений Discord в ваш экземпляр Discourse прямо из чата Discord. Это может обрабатывать тысячи сообщений за один раз (но для такого объема потребуется время).
Двусторонняя связь
Вот настройки:
- Вы можете назначить канал «Объявления» (Announcements Channel) на Discord в настройках плагина.
- Теперь вы можете вводить сообщения в назначенный канал «Объявления» на Discord, и они будут опубликованы в назначенной теме Discourse в настройках плагина.
- Вы можете настроить список категорий в Discourse для публикации в канал «Объявления» на вашем Discord, если кто-то там публикует пост или создает новую тему (одно или оба действия).
- Автоматическая копия чата по сообщениям, от канала к любой категории с идентичным именем в Discourse: если имя канала совпадает с именем категории, сообщение будет скопировано в Discourse.

Кроме того, я добавил новый файл для управления событиями Discord, поддерживаемыми API discordrb, где логика «Объявлений» является первым примером (не стесняйтесь разрабатывать новые и отправлять PR, если они будут полезны сообществу).
NB: Для любого сообщения, скопированного из Discord в Discourse, пользователь будет отображаться корректно, если этот пользователь вошел в Discourse через вход с помощью Discord (так что бот Discord может сопоставить пользователей).
Состояние этого плагина
Это сложный плагин для настройки. Это было неизбежно.
Однако, после запуска он используется как игра для детей.
Рассматривайте код как находящийся в бета-версии. Он протестирован, даже в продакшене, но, вероятно, содержит ошибки. Я рекомендую сначала протестировать его на новом сервере Discord, прежде чем применять к вашему основному серверу «Production», если вы только начинаете.
Любые ошибки с большей вероятностью повлияют на ваш экземпляр Discord, чем на Discourse, так как в Discourse не вносятся изменения. Однако я написал его так, чтобы большинство проблем можно было исправить, просто повторив действие. Discourse используется как мастер для информации о членстве и группах, и эти данные используются для обновления членства и ролей на вашем сервере Discord.
Инструкции по настройке
Предварительные требования
- Сервер Discord, где вы являетесь администратором.
- Приложение Discord (см. ниже).
- Бот Discord (см. ниже).
- SSH-доступ root к вашему серверу Discourse.
- Обновления файла app.yml для установки плагина.
- Все пользователи вашего Discourse должны войти, используя вход через Discord OAuth, который появится на вашей странице входа после установки плагина.
Приложение Discord
Перейдите сюда и создайте приложение:
Нажмите «New Application».
Вам нужно создать бота, и он будет выглядеть примерно так (оставьте его не «public»):
Вам нужно авторизовать бота в браузере, см. OAuth2 - Documentation - Discord
После настройки бота скопируйте Токен. Вам нужно будет ввести его в Discourse позже.
Изменения в app.yml
плагин
Вам нужен только один плагин, так как Discord Social Login теперь является частью ядра Discourse (ура
)
Затем в командной строке выполните ./launcher rebuild app, как обычно.
Это должно работать, без проблем.
Вы можете получить ошибки в консоли и логах, указывающие на сбой бота при первой сборке, так как вы еще не ввели учетные данные бота в передней части настроек Discourse. (более изящная обработка этого — задача на будущее, я удалю эту часть, когда это будет сделано). Это не нанесет вреда, и сам Discourse будет работать нормально.
После входа в административную панель Discourse перейдите в «Настройки плагина» и заполните следующие поля:
Вы получите ID из интерфейса Discord. Вам нужно будет активировать «Режим разработчика» (Developer Mode), чтобы скопировать эти ID. В Discord перейдите в Настройки → Внешний вид → РАСШИРЕННЫЕ и включите «Режим разработчика»:
Затем вы можете получить ID из интерфейса, например:
Вам также нужно будет заполнить настройки OAuth Discord. Client ID и Secret взяты из того же самого приложения Discord.
После настройки вернитесь к корневой подсказке в Linux и введите:
./launcher restart app
Если вы правильно настроили серверы Discord и Discourse, вы увидите, как бот присоединится к серверу.
Если бот когда-либо упадет (он станет неактивным), вам нужно будет сделать то же самое, чтобы вернуть его. Улучшение независимости бота от основного сервера Discourse — задача на будущее. Тем не менее, я запускал бота в продакшене долгое время, и он еще не падал.
Будущие команды?
Если у вас есть идея для другой команды, использующей связь между Discourse и Discord, которая, по вашему мнению, будет полезна широкому сообществу, сообщите мне в ответах, и мы рассмотрим возможность ее реализации. NB: этот бот не предназначен для выполнения задач вне рамок Discourse.
Ограничения
Основная цель этого плагина — позволить пользователю создать бота на своем Discord, который будет управляться сервером Discourse и сможет выполнять некоторые базовые функции управления членством. Он также предоставляет основу для любых дополнительных взаимодействий типа бота между двумя системами в будущем. Часть мотивации использования ботов заключается в том, что они просто веселы.
Команды бота по своей природе являются разовыми.
Известные проблемы
-
Бот запустит собственный экземпляр, если вы войдете в сеанс rails console на сервере. Это приведет к тому, что бот будет казаться, что отвечает дважды (но на самом деле теперь есть два бота). В rails console просто остановите дополнительный бот, введя:Теперь это больше не должно быть необходимо!::DiscordBot::Bot.discord_bot.stop -
Робот немного болтлив во время «онлайн»-обновлений Discourse, так как постоянно активируется в процессе обновления. Это связано с поиском хорошего способа запуска бота в отдельном управляемом процессе вместо потока, ответвленного от веб-сервера. Я считаю, что это все безвредно, и если вывод бота идет только в ваш административный канал на Discord, вам действительно не все равно?Это должно быть почти решено сейчас, бот объявляет о себе только дважды во время перестройки.
Благодарности
Есть несколько спонсоров, которых стоит поблагодарить за этот плагин, который занял у меня много времени, чтобы дойти до этого этапа, включая @Wedgebert, @FoohonPie. Спасибо Джеффу за его щедрый вклад. Спасибо @angus за всю поддержку и решение финансовых вопросов.
Плагин был вдохновлен работой @Watercolor_Games на более раннем этапе и зависит от плагина Discord OAuth, созданного @featheredtoast.
Плагин зависит от полуофициальной библиотеки Ruby discordrb, поддерживаемой Discord и фантастической работы команды Discord, сделавшей их систему доступной. Спасибо @Falco за помощь с зависимостью в исключительно отзывчивой манере.
Кроме того, конечно, это было бы невозможно без удивительной экосистемы плагинов Discourse (ура!)
Состояние этих инструкций
Со временем они будут улучшены, и я приветствую обратную связь. Есть области, которые неизбежно останутся непонятными.











