Suscríbete para publicar un anuncio

Estoy buscando una forma de implementar una categoría como un mercado simple donde los usuarios puedan comprar un anuncio (leer publicación).

Parece que el plugin de suscripciones permitirá una adición paga a un grupo, y luego, cuando se cancele la suscripción, ya sea manualmente o programáticamente, elimina al usuario.

Lo que intento lograr es una suscripción que permita una publicación en una categoría y luego los elimine del grupo permitido para publicar.

¿Se puede lograr esto solo con el plugin de suscripciones, o quizás entre suscripciones y automatización?

Dicho de manera más simple, quiero vender publicaciones individuales. Las respuestas a las publicaciones serían gratuitas.

Creo que este conjunto de permisos permitiría lo que estoy pidiendo dado que ‘marketplace’ es el grupo de suscripción.

Creo que necesitarías un complemento que elimine a los usuarios del grupo al crear un tema en la categoría de anuncios.

No creo que el complemento de automatización elimine a los usuarios de los grupos.

1 me gusta

Bueno, no puedo programar yo mismo, y como esto sería una prueba de concepto antes de que pudiera convencer a mi jefe de apoyarlo, no tengo manera de ofrecer soporte monetario en este momento.
¿Alguien más piensa que algo así sería bueno para la comunidad?

Otra consideración, es si hay alguna comunicación entre Discourse y el plugin de suscripciones que pueda llevar el control de cuántas suscripciones tiene un usuario. Sería útil permitir que alguien compre múltiples publicaciones a la vez en lugar de comprar una, luego publicar, luego otra y volver a comprar.

[citar=“tknospdr, post:6, topic:366751”]
esto sería una prueba de concepto antes de que pudiera lograr que mi jefe lo apoye, no tengo una forma de ofrecer apoyo monetario en este momento.
[/citar]

Solo tendrías que decirle que use su imaginación para la prueba de concepto.

Probablemente podrías hacerlo con webhooks y alguna de esas herramientas de webhooks como Zapier.

[citar=“tknospdr, post:6, topic:366751”]
Sería útil permitir que alguien compre varias publicaciones a la vez en lugar de comprar una, luego publicar, luego comprar otra y volver a publicar.
[/citar]

Eso haría que el plugin fuera más complicado.

Sin duda, pero sería genial tenerlo.
De todos modos, parece que esto haría el trabajo siempre que codifiques la ID de la categoría y el nombre del grupo.
¿Pueden los programadores reales ampliar esto para que puedas configurar esas variables desde la página de configuración del 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

# Configuración del sitio para habilitar/deshabilitar el 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
  # Escuchar eventos de creación de publicaciones
  DiscourseEvent.on(:post_created) do |post|
    next unless SiteSetting.auto_remove_group_enabled
    next unless post&.user # Asegurarse de que la publicación tenga un usuario
    next unless post&.topic&.category_id # Asegurarse de que la publicación esté en una categoría

    target_category_id = SiteSetting.auto_remove_group_category_id
    group_name = SiteSetting.auto_remove_group_name

    # Comprobar si la publicación está en la categoría configurada
    if post.topic.category_id == target_category_id
      begin
        group = Group.find_by(name: group_name)
        unless group
          Rails.logger.error("AutoRemoveGroup: Grupo '#{group_name}' no encontrado")
          next
        end

        user = post.user
        if group.users.include?(user)
          group.remove(user)
          Rails.logger.info("AutoRemoveGroup: Se eliminó al usuario #{user.username} del grupo #{group_name} después de publicar en la categoría #{target_category_id}")
        else
          Rails.logger.info("AutoRemoveGroup: El usuario #{user.username} no está en el grupo #{group_name}, no se tomó ninguna medida")
        end
      rescue StandardError => e
        Rails.logger.error("AutoRemoveGroup: Error al eliminar al usuario del grupo: #{e.message}")
      end
    end
  end
end

¡Eso podría funcionar!

Empieza con Discourse-plugin-skeleton, haz que sea tu plugin.rb y quizás mira qué puede hacer Ask.discourse.com para ayudar.

Y usa add_model_callback en lugar de Discourse.event. Puedes buscar algunos ejemplos en el repositorio all_the_plugins.

1 me gusta

Tanto grok como ask.discourse.com indican que instale el plugin en /var/discouse/plugins/.

