Пользовательская автоматизация: модификации потока для успешной интеграции в плагин Automation

Всем привет,

Я пытаюсь создать кастомную автоматизацию, которая при отметке вопроса как решённого/решённого отправит создателю темы личное сообщение (или, альтернативно, создаст новый ответ в теме с заранее определённым сообщением — в обоих случаях это будет опрос).

Это должна быть кастомная автоматизация, так как текущий доступный скрипт «отправить ЛС» в плагине автоматизации отправляет сообщение тому, кто отправил ответ, помеченный как решение (а не тому, кто создал тему, как требуется в моём случае).

Ниже приведён скрипт, который я создал для попытки публикации нового ответа в теме после того, как ответ помечен как решение (в следующем примере я не отправляю опрос в качестве ответа, а даю администратору свободу выбора, что будет возвращено, или оставляю значение по умолчанию):

# frozen_string_literal: true

DiscourseAutomation::Scriptable.add(DiscourseAutomation::Scripts::REPLY_ON_SOLUTION) do
    field :reply_text, component: :text
    # field :answering_user, component: :user
    field :once, component: :boolean
  
    version 1
  
    triggerables %i[:first_accepted_solution] if defined?(DiscourseSolved)
  
    placeholder :sender_username
    placeholder :word
  
    script do |context, fields, automation|
      topic = context["topic"]
      # user = context["user"]
      reply_text = fields.dig("reply_text", "value")
  
      # Опубликовать ответ в теме, где было отмечено решение
      PostCreator.create!(
        Discourse.system_user,
        topic_id: topic.id,
        raw: reply_text || "Для этой темы было отмечено решение!",
      )
    end
  end

Но я не уверен, следует ли использовать PostCreator.create!, PostCreator.reply или, возможно, что-то другое. Это приводит меня к одному вопросу:

  • Есть ли где-то документация по ключевым словам, которые нужно использовать при создании скрипта кастомной автоматизации?

На основе приведённой выше автоматизации, после того как я запускаю её, помечая ответ как решение, через 1 секунду появляется всплывающее окно с сообщением «500 internal server error» на экране.

  • Я что-то упускаю? Моё развёртывание было выполнено с использованием devcontainers на моём локальном компьютере для целей тестирования разработки.
  • Что необходимо сделать после создания кастомного скрипта? Возможно, я что-то упускаю на этом этапе? Или, может быть, проблема в самом скрипте?
  • Есть ли где-то документация по шагам, которые нужно выполнить после завершения скрипта? Например, какие файлы нужно изменить, чтобы всё работало корректно? (Я выяснил сложным путём, что нужно изменить client.en.yml, чтобы правильное имя и описание отображались в списке автоматизаций).

Я планирую попробовать, основываясь на встроенном скрипте «отправить ЛС», изменить свой скрипт так, чтобы вместо создания ответа отправлялось ЛС, но не уверен в следующем:

  • Как мне отметить человека, который создал тему, а не того, чей ответ был помечен как решение?

Заранее большое спасибо за любые подсказки и помощь.

Вы следовали этому руководству?

Привет, @NateDhaliwal,

Большое спасибо за ваш ответ.

Да, я следовал этому руководству… Позже я оставлю в нём комментарии с некоторыми предложениями.

Кстати, мне удалось заставить работать пользовательскую автоматизацию.

Проблема с ошибкой 500 (Internal Server Error) заключалась в том, что я использовал неверный «контекст». Я понял это, изучив логи, и исправил, указав правильный.

Как только содержимое нужного контекста было добавлено в переменную, ошибка 500 была устранена.

Также была изменена дополнительная логика в коде.

Редактирование: Чтобы пользовательская автоматизация работала в моём локальном развёрнутом экземпляре, мне пришлось также изменить следующие файлы:

Создание скрипта пользовательской автоматизации

Обновление: server.en.yml

Добавьте имя, заголовок и описание пользовательской автоматизации в секцию scriptables файла YAML.

Обновление: client.en.yml

Добавьте имя пользовательской автоматизации в scriptables; добавьте ключевое слово field; внутри ключевого слова field добавьте field_name, за которым следуют label и description.

Обновление: scripts.rb

Добавьте имя пользовательской автоматизации в список скриптов. Пример: FILE_NAME = "file_name".

Обновление: plugin.rb

Внутри блока after_initialize do добавьте путь к скрипту пользовательской автоматизации. Пример: 'lib/discourse_automation/scripts/file_name'.