S'abonner pour publier une annonce

Je cherche une façon d’implémenter une catégorie en tant que simple marché où les utilisateurs peuvent acheter une publicité (lire un post).

Il semble que le plugin des abonnements permette d’ajouter un paiement à un groupe, et ensuite, lorsque l’abonnement est annulé, manuellement ou de manière programmatique, cela retire l’utilisateur.

Ce que j’essaie d’accomplir, c’est un abonnement qui permettra de publier dans une catégorie puis de les retirer du groupe autorisé à publier.

Cela peut-il être réalisé uniquement avec le plugin des abonnements, ou peut-être en combinant abonnements et automatisation ?

Pour faire court, je veux vendre des posts individuels. Les réponses aux posts seraient gratuites.

Je pense que cet ensemble d’autorisations permettrait ce que je demande étant donné que « marketplace » est le groupe d’abonnement.

Je pense qu’il vous faudrait un plugin qui supprimerait les utilisateurs du groupe lors de la création d’un sujet dans la catégorie annonce.

Je ne pense pas que le plugin d’automatisation supprimera les utilisateurs des groupes.

1 « J'aime »

Eh bien, je ne peux pas coder moi-même, et comme ce serait une preuve de concept avant que je ne puisse convaincre mon patron de le soutenir, je n’ai pas de moyen d’offrir un soutien monétaire pour le moment.
Quelqu’un d’autre pense qu’une chose comme ça serait bénéfique pour la communauté ?

Une autre considération, est-ce qu’il y a une communication entre Discourse et le plugin d’abonnements qui pourrait suivre le nombre d’abonnements d’un utilisateur ? Cela serait utile pour permettre à quelqu’un d’acheter plusieurs publications en une seule fois plutôt que d’acheter une, de poster, puis d’acheter une autre et de poster à nouveau.

Il vous suffirait de lui dire d’utiliser son imagination pour la preuve de concept.

Vous pourriez probablement le faire avec des webhooks et l’un de ces outils de webhook comme Zapier.

Cela rendrait le plugin plus compliqué.

C’est sûr, mais ce serait cool à avoir.
Quoi qu’il en soit, il semble que cela ferait l’affaire tant que vous codez en dur l’ID de catégorie et le nom du groupe.
Des vrais codeurs peuvent-ils développer cela afin que vous puissiez définir ces variables à partir de la page des paramètres du plugin ?

# name: discourse-auto-remove-group
# version: 0.1
# authors: tknospdr
# url: https://github.com/tknospdr/discourse-auto-remove-group

enabled_site_setting :auto_remove_group_enabled

# Paramètre du site pour activer/désactiver le plugin
register_site_setting :auto_remove_group_enabled, type: :boolean, default: false
register_site_setting :auto_remove_group_category_id, type: :integer, default: 0
register_site_setting :auto_remove_group_name, type: :string, default: ""

after_initialize do
  # Écoute les événements de création de post
  DiscourseEvent.on(:post_created) do |post|
    next unless SiteSetting.auto_remove_group_enabled
    next unless post&.user # S'assurer que le post a un utilisateur
    next unless post&.topic&.category_id # S'assurer que le post est dans une catégorie

    target_category_id = SiteSetting.auto_remove_group_category_id
    group_name = SiteSetting.auto_remove_group_name

    # Vérifier si le post est dans la catégorie configurée
    if post.topic.category_id == target_category_id
      begin
        group = Group.find_by(name: group_name)
        unless group
          Rails.logger.error("AutoRemoveGroup: Groupe '#{group_name}' introuvable")
          next
        end

        user = post.user
        if group.users.include?(user)
          group.remove(user)
          Rails.logger.info("AutoRemoveGroup: Utilisateur #{user.username} retiré du groupe #{group_name} après avoir posté dans la catégorie #{target_category_id}")
        else
          Rails.logger.info("AutoRemoveGroup: L'utilisateur #{user.username} n'est pas dans le groupe #{group_name}, aucune action effectuée")
        end
      rescue StandardError => e
        Rails.logger.error("AutoRemoveGroup: Erreur lors du retrait de l'utilisateur du groupe : #{e.message}")
      end
    end
  end
end

Ça pourrait marcher !

Commencez avec le Discourse-plugin-skeleton, faites-en votre plugin.rb et voyez peut-être ce que Ask.discourse.com peut faire pour vous aider.

Et utilisez add_model_callback au lieu de Discourse.event. Vous pouvez consulter le dépôt all_the_plugins pour quelques exemples.

1 « J'aime »

Grok et ask.discourse.com disent tous deux d’installer le plugin dans /var/discouse/plugins/.

Le problème est que je n’ai pas ce chemin, ni à l’intérieur ni à l’extérieur du conteneur. Le plus proche que je puisse trouver est à l’intérieur du conteneur, j’ai /var/www/discourse/plugins/.

