Набор для создания ботов Discord 🤖

Назначение этого плагина

Этот плагин выполняет несколько задач:

  1. Позволяет использовать ваш сервер Discourse для управления ботом Discord, связывая две системы. Разветвите этот репозиторий и расширьте его с помощью простого Ruby, чтобы создать всевозможный функционал бота.

  2. Существующий функционал служит примерами и полезными утилитами:

  • Обеспечивает двустороннюю автоматическую публикацию контента, соответствующего определенным критериям.
  • Команда для разовой копирования сообщений в Discourse.
  • Команда для синхронизации членства в группах с ролями вашего сервера Discord и экземпляра Discourse.

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


это не команды синхронизации, а лишь иллюстрация возможного взаимодействия бота. Вторая команда на скриншоте была устаревшей в процессе разработки :wink:

Настройка неизбежно сложна, но она отлично подходит для фанатов обеих систем, готовых потратить время на понимание того, как работает каждая из них, хотя бы на функциональном и концептуальном уровне. Чтобы извлечь максимум из этого плагина, вам необходимо понимать основы управления пользователями в Discourse и Discord.

Команды бота

Существует четыре команды:

  1. Ping!
  2. !disckick
  3. !discsync
  4. !disccopy

Ping!

Чтобы проверить, отвечает ли бот, просто введите «Ping!», и бот должен ответить «:robot: : Pong!» — чудесно, не так ли? :smiley: (кстати, это немного мем!)

!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.

image

Кроме того, я добавил новый файл для управления событиями Discord, поддерживаемыми API discordrb, где логика «Объявлений» является первым примером (не стесняйтесь разрабатывать новые и отправлять PR, если они будут полезны сообществу).

NB: Для любого сообщения, скопированного из Discord в Discourse, пользователь будет отображаться корректно, если этот пользователь вошел в Discourse через вход с помощью Discord (так что бот Discord может сопоставить пользователей).

Состояние этого плагина

Это сложный плагин для настройки. Это было неизбежно.

Однако, после запуска он используется как игра для детей.

Рассматривайте код как находящийся в бета-версии. Он протестирован, даже в продакшене, но, вероятно, содержит ошибки. Я рекомендую сначала протестировать его на новом сервере Discord, прежде чем применять к вашему основному серверу «Production», если вы только начинаете.

Любые ошибки с большей вероятностью повлияют на ваш экземпляр Discord, чем на Discourse, так как в Discourse не вносятся изменения. Однако я написал его так, чтобы большинство проблем можно было исправить, просто повторив действие. Discourse используется как мастер для информации о членстве и группах, и эти данные используются для обновления членства и ролей на вашем сервере Discord.

Инструкции по настройке

Предварительные требования

  1. Сервер Discord, где вы являетесь администратором.
  2. Приложение Discord (см. ниже).
  3. Бот Discord (см. ниже).
  4. SSH-доступ root к вашему серверу Discourse.
  5. Обновления файла app.yml для установки плагина.
  6. Все пользователи вашего Discourse должны войти, используя вход через Discord OAuth, который появится на вашей странице входа после установки плагина.

Приложение Discord

Перейдите сюда и создайте приложение:

Нажмите «New Application».

Вам нужно создать бота, и он будет выглядеть примерно так (оставьте его не «public»):

Вам нужно авторизовать бота в браузере, см. OAuth2 - Documentation - Discord

После настройки бота скопируйте Токен. Вам нужно будет ввести его в Discourse позже.

Изменения в app.yml

плагин

Вам нужен только один плагин, так как Discord Social Login теперь является частью ядра Discourse (ура :tada: )

Затем в командной строке выполните ./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 (ура!)

Состояние этих инструкций

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

