Wie kann ich mein eigenes in Ruby geschriebenes Plugin installieren?

Ich habe eine CSV-Datei mit meinen Discourse-Benutzer-E-Mails. Ich muss ein Skript erstellen, das täglich ausgeführt wird und eine bestimmte E-Mail-Vorlage an eine bestimmte Gruppe von Benutzern sendet. Dann muss ich dieses Skript jeden Tag mit der nächsten Gruppe von Benutzern ausführen. Wie kann ich das tun?

Laut https://ask.discourse.com/ muss ich meinen Code zur Automatisierung erstellen und den Code und die Daten im Ordner plugins ablegen. Der Code-Vorschlag ist hier:

# frozen_string_literal: true
# name: auto-email
# about: Ein benutzerdefiniertes Plugin zum Senden von Massen-E-Mails mithilfe von Automatisierung und CSV-Dateien
# version: 0.3

require 'csv'

after_initialize do
  if defined?(DiscourseAutomation)
    # Definieren Sie ein eindeutiges Skript für die Automatisierung
    DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT = "auto_email_script"

    add_automation_scriptable(DiscourseAutomation::Scriptable::AUTO_EMAIL_SCRIPT) do
      # Definieren Sie Felder für die Automatisierungs-UI:
      field :email_template, component: :message # E-Mail-Text, der gesendet werden soll
      field :csv_file_name, component: :text # Name der CSV-Datei im Ordner "data"

      script do |context, fields, automation|
        # Definieren Sie den Pfad zum Datenordner
        data_folder_path = Rails.root.join("plugins", "auto-email", "data")

        # Holen Sie sich den Namen der CSV-Datei aus dem Admin-Automatisierungsfeld
        csv_file_name = fields["csv_file_name"]["value"]
        csv_file_path = File.join(data_folder_path, csv_file_name)

        # Stellen Sie sicher, dass die Datei existiert
        unless File.exist?(csv_file_path)
          Rails.logger.warn("CSV-Datei #{csv_file_path} nicht gefunden!")
          next
        end

        # Parsen Sie die CSV-Datei
        begin
          users = CSV.read(csv_file_path, headers: true).map(&:to_hash)
        rescue StandardError => e
          Rails.logger.error("Fehler beim Lesen der CSV-Datei (#{csv_file_name}): #{e.message}")
          next
        end

        # Holen Sie sich den Inhalt der E-Mail-Nachricht aus dem Automatisierungsfeld
        email_body = fields["email_template"]["value"]

        # Iterieren Sie durch die Benutzer aus der CSV und senden Sie E-Mails
        users.each do |user_data|
          email = user_data["email"] || user_data["normalized_email"]
          user = User.find_by_email(email)
          
          if user
            begin
              # Senden Sie eine automatisierte E-Mail mit SystemMessage
              SystemMessage.new(user).send_email(
                "custom_email_template", # Stellen Sie sicher, dass diese E-Mail-Vorlage existiert
                message_body: email_body
              )
              Rails.logger.info("E-Mail gesendet an: #{email}")
            rescue StandardError => e
              Rails.logger.error("Fehler beim Senden der E-Mail an #{email}: #{e.message}")
            end
          else
            Rails.logger.warn("Kein Benutzer mit der E-Mail gefunden: #{email}")
          end
        end
      end
    end
  end
end

Und meine Plugin-Struktur sieht so aus:
/var/discourse/plugins/auto-email/
├── README.rb
├── data/
├── mamapedia_users_data_01.csv
├── lib/
├── plugin.rb

Wenn ich jedoch die App neu starte oder neu erstelle, sehe ich das neue Plugin nicht im Admin-Panel. Ich sehe keine Fehler in den Protokollen.

Was mache ich falsch? Muss ich noch etwas tun?

4 „Gefällt mir“

Ich würde mit Entwicklung von Discourse-Plugins – Teil 1 – Erstellen eines einfachen Plugins beginnen.

8 „Gefällt mir“

Ich habe das ausprobiert, es ist sehr einfach. Aber leider funktioniert es bei mir nicht.

Ich habe die gleiche Lösung in zwei verschiedenen Apps getestet. Hier ist die plugin.rb-Datei, die ich verwendet habe:

# name: auto-email
# about: Ein super einfaches Plugin, um zu demonstrieren, wie Plugins funktionieren
# version: 0.0.1
# authors: Xavier Garzon

Ich habe auch meinen Plugins-Ordner im Container (/var/www/discourse/plugins) überprüft und es scheint, dass mein Plugin nicht kopiert wird. Vielleicht ist das Teil des Problems.

Für diesen zweiten Test habe ich auch Folgendes versucht:

./launcher rebuild app --clean

und

./launcher restart app

Dies ist die Version, die ich ausführe:
3.4.0.beta4-dev
(9f41ce7fce)

1 „Gefällt mir“

Hast du dein Plugin in ein GitHub-Repository gestellt?

Du kannst nicht einfach eine plugin.rb in /lib stecken, sie muss in plugins sein, und in der Produktion musst du sie über GitHub hinzufügen, wie in Plugins auf einer selbst gehosteten Website installieren beschrieben.

Ja. Wenn es nicht da ist, ist es nicht da.

Du solltest dir wirklich alle diese Plugin-Themen durchlesen. Du solltest deine Tests auch in einer Entwicklungsumgebung durchführen.

4 „Gefällt mir“