Crear automatizaciones personalizadas

Probablemente el mejor lugar para empezar a buscar sea en el script de automatización que se añade al plugin Data Explorer: discourse-data-explorer/plugin.rb at main · discourse/discourse-data-explorer · GitHub. También vale la pena echar un vistazo a los scripts y desencadenadores existentes del plugin Automation: https://github.com/discourse/discourse-automation/tree/main/lib/discourse_automation

Dado que no hay mucha información en Meta sobre cómo añadir automatizaciones personalizadas, aquí tienes un archivo plugin.rb de ejemplo que añade un script para actualizar la preferencia de correo electrónico del Resumen de Actividad de un usuario. El script puede ser activado por los desencadenadores ‘user_added_to_group’ o ‘user_removed_from_group’ del 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

El código completo del plugin está aquí: GitHub - scossar/automation-script-example: An example of how to add a custom script to the Discourse Automation plugin..

:warning: por favor, no uses este código tal cual en un sitio de producción. No había mirado el código de Automation antes de esta noche. Si recibo algún comentario sobre posibles problemas con el código, actualizaré esta publicación y el repositorio de GitHub.

Edición: mi preocupación era cómo manejar mejor el caso de múltiples scripts de automatización activados por los desencadenadores ‘user_added_to_group’ o ‘user_removed_from_group’. La versión inicial del plugin comprobaba:

fields.has_key?("email_digests")

pero eso me pareció un poco inestable. ¿Y si se añadía otro script que también tuviera una clave email_digests?

El código actualizado pasa el parámetro automation al bloque de código y comprueba:

automation.script == "user_update_summary_email_options"

Eso debería asegurar que el script no se ejecute para la automatización incorrecta.
… pensándolo un poco más, es poco probable que el script se active por una automatización para la que no fue configurado :slight_smile:

7 Me gusta