El problema es que no tengo esa ruta, ni dentro ni fuera del contenedor. Lo más parecido que encuentro es dentro del contenedor, tengo /var/www/discourse/plugins/.

Cuando intento instalarlo allí y reconstruir, desaparece.

Bien, así que el bot dice que eso es normal para una instalación autoalojada. No sé cómo configurar un repositorio git adecuado para instalar el plugin de la manera normal. ¿Alguien puede ayudarme con eso?

Creo que tengo Git funcionando, instalé el plugin y obtuve algunos errores. Honestamente, aquí es donde me pierdo.

/var/www/discourse/plugins/discourse-auto-remove-group/plugin.rb:9:in `activate!': método indefinido `register_site_setting' para una instancia de Plugin::Instance (NoMethodError)
No puedes iniciar Discourse debido a errores en el plugin en
/var/www/discourse/plugins/discourse-auto-remove-group

Por favor, intenta eliminar este plugin y reconstruirlo nuevamente!
I, [20-05-2025T16:17:10.306025 #1]  INFO -- : 
I, [20-05-2025T16:17:10.347496 #1]  INFO -- : Terminando procesos asíncronos
I, [20-05-2025T16:17:10.350251 #1]  INFO -- : Enviando INT a HOME=/var/lib/postgresql USUARIO=postgres ejecutando 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, [20-05-2025T16:17:10.351238 #1]  INFO -- : Enviando TERM a ejecutando 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:  solicitud de apagado rápido recibida
109:signal-handler (1747757830) recibida SIGTERM programando apagado...
109:M 20 mayo 2025 16:17:10.368 # El usuario solicitó el apagado...
109:M 20 mayo 2025 16:17:10.369 * Guardando la instantánea RDB final antes de salir.
2025-05-20 16:17:10.412 UTC [42] LOG:  abortando transacciones activas
2025-05-20 16:17:10.438 UTC [42] LOG:  trabajador en segundo plano "logical replication launcher" (PID 56) salió con código de salida 1
2025-05-20 16:17:10.438 UTC [51] LOG:  apagando
2025-05-20 16:17:10.447 UTC [51] LOG:  punto de control iniciando: apagado inmediato
2025-05-20 16:17:10.526 UTC [51] LOG:  punto de control completo: escribió 0 buffers (0.0%); 0 archivo WAL añadido, 0 eliminado, 0 reciclado; tiempo de escritura=0.001 s, sincronización=0.001 s, total=0.088 s; archivos de sincronización=0, el más largo=0.000 s, promedio=0.000 s; distancia=0 kB, estimado=4 kB
2025-05-20 16:17:10.540 UTC [42] LOG:  sistema de base de datos apagado
109:M 20 mayo 2025 16:17:10.947 * DB guardada en disco
109:M 20 mayo 2025 16:17:10.947 # Redis ahora está listo para salir, adiós...


FALLADO
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' falló con estado de retorno #<Process::Status: pid 987 salida 1>
Ubicación de la falla: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:en `spawn'
exec falló con los parámetros {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
La bootstrap falló con código de salida 1
** FALLÓ EL INICIO ** por favor, desplázate hacia arriba y busca mensajes de error anteriores, puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el problema.
9fed9596b10ffb4628947e678585b813813ae27a4de746feba16e89f2b9cdc51

¡Cáspita! Después de varias conversaciones más con Ask Discourse y Grok. El plugin ahora está funcionando.

Supongo que la IA realmente ES útil a veces.

Es feo, pero se confirma que funciona.


1 me gusta

¿Tienes configurada una instancia de desarrollo?

Ni siquiera sé qué significa eso. :sonrisa:

Debe colocar la URL del repositorio de Github en su archivo app.yml, si está realizando una instalación de producción.

El método de clonación que hizo funciona más para instalaciones en desarrollo, pero no creo que eso sea lo que está ejecutando (ya que está usando launcher).

Ah, sí, eso fue lo que hice.
Agregué una línea de clonación de git en el archivo app.yml y lo reconstruí para que las cosas funcionaran.

2 Me gusta

¡Me alegra que hayas logrado que funcione!

Si vas a desarrollar un plugin, es 1000 veces más rápido configurar un Instalar Discourse para desarrollo usando Docker o Instalar Discourse en Windows para desarrollo o Linux o Mac.

Esto significa que puedes editar un archivo y presionar recargar en tu navegador para ver si funcionó. A veces, ni siquiera tienes que recargar.

1 me gusta