إنشاء أتمتة مخصصة

ربما يكون أفضل مكان للبدء في البحث هو في البرنامج النصي للأتمتة الذي تمت إضافته إلى المكون الإضافي لاستكشاف البيانات: discourse-data-explorer/plugin.rb at main · discourse/discourse-data-explorer · GitHub. يجدر أيضًا إلقاء نظرة على البرامج النصية والمشغلات الحالية للمكون الإضافي للأتمتة: https://github.com/discourse/discourse-automation/tree/main/lib/discourse_automation

نظرًا لعدم وجود الكثير من المعلومات حول Meta حول إضافة أتمتة مخصصة، إليك مثال لملف plugin.rb يضيف برنامجًا نصيًا لتحديث تفضيل البريد الإلكتروني لملخص نشاط المستخدم. يمكن تشغيل البرنامج النصي بواسطة مشغلات المكون الإضافي للأتمتة ‘user_added_to_group’ أو ‘user_removed_from_group’.

# 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

الكود الكامل للمكون الإضافي هنا: GitHub - scossar/automation-script-example: An example of how to add a custom script to the Discourse Automation plugin..

:warning: يرجى عدم استخدام هذا الكود كما هو في موقع إنتاجي. لم ألقِ نظرة على كود الأتمتة قبل هذا المساء. إذا تلقيت أي ملاحظات حول المشكلات المحتملة في الكود، فسوف أقوم بتحديث هذا المنشور ومستودع 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 إعجابات