Asignación automática de títulos basada en el nivel de confianza en Discourse

Hola a todos,

He configurado un sistema de clasificación con títulos personalizados, pero como saben, Discourse no tiene una forma integrada de asignar un título predeterminado a todos los usuarios nuevos. Así que creé una solución alternativa donde:

  • Los miembros nuevos están en el Grupo 1
  • Los miembros activos están en el Grupo 2
  • Y así sucesivamente…

El método que utilicé es el siguiente:

cd /var/discourse
./launcher enter app
rails c

User.where(trust_level: 0).update_all(title: "عضو جديد")
User.where(trust_level: 1).update_all(title: "عضو جديد")
User.where(trust_level: 2).update_all(title: "عضو مشارك")
User.where(trust_level: 3).update_all(title: "عضو مبدع")

El Problema

Tengo que ejecutar estos comandos manualmente cada vez que se une un nuevo usuario. Si ejecuto el script hoy y un nuevo miembro publica mañana, no obtendrán el título automáticamente, por lo que tengo que iniciar sesión en el servidor y volver a ejecutar los comandos.

Intenté automatizarlo con un script de Ruby y llamarlo a través de crontab, pero obtengo un error.

Le pregunté a ChatGPT y me dijo:

“El modelo User no se carga cuando ejecutas el script directamente con Ruby fuera del entorno de Discourse”.

El problema es que no tengo la configuración adecuada de config/environment dentro de los archivos de Discourse.

Lo agregué, pero no funcionó.

Mi Pregunta

¿Hay alguna forma de automatizar esto sin usar crontab? ¿O cómo puedo ejecutar correctamente un script que actualice los títulos de los usuarios sin tener que ingresar manualmente a la consola de Rails cada vez?

¡Gracias de antemano!

2 Me gusta

¿Alguna ayuda?

Quizás sea posible creando automatizaciones personalizadas para Discourse Automation y Create custom Automations, pero no sé cómo funciona.

1 me gusta

Puedes lograr esto con un script de automatización personalizado que utilice los desencadenadores User Event y User Promoted Event. Cuando se crea un nuevo usuario (User Event) o cambia su nivel de confianza (User Promoted Event), puedes activar un script para asignarle automáticamente un título según su nivel de confianza.

5 Me gusta

¡Gracias @jahan_gagan! ¿Alguna ayuda para crear este script?

¡Guau! ¡Buen hackeo! :clap:

Parece desafortunado que algunas configuraciones de grupo no estén disponibles para los grupos automatizados, como los niveles de confianza. Debería ser posible establecer el título del usuario según el grupo de nivel de confianza en el que se encuentre, pero no lo es.

Podrías intentar hacerlo usando el sistema de insignias. Crea una insignia que se otorgue cuando un miembro alcance el nivel de confianza que deseas y luego establece “Permitir que la insignia se use como título”.

Luego puedes crear una automatización usando el script “Pertenencia a grupos de usuarios a través de insignias” que se ejecuta todos los días y actualiza el título y el distintivo del usuario.

5 Me gusta

¿Sería un componente temático que agregara esta información a la tarjeta de publicación/usuario más flexible? De esa manera, los usuarios aún pueden usar el campo de título para otras cosas según lo previsto (insignias, identificadores de grupo, algo personalizado que pueda desear agregar), y que sea agregado por un componente temático significaría que no podrían cambiarlo/eliminarlo.

1 me gusta

Hola,

Estoy intentando implementar esto usando la automatización del sistema de insignias, pero me encuentro con una limitación.

Para ejecutar el script user_group_membership_through_badge, debo especificar un grupo. Sin embargo, ya utilizo los grupos predeterminados del sistema: Nivel de Confianza 1, 2, 3, 4. Estos grupos están integrados y no se pueden seleccionar en la herramienta de automatización.

Si creo nuevos grupos para usar con esta automatización, me temo que todos los miembros actuales no se transferirán automáticamente y perderé la correspondencia precisa de los usuarios con sus niveles de confianza.

Aquí hay una captura de pantalla que muestra el error cuando el campo de grupo se deja vacío:

¿Hay alguna forma de aplicar la actualización de insignia a título sin requerir un grupo?
¿O hay alguna solución para apuntar directamente a los grupos de Nivel de Confianza dentro de esta automatización?

@xkhalid He preparado un plugin rápido (¡también es mi primero!) que:
<s

  • Asigna un título a los nuevos usuarios
  • Cambia el título al correspondiente según su Nivel de Confianza. Por ejemplo, TL1 → TL2: los usuarios obtienen el título TL2 ahora, en lugar del título TL1.
    </s
  • Actualiza los títulos de los usuarios cada 12 horas (planes para hacer la frecuencia configurable)

Todos los títulos configurables a través de la configuración :slightly_smiling_face:.

4 Me gusta

¡Gracias!

Después de añadir esto a app.yml

- git clone https://github.com/NateDhaliwal/add-title-based-on-trust-level.git

y reconstruir, me encontré con un error de 502 Bad Gateway. ¿Alguna solución?
Por ahora, lo he eliminado de app.yml y todo funciona bien.

Vaya, extraño. Si mal no recuerdo, ese error a veces puede aparecer después de una reconstrucción, pero esperar a que se resuelva (o hacer otra reconstrucción) lo solucionará.

Sí, lo sé, pero este problema solo ocurrió después de que agregué el repositorio de Git y reconstruí. Me dio este error.

Sin embargo, lo intentaré de nuevo más tarde.


¿Qué pasa con este problema? ¿Podría estar relacionado?

1 me gusta

Le echaré otro vistazo, gracias por informarme.

1 me gusta

@xkhalid ¿podrías intentarlo ahora? Acabo de actualizarlo.

1 me gusta

¡Gracias! Ahora funciona.

Pero no se refleja para todos los usuarios. Por ejemplo, este usuario tiene el nivel de confianza 1 y es un usuario nuevo, pero no se le ha asignado ningún título.

¿Tardará o…?

@xkhalid He implementado una corrección. Por favor, dime si ahora funciona.
¡Gracias!

¡Quiero agradecer a @NateDhaliwal por su plugin!

¡Fue muy útil! y el título se actualiza cada 12 horas.

1 me gusta

¡Hola, gracias por tu excelente plugin!

Tengo una necesidad más compleja:
Me gustaría establecer títulos de usuario automáticamente basándome en una combinación de membresía de grupo (por ejemplo: grupo A o grupo B) y nivel de confianza (por ejemplo: TL2, TL3, etc.). Por ejemplo, un usuario en el grupo A con TL2 obtendría el título “A - TL2”, y así sucesivamente.

¿Sería posible extender tu plugin para soportar esta función, o tienes algún consejo sobre cómo implementarla?
No tengo experiencia en programación, así que agradecería mucho cualquier sugerencia o ayuda.

¡Muchas gracias!

¿Son estos grupos los grupos principales del usuario?

Sí, quiero usar el grupo principal del usuario para decidir el título.