Criar Automations personalizadas

Provavelmente o melhor lugar para começar a procurar é no script de automação que é adicionado ao plugin Data Explorer: discourse-data-explorer/plugin.rb at main · discourse/discourse-data-explorer · GitHub. Vale a pena também olhar os scripts e gatilhos existentes do plugin Automation: https://github.com/discourse/discourse-automation/tree/main/lib/discourse_automation

Como não há muita informação no Meta sobre como adicionar automações personalizadas, aqui está um exemplo de arquivo plugin.rb que adiciona um script para atualizar a preferência de e-mail de resumo de atividade de um usuário. O script pode ser acionado pelos gatilhos ‘user_added_to_group’ ou ‘user_removed_from_group’ do plugin Automation.

# frozen_string_literal: true

# name: automation-script-example
# about: An example of how to add a script to an automation
# 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

O código completo do plugin está aqui: GitHub - scossar/automation-script-example: An example of how to add a custom script to the Discourse Automation plugin..

:warning: por favor, não use este código como está em um site de produção. Eu não tinha olhado o código de Automação antes desta noite. Se eu receber algum feedback sobre possíveis problemas com o código, atualizarei esta postagem e o repositório GitHub.

Editar: minha preocupação era como lidar melhor com o caso de múltiplos scripts de automação sendo acionados pelos gatilhos ‘user_added_to_group’ ou ‘user_removed_from_group’. A versão inicial do plugin estava verificando:

fields.has_key?("email_digests")

mas isso parecia um pouco instável. E se outro script fosse adicionado que também tivesse uma chave email_digests?

O código atualizado passa o parâmetro automation para o bloco de código e verifica:

automation.script == "user_update_summary_email_options"

Isso deve garantir que o script não seja executado para a automação errada.
… pensando um pouco mais, é improvável que o script possa ser acionado por uma automação para a qual não foi configurado :slight_smile:

7 curtidas