Набор для создания ботов 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

Hey I’m super interested in this.

Would the opposite be possible? I’d love a way to be able to create a Discourse setup for my Discord server. I’m not sure if there’s a Discord API event for roles being given but you could probably check when someone logs in with Discord or with CRON.

2 лайка

Yes, absolutely.

You could either build that as a bot command for ad hoc application, but with a repeat feature that reran the command after a period (nice but not very transparent and no way to individually manage these recurrences)

OR

As I alluded to above, have it scheduled as a job in Discourse as a sidekiq job. That might be a separate plugin (I actually started on the skeleton of that approach before moving to a bot only solution mainly because the ‘bot’ approach was kind of the Discord ‘thing’, fun and offered a unique approach and result), but if I can get Discourse to fire off bot commands then that’s moot (not yet had the chance to test that), and then we can write stuff once and have it work either way (nice!).

Both these solutions would rely on the same OAuth login though.

Whilst this is an excellent idea, it can’t be a priority for me at present because I have a lot of other client work at the moment I need to deliver, but if you wish to support such an extension, we can discuss offline on a PM and schedule it in.

4 лайка

It might be interesting to play around with, but I have nowhere near the skill level required to volunteer to develop/maintain an addon like this. I might make a messy fork at some time but I certainly don’t want my name on anything official. :slight_smile:

3 лайка

Absolutely get messy. It’s the only way to learn. :).

4 лайка

Minor bug fix deployed:

Got this during rebuild:

Bot is still offline. Triple checked everything and it’s all set up correctly. Not sure how to proceed now… Maybe I need to open a port on my server instance?

2 лайка

Thanks for testing this out and so soon after the update. Let me try to reproduce and I will revert. I did not change anything wrt to the port config.

2 лайка

No issues rebuilding here, Bot comes up fine … have you changed anything in your server config in between?

Your 400 Bad Request sounds like your server sent a corrupt or bad request to the Discord server and this was the response. This suggests it received it fine and was not blocked.

You can get this for:

  • malformed requests
  • lack of authorisation
  • exceeding rate limits

Unfortunately the error message doesn’t appear to help us determine which of these was the particular issue.

Presumably your Discourse is up? Check all the plugin settings are populated correctly.

Just to rule out a temporary gremlin run ./launcher restart app when you get chance … this will take your site down for a few seconds only (sorry about that!).

I see it runs the bot in the after_initialize block, so it will prevent migrations (and rebuilds) if the bot is misconfigured, or if Discord is down.

Maybe try to handle this exception and just log it?

5 лайков

It runs on a separate thread? So I expect that not to be an issue?

However this callback seems to run several times in a rebuild, so the main issue will be that a misconfigured bot could actually breach rate limits if authorisation fails too many times in quick succession. If that happens the account, in worse case, could be blocked for some time.

In any case, I’ll do a quick patch to do that with the current implementation to lessen the impact. Thanks for the suggestion.

UPDATE: @falco, this is done, e.g.:

image

3 лайка

First I want to say thank you for making this, once I can get it working its going to be a huge help for us managing our discourse and discord for a volunteer community.
I am running into a 400 error when trying to run this bot. Prior to this plugin being added we have been successfully using the official discord auth plugin and webhooks via the chat integration plugin. I’ve validated that those are both still working appropriately.

I created the bot within the same discord app I’d previously created authorized the bot within the discord server, it shows up in the member list as offline. Your documentation didn’t say what permission value to apply, but given most bots I’ve encountered for discord asked for it I went ahead and set it up with a permissions value of 8 for Administrator.

Within the discord server I then copied the ID of the Role it created, which was named after my app, and the id of the channel for admin text.I added the app Role to that channel with full rights, just to be sure, then added the IDs to discourse and restarted.

Unfortunately no matter what I try I’m getting a 400, I even tried a rebuild just to be sure.

3 лайка

Thank you, kind words. It was also enabled by the generosity of funders.

Yes, that’s great. It should have Admin.

This is the second report of this issue.

If you intentially remove the last char of the token in settings (remember what this is) do you get a 401 instead?

Let’s move this to PM because it might get messy :wink: (we can always post the solution here).

4 лайка

Just to post an update in case anyone else sees this, we’re actively looking into the issue but haven’t yet narrowed down the cause. I’d say if anyone else is running into this issue please say so would help to have others testing.

1 лайк

This is now fixed. It was a weird one to track down.

Thanks to @ransim for raising and working with me to get to the bottom of it.

Huge thanks to the #ruby_discordrb gang on Discord API for their patient and instant help!

@neemiasvf

5 лайков

@merefield no problem,Your plugin is great.But I have encountered some problems now.
such this:

Discourse Sync:  Starting.  Please be patient, I'm rate limited to respect Discord services.
Discourse Sync:  Checking if there are any eligible groups for sync ...
Discourse Sync: 1 eligible group(s) were found
Discourse Sync:  Preparing list of users who also have a registered account on Discord ...
Discourse Sync:  Preparing list of groups that users who have a registered account on Discord belong to on Discourse ...
Discourse Sync: 0 eligible group(s) were found with Discord users
Discourse Sync:  No users were found in elibigle groups for sync using provided or default criteria!

my commond is : !discsync 4

and commond changed: !discsync false 5 false

Discourse Sync:  Starting.  Please be patient, I'm rate limited to respect Discord services.
Discourse Sync:  Checking if there are any eligible groups for sync ...
Discourse Sync: 10 eligible group(s) were found
Discourse Sync:  Preparing list of users who also have a registered account on Discord ...
Discourse Sync:  Preparing list of groups that users who have a registered account on Discord belong to on Discourse ...
1 лайк

Hey @p0nda, sorry for slow reply.

If you include any parameters, you need to include all of them. It might be interpreting things strangely.

3 лайка

Unable to get the extended bot settings to show up? I have the changes to the app.yml and plugins installed. I have the OAuth setup working, but not the bot settings. Any ideas?

1 лайк

The OAuth setting are there but no bot settings

1 лайк

image
These

2 лайка