Como posso instalar meu próprio plugin escrito em Ruby?

Tenho um arquivo CSV com os e-mails dos meus usuários do Discourse. Preciso criar um script que será executado diariamente e enviará um modelo de e-mail específico para um conjunto específico de usuários. Então, todos os dias, preciso executar este script com o próximo conjunto de usuários. Como posso fazer isso?

De acordo com https://ask.discourse.com/, preciso criar meu código para automatizar isso e colocar o código e os dados na pasta plugins. A sugestão de código está aqui:

# frozen_string_literal: true
# name: auto-email
# about: Um plugin personalizado para enviar e-mails em massa usando automação e arquivos CSV
# version: 0.3

require 'csv'

after_initialize do
  if defined?(DiscourseAutomation)
    # Define um scriptable exclusivo para a automação
    DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT = "auto_email_script"

    add_automation_scriptable(DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT) do
      # Define campos para a interface de usuário de automação:
      field :email_template, component: :message # Corpo do e-mail a ser enviado
      field :csv_file_name, component: :text # Nome do arquivo CSV na pasta "data"

      script do |context, fields, automation|
        # Define o caminho para a pasta de dados
        data_folder_path = Rails.root.join("plugins", "auto-email", "data")

        # Obtém o nome do arquivo CSV do campo de automação do administrador
        csv_file_name = fields["csv_file_name"]["value"]
        csv_file_path = File.join(data_folder_path, csv_file_name)

        # Garante que o arquivo exista
        unless File.exist?(csv_file_path)
          Rails.logger.warn("Arquivo CSV #{csv_file_path} não encontrado!")
          next
        end

        # Analisa o arquivo CSV
        begin
          users = CSV.read(csv_file_path, headers: true).map(&:to_hash)
        rescue StandardError => e
          Rails.logger.error("Erro ao ler o arquivo CSV (#{csv_file_name}): #{e.message}")
          next
        end

        # Obtém o conteúdo da mensagem de e-mail do campo de automação
        email_body = fields["email_template"]["value"]

        # Itera sobre os usuários do CSV e envia e-mails
        users.each do |user_data|
          email = user_data["email"] || user_data["normalized_email"]
          user = User.find_by_email(email)

          if user
            begin
              # Envia um e-mail automatizado usando SystemMessage
              SystemMessage.new(user).send_email(
                "custom_email_template", # Garanta que este modelo de e-mail exista
                message_body: email_body
              )
              Rails.logger.info("E-mail enviado para: #{email}")
            rescue StandardError => e
              Rails.logger.error("Falha ao enviar e-mail para #{email}: #{e.message}")
            end
          else
            Rails.logger.warn("Nenhum usuário encontrado com o e-mail: #{email}")
          end
        end
      end
    end
  end
end

E minha estrutura de plugin é assim:
/var/discourse/plugins/auto-email/
├── README.rb
├── data/
├── mamapedia_users_data_01.csv
├── lib/
├── plugin.rb

No entanto, quando reinicio ou reconstruo o aplicativo, não vejo o novo plugin no painel de administração. Não vejo nenhum erro nos logs.

O que estou fazendo de errado? Preciso fazer mais alguma coisa?

4 curtidas

Eu começaria em Desenvolvendo Plugins do Discourse - Parte 1 - Crie um plugin básico.

8 curtidas

Eu tentei essa, é muito simples. Mas infelizmente não está funcionando para mim.

Testei a mesma solução em dois aplicativos diferentes. Aqui está o arquivo plugin.rb que usei:

# name: auto-email
# about: Um plugin super simples para demonstrar como os plugins funcionam
# version: 0.0.1
# authors: Xavier Garzon

Também verifiquei minha pasta de plugins no contêiner (/var/www/discourse/plugins) e parece que meu plugin não está sendo copiado. Talvez isso seja parte do problema.

Para este segundo teste, também tentei:

./launcher rebuild app --clean

e

./launcher restart app

Esta é a versão que estou executando:
3.4.0.beta4-dev
(9f41ce7fce)

1 curtida

Você colocou seu plugin em um repositório do GitHub?

Você não pode simplesmente colocar um plugin.rb em /lib, ele tem que estar em plugins, e em produção, você precisa adicioná-lo via GitHub como descrito em Instalar plugins em um site auto-hospedado

Sim. Se não está lá, não está lá.

Você realmente quer ler todos esses tópicos de plugins. Você também quer fazer seus testes em um ambiente de desenvolvimento.

4 curtidas