Comment puis-je installer mon propre plugin écrit en Ruby ?

J’ai un fichier CSV avec les e-mails de mes utilisateurs Discourse. J’ai besoin de créer un script qui s’exécutera quotidiennement et enverra un modèle d’e-mail spécifique à un ensemble spécifique d’utilisateurs. Ensuite, chaque jour, je devrai exécuter ce script avec le prochain ensemble d’utilisateurs. Comment puis-je faire cela ?

Selon https://ask.discourse.com/, je dois créer mon code pour automatiser cela et placer le code et les données dans le dossier plugins. La suggestion de code est ici :

# frozen_string_literal: true
# name: auto-email
# about: A custom plugin to send bulk emails using automation and CSV files
# version: 0.3

require 'csv'

after_initialize do
  if defined?(DiscourseAutomation)
    # Define a unique scriptable for the automation
    DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT = "auto_email_script"

    add_automation_scriptable(DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT) do
      # Define fields for the automations UI:
      field :email_template, component: :message # Email body to be sent
      field :csv_file_name, component: :text # Name of CSV file in the "data" folder

      script do |context, fields, automation|
        # Define the path to the data folder
        data_folder_path = Rails.root.join("plugins", "auto-email", "data")

        # Get the CSV file name from the admin automation field
        csv_file_name = fields["csv_file_name"]["value"]
        csv_file_path = File.join(data_folder_path, csv_file_name)

        # Ensure the file exists
        unless File.exist?(csv_file_path)
          Rails.logger.warn("CSV file #{csv_file_path} not found!")
          next
        end

        # Parse the CSV file
        begin
          users = CSV.read(csv_file_path, headers: true).map(&:to_hash)
        rescue StandardError => e
          Rails.logger.error("Error reading CSV file (#{csv_file_name}): #{e.message}")
          next
        end

        # Get the email message content from the automation field
        email_body = fields["email_template"]["value"]

        # Iterate through users from the CSV and send emails
        users.each do |user_data|
          email = user_data["email"] || user_data["normalized_email"]
          user = User.find_by_email(email)
          
          if user
            begin
              # Send an automated email using SystemMessage
              SystemMessage.new(user).send_email(
                "custom_email_template", # Ensure this email template exists
                message_body: email_body
              )
              Rails.logger.info("Email sent to: #{email}")
            rescue StandardError => e
              Rails.logger.error("Failed to send email to #{email}: #{e.message}")
            end
          else
            Rails.logger.warn("No user found with email: #{email}")
          end
        end
      end
    end
  end
end

Et ma structure de plugin ressemble à ceci :
/var/discourse/plugins/auto-email/
├── README.rb
├── data/
├── mamapedia_users_data_01.csv
├── lib/
├── plugin.rb

Cependant, lorsque je redémarre ou reconstruis l’application, je ne vois pas le nouveau plugin dans le panneau d’administration. Je ne vois aucune erreur dans les journaux.

Qu’est-ce que je fais de mal ? Dois-je faire autre chose ?

4 « J'aime »

Je commencerais par Développer des plugins Discourse - Partie 1 - Créer un plugin de base.

8 « J'aime »

J’ai essayé celui-ci, il est très simple. Mais malheureusement, il ne fonctionne pas pour moi.

J’ai testé la même solution dans deux applications différentes. Voici le fichier plugin.rb que j’ai utilisé :

# name: auto-email
# about: Un plugin super simple pour démontrer le fonctionnement des plugins
# version: 0.0.1
# authors: Xavier Garzon

J’ai également vérifié mon dossier de plugins dans le conteneur (/var/www/discourse/plugins) et il semble que mon plugin ne soit pas copié. C’est peut-être une partie du problème.

Pour ce deuxième test, j’ai également essayé :

./launcher rebuild app --clean

et

./launcher restart app

Voici la version que j’utilise :
3.4.0.beta4-dev
(9f41ce7fce)

1 « J'aime »

Avez-vous mis votre plugin dans un dépôt GitHub ?

Vous ne pouvez pas simplement placer un plugin.rb dans /lib, il doit être dans plugins, et en production, vous devez l’ajouter via GitHub comme décrit dans Installer des plugins sur un site auto-hébergé

Oui. S’il n’y est pas, il n’y est pas.

Vous voulez vraiment lire tous ces sujets sur les plugins. Vous voulez également faire vos tests dans un environnement de développement.

4 « J'aime »