Создавайте собственные автоматизации

Вероятно, лучшее место для начала поиска — это скрипт автоматизации, добавленный в плагин Data Explorer: discourse-data-explorer/plugin.rb at main · discourse/discourse-data-explorer · GitHub. Также стоит посмотреть на существующие скрипты и триггеры плагина Automation: https://github.com/discourse/discourse-automation/tree/main/lib/discourse_automation.

Поскольку в разделе Meta информации о добавлении пользовательских автоматизаций мало, вот пример файла plugin.rb, который добавляет скрипт для обновления предпочтений пользователя в отношении сводного email-рассылки активности. Этот скрипт может быть запущен триггерами плагина Automation «user_added_to_group» или «user_removed_from_group».

# frozen_string_literal: true

# name: automation-script-example
# about: Пример того, как добавить скрипт в автоматизацию
# version: 0.0.1
# authors: scossar

enabled_site_setting :automation_script_example_enabled

after_initialize do
  reloadable_patch do
    if defined?(DiscourseAutomation)
      DiscourseAutomation::Scriptable::USER_UPDATE_SUMMARY_EMAIL_OPTIONS =
        "user_update_summary_email_options"
      add_automation_scriptable(
        DiscourseAutomation::Scriptable::USER_UPDATE_SUMMARY_EMAIL_OPTIONS
      ) do

        field :email_digests, component: :boolean

        version 1
        triggerables [:user_added_to_group, :user_removed_from_group]

        script do |context, fields, automation|
          if automation.script == "user_update_summary_email_options" && (context["kind"] == "user_added_to_group" || context["kind"] == "user_removed_from_group")
            user_id = context["user"].id
            digest_option = fields.dig("email_digests", "value")
            user_option = UserOption.find_by(user_id: user_id)

            if (user_option)
              user_option.update(email_digests: digest_option)
            end
          end
        end
      end
    end
  end
end

Полный код плагина доступен здесь: GitHub - scossar/automation-script-example: An example of how to add a custom script to the Discourse Automation plugin. · GitHub.

:warning: Пожалуйста, не используйте этот код в таком виде на продакшн-сервере. Я не изучал код Automation до сегодняшнего вечера. Если я получу обратную связь о возможных проблемах с кодом, я обновлю этот пост и репозиторий на GitHub.

Редактирование: меня беспокоило, как лучше всего обрабатывать случай, когда несколько скриптов автоматизации запускаются триггерами «user_added_to_group» или «user_removed_from_group». Первоначальная версия плагина проверяла:

fields.has_key?("email_digests")

но это казалось ненадёжным. Что, если будет добавлен другой скрипт, у которого тоже есть ключ email_digests?

Обновлённый код передаёт параметр automation в блок кода и проверяет:

automation.script == "user_update_summary_email_options"

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

… Подумав ещё немного, маловероятно, что скрипт может быть запущен автоматизацией, для которой он не был настроен :slight_smile:

7 лайков