Lorsque j’essaie de l’installer là et de reconstruire, il disparaît.

D’accord, donc le bot dit que c’est normal pour une installation auto-hébergée. Je ne sais pas comment configurer un dépôt git approprié pour installer le plugin de la manière normale. Quelqu’un peut-il m’aider avec ça ?

Je pense avoir lancé git, installé le plugin et rencontré quelques erreurs. C’est honnêtement là où je suis perdu.

/var/www/discourse/plugins/discourse-auto-remove-group/plugin.rb:9:in `activate!': méthode indéfinie `register_site_setting' pour une instance de Plugin::Instance (NoMethodError)
Vous ne pouvez pas démarrer Discourse à cause d'erreurs dans le plugin à
/var/www/discourse/plugins/discourse-auto-remove-group

Veuillez essayer de supprimer ce plugin et de reconstruire à nouveau !
I, [2025-05-20T16:17:10.306025 #1]  INFO -- : 
I, [2025-05-20T16:17:10.347496 #1]  INFO -- : Résiliation des processus asynchrones
I, [2025-05-20T16:17:10.350251 #1]  INFO -- : Envoi de INT à HOME=/var/lib/postgresql USER=postgres exécuter chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main pid: 42
I, [2025-05-20T16:17:10.351238 #1]  INFO -- : Envoi de TERM à exécuter chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 109
2025-05-20 16:17:10.351 UTC [42] LOG :  réception de la demande d'arrêt rapide
109:signal-handler (1747757830) réception de SIGTERM planification de l'arrêt...
109:M 20 mai 2025 16:17:10.368 # L'utilisateur a demandé l'arrêt...
109:M 20 mai 2025 16:17:10.369 * Sauvegarde du dernier instantané RDB avant la sortie.
2025-05-20 16:17:10.412 UTC [42] LOG :  annulation de toutes transactions actives
2025-05-20 16:17:10.438 UTC [42] LOG :  arrière-plan travailleur "logical replication launcher" (PID 56) a quitté avec le code de sortie 1
2025-05-20 16:17:10.438 UTC [51] LOG :  fermeture en cours
2025-05-20 16:17:10.447 UTC [51] LOG :  début du point de contrôle : fermeture immédiate
2025-05-20 16:17:10.526 UTC [51] LOG :  point de contrôle terminé : écrit 0 tampons (0.0%) ; 0 fichier WAL ajouté, 0 supprimé, 0 recyclé ; écriture=0.001 s, synchronisation=0.001 s, total=0.088 s ; fichiers de synchronisation=0, le plus long=0.000 s, moyenne=0.000 s ; distance=0 kB, estimation=4 kB
2025-05-20 16:17:10.540 UTC [42] LOG :  système de base de données arrêté
109:M 20 mai 2025 16:17:10.947 * La base de données est enregistrée sur disque
109:M 20 mai 2025 16:17:10.947 # Redis est prêt à sortir, au revoir...


ÉCHEC
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' a échoué avec le retour #Process::Status: pid 987 sortant 1
Lieu de l'échec : /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed avec les paramètres {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
L'initialisation a échoué avec le code de sortie 1
** ÉCHEC DE L'INITIALISATION ** veuillez faire défiler vers le haut et rechercher les messages d'erreur précédents, il peut y en avoir plusieurs.
./discourse-doctor peut aider à diagnostiquer le problème.
9fed9596b10ffb4628947e678585b813813ae27a4de746feba16e89f2b9cdc51

Sacrebleu ! Après plusieurs autres conversations avec Ask Discourse et Grok, le plugin fonctionne maintenant.

Je suppose que l’IA est vraiment UTILE parfois.

C’est moche, mais ça fonctionne.


1 « J'aime »

Avez-vous une version de développement configurée ?

Je ne comprends même pas ce que cela signifie. :sourire:

Vous devriez placer l’URL du dépôt Github dans votre fichier app.yml, si vous effectuez une installation en production.

La méthode de clonage que vous avez utilisée convient davantage pour des installations en développement, mais je ne pense pas que ce soit ce que vous exécutez (puisque vous utilisez le launcher).

Ah oui, c’est ce que j’ai fait.
J’ai ajouté une ligne git clone dans le fichier app.yml et reconstruit pour faire avancer les choses.

2 « J'aime »

Content que vous avez réussi à faire fonctionner !

Si vous allez développer un plugin, il est 1000 fois plus rapide de configurer Installer Discourse pour le développement à l’aide de Docker ou Installer Discourse sous Windows pour le développement ou sous Linux ou Mac.

Cela signifie que vous pouvez modifier un fichier et actualiser votre navigateur pour voir si cela a fonctionné. Parfois, vous n’avez même pas besoin d’actualiser.

1 « J'aime »