47 лайков
Discord<-> Discourse Selective Group Sync
Discord login and obtain discord roles in discourse
Discord and Discourse - Better Together | Blog
Convert Existing Plugin to do Discord to Discourse role/group sync
Slack Bot Construction Kit :robot:
2019: The Year in Review
Creat a user automatically when granted a Discord Role?
Discord Sync: sync a Discourse forum with a Discord server
Creating bot on discourse
Using "custom" ruby gems
Discourse Trust Levels for Discord
Discord is taking aim at Discourse. How does Discourse remain unique and stand out from the crowd?
Discord is taking aim at Discourse. How does Discourse remain unique and stand out from the crowd?
Copy + Pasting text from Discord into Discourse mangles paragraph breaks
Discord Role Badge Sync
Discord Bot: Topics not Posts
How do I go about making a very customized theme?
API feature request for additonal info about external accounts
Can anyone help me to add chat option of discord on forum?
How to Integrate/Sync Discord User MEE6 Points with Discourse Leaderboard?
LF Developer, Theme Creator, and Discord/Discourse Hero
Discord Sync: sync a Discourse forum with a Discord server
[PAID] Discourse/Discord integration needed (roles/user groups)
Can anyone help me to add chat option of discord on forum?
Discord and Discourse - Better Together | Blog
How to easily make Discourse bots?
Discourse to Discord bot possible?
Migrating from Discord to Discourse
Convert Existing Plugin to do Discord to Discourse role/group sync
Is migration from other chat apps supported?
Partially enable login option
Introducing Discourse Chat (BETA)
Which instant messenger do you use with Discourse?
Request widgetbot.io
Discord Sync: sync a Discourse forum with a Discord server

Привет, мне это очень интересно.

Возможно ли сделать наоборот? Мне бы хотелось иметь возможность создать настройку Discourse для моего сервера Discord. Не уверен, есть ли событие API Discord для выдачи ролей, но можно, вероятно, проверять, когда кто-то входит через Discord, или использовать CRON.

2 лайка

Да, безусловно.

Вы можете реализовать это как команду бота для разового применения, но с функцией повтора, которая будет запускать команду через определённый промежуток времени (удобно, но не очень прозрачно и нет возможности управлять этими повторами индивидуально).

ИЛИ

Как я уже упоминал выше, можно запланировать это как задачу в Discourse через Sidekiq. Это может быть отдельный плагин (я на самом деле начал работу над скелетом такого подхода, прежде чем перейти к решению только на основе бота, в основном потому, что подход с «ботом» был своего рода «фишкой» Discord — весело и предлагал уникальный подход и результат). Однако, если я смогу заставить Discourse запускать команды бота, это станет неактуальным (я ещё не успел протестировать это), и тогда мы сможем написать код один раз, и он будет работать в обоих случаях (отлично!).

Оба этих решения будут использовать одинаковый вход через OAuth.

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

4 лайка

Это может быть интересно поэкспериментировать, но у меня совсем нет навыков, необходимых для того, чтобы добровольно разрабатывать или поддерживать такой аддон. Возможно, я когда-нибудь сделаю неаккуратный форк, но я точно не хочу, чтобы мое имя было связано с чем-то официальным. :slight_smile:

3 лайка

Не бойтесь испачкаться. Это единственный способ учиться. :).

4 лайка

Развёрнуто исправление незначительной ошибки:

Получил это во время восстановления:

Бот всё ещё офлайн. Перепроверил всё трижды, и всё настроено правильно. Не знаю, как теперь действовать… Возможно, нужно открыть порт на моем сервере?

2 лайка

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

2 лайка

У меня проблем с пересборкой нет, Bot запускается нормально… Не меняли ли вы что-то в конфигурации вашего сервера между этими событиями?

Ошибка 400 Bad Request указывает на то, что ваш сервер отправил Discord некорректный или повреждённый запрос, и это был ответ. Это означает, что запрос был получен успешно и не был заблокирован.

Такое может произойти из-за:

  • некорректно сформированных запросов
  • отсутствия авторизации
  • превышения лимитов запросов

К сожалению, сообщение об ошибке не помогает определить, какая именно из этих проблем возникла.

Предположительно, ваш Discourse работает? Проверьте, правильно ли заполнены все настройки плагинов.

Чтобы исключить временный сбой, выполните ./launcher restart app, когда будет возможность… это временно отключит ваш сайт всего на несколько секунд (извините за неудобства!).

Я вижу, что бот запускается в блоке after_initialize, поэтому это предотвратит выполнение миграций (и пересборки), если бот настроен неверно или если Discord недоступен.

Может быть, попробовать обработать это исключение и просто записать его в лог?

5 лайков

