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

Отлично. Кстати, я с радостью рассмотрю любые полезные общие улучшения этого плагина, если вы решите снова взяться за кодирование :wink:

2 лайка

Хорошо, начнём постепенно. Я только что отправил свой первый pull request в этот репозиторий :smile:.

4 лайка

Объединено :slight_smile: спасибо!

4 лайка

Привет! Я пытаюсь найти плагин, который будет присваивать пользователям в Discord роль на основе значков, которые у них есть в профиле Discourse. Возможно ли это с вашим плагином? Если нет, то вообще возможно ли это? Спасибо!

2 лайка

На данный момент нет, но нет причин, почему вы не могли бы сделать форк и добавить соответствующую команду для реализации этого!

Если это будет реализовано хорошо, я рассмотрю возможность слияния PR. Однако это может быть слишком специфично для общего использования, поскольку, предположительно, вам придется поддерживать某种 kind of mapping, если имена бейджей не совпадают с именами ролей? В любом случае вам придется отфильтровать большинство из них? Это может запутаться для общего использования. Если вы найдете действительно чистый способ управления этим, который будет работать для общих пользователей плагина, дайте мне знать.

Но форкайте, делайте что хотите!

2 лайка

Я бы определенно хотел узнать, возможно ли это. Это сделало бы меня еще более заинтересованным в этом плагине. :smiley:

1 лайк

Всего один небольшой вопрос: нужно ли нам вручную запускать !discsync каждый раз, когда мы хотим обновить роли, или это происходит автоматически?

2 лайка

К сожалению, да. Было бы неплохо добавить параметр «повторить через x часов» (приветствуется pull request или наймите меня для реализации), но, как я уже упоминал ранее в этой теме, было бы лучше, если бы кто-то создал новый плагин, использующий их API, и настроил запланированные задачи Sidekiq для этого. Бот — это интересное решение, но не лучшая архитектура для запланированной синхронизации.

2 лайка

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

Теперь мы собираемся создать своего рода бота, используя вебхуки: Discourse будет отправлять вебхук при обновлении групп пользователя (а также при смене имени пользователя) в наше кастомное решение, которое затем назначит роли в Discord. Мы продолжим использовать выборку через Discord OAuth для получения гильдий, а с помощью создания кастомного запроса в Data Explorer сможем получать эти гильдии через API.

Это будет работать примерно так:

  1. Пользователь меняет группы или имя пользователя.
  2. Запускается вебхук в кастомное решение.
  3. Это кастомное решение обращается к API Data Explorer с кастомным запросом, который возвращает гильдии пользователя.
  4. Получив гильдию, мы обращаемся к Discord, чтобы обновить роли.
2 лайка

Лучше было бы использовать правильное пакетное задание, чтобы не нарушить целостность данных из-за сбоев разовых событий. Оба варианта были бы идеальны.

2 лайка

Ну, я не шёл этим путём… :sweat_smile:
Я форкнул ваш репозиторий и создал новый плагин, который подходит под наши нужды:

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

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

После того как я немного приведу всё в порядок, я открою тему в разделе #plugin, так как, возможно, кому-то это будет полезно.

7 лайков

@barreeeiroo действительно интересно в вашем форке было использование хуков DiscourseEvents.

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

Поэтому я начал внедрять этот приём в основном репозитории, начиная с возможности устанавливать отслеживание новых постов или тем, которые будут анонсироваться в административном канале Discord.

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

5 лайков

OK, я немного доработал плагин, и у меня работает POC для двусторонней связи:

Вот новые настройки:

  • В настройках плагина можно указать канал объявлений в Discord.

  • Теперь вы можете вводить сообщения в назначенный канал объявлений Discord, и они будут публиковаться в назначенной теме Discourse, указанной в настройках плагина.

  • Можно настроить список категорий в Discourse для публикации в канал объявлений на вашем Discord, если кто-то опубликует сообщение там или создаст новую тему (одно из двух или оба варианта).

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

Также я удалил изменения, необходимые в файле app.yml для установки libsodium-dev, так как теперь это опционально: зависимости обновлены, и для плагина это пока не требуется (нет необходимости обрабатывать голос). Это значительно упростит установку.

9 лайков

Я следовал инструкциям по установке, и всё шло гладко до перезагрузки. Бот не присоединился к комнате, поэтому я проверил /logs:

Это относится к discord_bot_token? Он заполнен, и я проверил его значение. Есть какие-то идеи?

3 лайка

Марк, извините, я как-то упустил это.

Вы обнаружили проблему?

Пожалуйста, обновитесь и попробуйте новую версию, а дальше разберёмся.

2 лайка

Значительное обновление, финансируемое командой Discourse :tada:

FEATURES: новая команда автоматического копирования сообщений и копирования истории от merefield · Pull Request #4 ·
merefield/discourse-discord-bot (github.com)

  1. Новая команда !disccopy <количество_сообщений> <необязательное_имя_категории_цели> <необязательное_имя_темы_цели>, которая позволяет копировать историю сообщений Discord (в этом канале) в ваш экземпляр Discourse прямо из чата Discord. Это безопасно обрабатывает тысячи сообщений за один раз (но для такого объема потребуется время).

  2. Автоматическое копирование чата по каждому сообщению из канала в категорию с таким же именем в Discourse: если имя канала совпадает с именем категории, сообщение будет скопировано в Discourse, если это включено:
    image

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

  4. Добавлена поддержка локализации для множества функций.

Спасибо @erlend_sh и команде Discourse за определение требований и спонсирование этой работы!! :pray:

Больше возможностей для бота скоро :wink: :robot:

5 лайков

Если они войдут через аутентификацию Discourse или любой другой метод, кроме Discord OAuth, этот плагин просто проигнорирует их?

1 лайк

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

2 лайка

Поддерживаются ли потоки?

4 лайка

Пока нет, Клаус, но это потенциально в планах. Ожидаем обновления Ruby API (блокирует задачу), после чего бэкендер добавит эту функцию.

2 лайка