¿Cómo puedo instalar mi propio plugin escrito en Ruby?

Tengo un archivo CSV con los correos electrónicos de mis usuarios de Discourse. Necesito crear un script que se ejecute diariamente y envíe una plantilla de correo electrónico específica a un conjunto específico de usuarios. Luego, cada día necesito ejecutar este script con el siguiente conjunto de usuarios. ¿Cómo puedo hacerlo?

Según https://ask.discourse.com/, necesito crear mi código para automatizar esto y colocar el código y los datos en la carpeta plugins. La sugerencia de código está aquí:

# frozen_string_literal: true
# name: auto-email
# about: Un plugin personalizado para enviar correos electrónicos masivos utilizando automatización y archivos CSV
# version: 0.3

require 'csv'

after_initialize do
  if defined?(DiscourseAutomation)
    # Define un scriptable único para la automatización
    DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT = "auto_email_script"

    add_automation_scriptable(DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT) do
      # Define campos para la interfaz de usuario de automatización:
      field :email_template, component: :message # Cuerpo del correo electrónico a enviar
      field :csv_file_name, component: :text # Nombre del archivo CSV en la carpeta "data"

      script do |context, fields, automation|
        # Define la ruta a la carpeta de datos
        data_folder_path = Rails.root.join("plugins", "auto-email", "data")

        # Obtiene el nombre del archivo CSV del campo de automatización del administrador
        csv_file_name = fields["csv_file_name"]["value"]
        csv_file_path = File.join(data_folder_path, csv_file_name)

        # Asegúrate de que el archivo exista
        unless File.exist?(csv_file_path)
          Rails.logger.warn("¡Archivo CSV #{csv_file_path} no encontrado!")
          next
        end

        # Analiza el archivo CSV
        begin
          users = CSV.read(csv_file_path, headers: true).map(&:to_hash)
        rescue StandardError => e
          Rails.logger.error("Error al leer el archivo CSV (#{csv_file_name}): #{e.message}")
          next
        end

        # Obtiene el contenido del mensaje de correo electrónico del campo de automatización
        email_body = fields["email_template"]["value"]

        # Itera a través de los usuarios del CSV y envía correos electrónicos
        users.each do |user_data|
          email = user_data["email"] || user_data["normalized_email"]
          user = User.find_by_email(email)

          if user
            begin
              # Envía un correo electrónico automatizado usando SystemMessage
              SystemMessage.new(user).send_email(
                "custom_email_template", # Asegúrate de que esta plantilla de correo electrónico exista
                message_body: email_body
              )
              Rails.logger.info("Correo electrónico enviado a: #{email}")
            rescue StandardError => e
              Rails.logger.error("Error al enviar correo electrónico a #{email}: #{e.message}")
            end
          else
            Rails.logger.warn("No se encontró ningún usuario con el correo electrónico: #{email}")
          end
        end
      end
    end
  end
end

Y mi estructura de plugin es así:
/var/discourse/plugins/auto-email/
├── README.rb
├── data/
├── mamapedia_users_data_01.csv
├── lib/
├── plugin.rb

Sin embargo, cuando reinicio o reconstruyo la aplicación, no veo el nuevo plugin en el panel de administración. No veo ningún error en los registros.

¿Qué estoy haciendo mal? ¿Necesito hacer algo más?

4 Me gusta

Empezaría en Desarrollo de Plugins de Discourse - Parte 1 - Crear un plugin básico.

8 Me gusta

Intenté esa, es muy simple. Pero desafortunadamente no me funciona.

Probé la misma solución en dos aplicaciones diferentes. Aquí está el archivo plugin.rb que usé:

# name: auto-email
# about: Un plugin súper simple para demostrar cómo funcionan los plugins
# version: 0.0.1
# authors: Xavier Garzon

También revisé mi carpeta de plugins en el contenedor (/var/www/discourse/plugins) y parece que mi plugin no se está copiando. Quizás sea parte del problema.

Para esta segunda prueba, también intenté:

./launcher rebuild app --clean

y

./launcher restart app

Esta es la versión que estoy ejecutando:
3.4.0.beta4-dev
(9f41ce7fce)

1 me gusta

¿Pusiste tu plugin en un repositorio de GitHub?

No puedes simplemente pegar un plugin.rb en /lib, tiene que estar en plugins, y en producción, necesitas agregarlo a través de GitHub como se describe en Instalar plugins en un sitio autohospedado

Sí. Si no está ahí, no está ahí.

Realmente quieres leer todos esos temas de plugins. También quieres hacer tus pruebas en un entorno de desarrollo.

4 Me gusta