Он работает в отдельном потоке? Значит, я предполагаю, что это не должно стать проблемой?

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

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

ОБНОВЛЕНИЕ: @falco, это сделано, например:

image

3 лайка

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

При запуске этого бота я получаю ошибку 400. До добавления этого плагина мы успешно использовали официальный плагин аутентификации Discord и вебхуки через плагин интеграции чата. Я проверил, что оба они продолжают работать корректно.

Я создал бота в том же приложении Discord, которое ранее было создано, и авторизовал бота на сервере Discord. Он отображается в списке участников как офлайн. В вашей документации не указано, какое значение разрешений следует применить, но поскольку большинство ботов для Discord, с которыми я сталкивался, запрашивали это, я установил значение разрешений 8 для Администратора.

Затем в сервере Discord я скопировал ID роли, которую она создала (она была названа в честь моего приложения), и ID канала для административного текста. Я добавил роль приложения к этому каналу с полными правами, просто на всякий случай, затем добавил ID в Discourse и перезапустил.

К сожалению, независимо от того, что я пробую, я получаю ошибку 400. Я даже попробовал выполнить перестроение, просто чтобы убедиться.

3 лайка

Спасибо за добрые слова. Это также стало возможным благодаря щедрости спонсоров.

Да, это отлично. Должны быть права администратора.

Это уже второе сообщение об этой проблеме.

Если вы намеренно удалите последний символ токена в настройках (помните, что это такое), получите ли вы ошибку 401 вместо этого?

Давайте перенесём это в личные сообщения, потому что здесь может стать запутанно :wink: (мы всегда можем опубликовать решение здесь).

4 лайка

Просто для обновления: если кто-то ещё это видит, мы активно занимаемся проблемой, но пока не выяснили её причину. Если у кого-то возникла такая же проблема, пожалуйста, сообщите — это помогло бы провести тестирование с участием других пользователей.

1 лайк

Теперь это исправлено. Было непросто найти причину проблемы.

Спасибо @ransim за то, что подняли вопрос и помогли разобраться в нём.

Огромное спасибо команде #ruby_discordrb в Discord API за их терпеливую и мгновенную помощь!

@neemiasvf

5 лайков

@merefield, всё в порядке, ваш плагин отличный. Но сейчас я столкнулся с некоторыми проблемами.
Например:

Discourse Sync:  Начало. Пожалуйста, будьте терпеливы, я ограничиваю частоту запросов, чтобы уважать сервисы Discord.
Discourse Sync:  Проверка наличия групп, подходящих для синхронизации ...
Discourse Sync:  Найдена 1 подходящая группа(ы)
Discourse Sync:  Формирование списка пользователей, у которых также есть зарегистрированная учётная запись в Discord ...
Discourse Sync:  Формирование списка групп, к которым принадлежат пользователи с зарегистрированной учётной записью в Discord на Discourse ...
Discourse Sync:  Найдено 0 подходящих групп(ы) с пользователями Discord
Discourse Sync:  Пользователи в подходящих группах для синхронизации по предоставленным или стандартным критериям не найдены!

Моя команда: !discsync 4

А команда изменена: !discsync false 5 false

Discourse Sync:  Начало. Пожалуйста, будьте терпеливы, я ограничиваю частоту запросов, чтобы уважать сервисы Discord.
Discourse Sync:  Проверка наличия групп, подходящих для синхронизации ...
Discourse Sync:  Найдено 10 подходящих групп(ы)
Discourse Sync:  Формирование списка пользователей, у которых также есть зарегистрированная учётная запись в Discord ...
Discourse Sync:  Формирование списка групп, к которым принадлежат пользователи с зарегистрированной учётной записью в Discord на Discourse ...
1 лайк

Привет, @p0nda, извините за долгий ответ.

Если вы указываете какие-либо параметры, нужно указать все из них. Возможно, система интерпретирует это некорректно.

3 лайка

Не получается отобразить расширенные настройки бота? У меня внесены изменения в app.yml и установлены плагины. OAuth настроен и работает, но настройки бота не отображаются. Есть какие-то идеи?

1 лайк

Настройки OAuth присутствуют, но настройки бота отсутствуют

1 лайк


Эти

2 лайка