Crea automazioni personalizzate

Probabilmente il posto migliore dove iniziare a cercare è nello script di automazione aggiunto al plugin Data Explorer: discourse-data-explorer/plugin.rb at main · discourse/discourse-data-explorer · GitHub. Vale la pena dare un’occhiata anche agli script e ai trigger esistenti del plugin Automation: https://github.com/discourse/discourse-automation/tree/main/lib/discourse_automation

Dato che non ci sono molte informazioni su Meta riguardo all’aggiunta di automazioni personalizzate, ecco un file plugin.rb di esempio che aggiunge uno script per aggiornare la preferenza dell’email di riepilogo dell’attività di un utente. Lo script può essere attivato dai trigger “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

Il codice completo del plugin è qui: GitHub - scossar/automation-script-example: An example of how to add a custom script to the Discourse Automation plugin..

:warning: per favore, non utilizzare questo codice così com’è su un sito di produzione. Non avevo esaminato il codice di Automation prima di stasera. Se riceverò feedback su potenziali problemi con il codice, aggiornerò questo post e il repository GitHub.

Modifica: la mia preoccupazione era come gestire al meglio il caso di più script di automazione attivati dai trigger ‘user_added_to_group’ o ‘user_removed_from_group’. La versione iniziale del plugin controllava:

fields.has_key?("email_digests")

ma questo sembrava un po’ inaffidabile. E se fosse stato aggiunto un altro script che avesse anche una chiave email_digests?

Il codice aggiornato passa il parametro automation al blocco di codice e controlla:

automation.script == "user_update_summary_email_options"

Ciò dovrebbe garantire che lo script non venga eseguito per l’automazione sbagliata.

… pensandoci ancora un po’, è improbabile che lo script venga attivato da un’automazione per cui non è stato configurato :slight_smile:

7 Mi Piace