Gamificación de Discourse

¿Es posible restablecer manualmente la URL de la tabla de clasificación?

Por ejemplo, de leaderboards/2 a leaderboards/1.

¿Es posible asignar puntos a un usuario como recompensa adicional? :grin:

1 me gusta

Quizás quieras ver:

que tiene esta solicitud curl dentro:

curl --location 'https://my.discourse.com/admin/plugins/gamification/score_events' \
--header 'Api-Key: <tu clave>' \
--header 'Api-Username: <tu nombre de usuario>' \
--header 'Content-Type: application/json' \
--data '{
    "user_id": "101",
    "date": "2024-05-15",
    "points": "-141",
    "description": "Ajuste de puntos de gamificación"
}'
2 Me gusta

Habilité este plugin en el administrador, pero la pestaña “Leaderboard” no apareció automáticamente. Tampoco apareció cuando agregué nuevas tablas de clasificación. ¿Por qué sucede esto? ¿Dónde puedo ver estas tablas de clasificación?

Creo que tienes que añadirlos tú mismo a la barra lateral :thinking:. Las tablas de clasificación están en /leaderboard, /leaderboard/2, /leaderboard/3, etc.

¿Es posible crear una tabla de clasificación para una categoría o etiqueta específica?

Las tablas de clasificación están vinculadas a grupos. Pero puedes especificar qué categorías afectan a todas las tablas de clasificación en la configuración de gamificación. Parece una idea interesante mover eso a la tabla de clasificación, para tener, por ejemplo, una tabla de clasificación de #soporte aquí en esta comunidad.

4 Me gusta

2 publicaciones se dividieron en un nuevo tema: Reducción de puntos para usuarios marcados

¿Hay alguna manera de excluirme de las clasificaciones?

sí, añádete a un nuevo grupo (llámalo ‘leaderboard-exclusion’ o algo así) y luego excluye el grupo en la configuración del complemento.

edición: esto también te permitirá excluir fácilmente a cualquier otra persona si lo deseas en algún momento, añadiéndola al mismo grupo. :slight_smile:

3 Me gusta

Muchas gracias. Eso tiene sentido.

2 Me gusta

Actualicé a la versión 2026.1.0, luego creé una tabla de clasificación mensual y al acceder a la siguiente ruta se produjo un error:

http://localhost:4200/admin/plugins/discourse-gamification/leaderboards

El error es el siguiente:

assert.js:40 
 Uncaught (in promise) Error: Assertion Failed: You attempted to update `_value` on `TrackedStorageImpl`, but it had already been used previously in the same computation.  Attempting to update a value after using it in a computation can cause logical errors, infinite revalidation bugs, and performance issues, and is not supported.

`_value` was first used:

- While rendering:
  {{outlet}} for -top-level
    -top-level
      {{outlet}} for application
        application
          DiscourseRoot
            {{outlet}} for admin
              admin
                {{outlet}} for adminPlugins
                  admin-plugins
                    {{outlet}} for adminPlugins.show
                      show
                        AdminPluginConfigPage
                          AdminPluginConfigArea
                            {{outlet}} for adminPlugins.show.discourse-gamification-leaderboards
                              adminPlugins.show.discourse-gamification-leaderboards
                                {{outlet}} for adminPlugins.show.discourse-gamification-leaderboards.index
                                  discourse-gamification-leaderboards
                                    DPageSubheader
                                      (result of a `unknown` helper)

Stack trace for the update:
    at TrackedArray._dirtyCollection2 (array.ts:163:13)
    at Object.set (array.ts:126:15)
    at Proxy.sort (<anonymous>)
    at AdminPluginsShowDiscourseGamificationLeaderboardsIndexController.sortedLeaderboards (index.js:23:1)
    at AdminPluginsShowDiscourseGamificationLeaderboardsIndexController.<anonymous> (handle-descriptor.js:67:17)

Luego identifiqué el archivo problemático como:

plugins/discourse-gamification/admin/assets/javascripts/discourse/controllers/admin-plugins/show/discourse-gamification-leaderboards/index.js

Código específico:

  @discourseComputed("model.leaderboards.@each.updatedAt")
  sortedLeaderboards(leaderboards) {
    return (
      leaderboards?.sort((a, b) => compare(b?.updatedAt, a?.updatedAt)) || [] // línea 22
    );
  }

La razón del error es:

Error de aserción del sistema de gestión de estado reactivo de Ember.js (más precisamente, Glimmer), la causa principal es: dentro del mismo ciclo de computación, primero se lee un valor tracked (rastreado) y luego se intenta modificar ese valor. Esta operación de “usar primero y actualizar después” puede causar confusión lógica, bucles infinitos o problemas de rendimiento, por lo que Ember lo prohíbe directamente.

Problema clave:

  • Array.sort() modifica el array original in situ, lo que actualiza el estado leaderboards @tracked.

  • La función computada (sortedLeaderboards) tiene el propósito de derivar un nuevo valor, no de modificar el estado original; en sí misma debería ser una “función pura” (sin efectos secundarios, no modifica la fuente de entrada).

A continuación se muestra la solución de reparación:

  @discourseComputed("model.leaderboards.@each.updatedAt")
  sortedLeaderboards(leaderboards) {
    return (
      //leaderboards?.sort((a, b) => compare(b?.updatedAt, a?.updatedAt)) || []
      leaderboards?.slice().sort((a, b) => compare(b?.updatedAt, a?.updatedAt)) || []
    );
  }

Captura después de la corrección:

Luego, este tipo de problema no parece ser un caso aislado. Supongo que es un problema de incompatibilidad causado por la actualización de emberjs. Y muchos lugares en los complementos no se modificaron en consecuencia con la actualización, después de todo, este trabajo no es tan simple como parece.

Pregunta: ¿Hay un retraso en la asignación de puntos? Por ejemplo, los nuevos usuarios están realizando acciones que otorgan puntos, como publicar un nuevo tema o dar un “me gusta”, pero sus puntuaciones no aparecen. Tengo el nivel de confianza 0 incluido en la configuración, así que supongo que es solo un retraso en la asignación de puntos. Si es así, ¿con qué frecuencia se calcula y actualiza? ¡Gracias!

4 Me gusta

Me gustaría retomar esta idea. Por ahora he bloqueado los rankings a una sola categoría, pero sería mejor si esto se moviera a un ranking individual.

2 Me gusta

Eso es algo que realmente queremos hacer; solo se trata de encontrar tiempo para hacerlo o conseguir que un cliente patrocine el esfuerzo.

5 Me gusta

Hola,

He creado un nuevo tablero de clasificación, pero esto borró la configuración de mi tablero original.

¿Existe alguna forma de seleccionar qué tablero de clasificación ven mis usuarios en el frontend?

Puedes personalizar una sección para ir directamente al enlace del ranking elegido.

2 Me gusta

Sería genial ver que esto permita otorgar puntos mediante eventos personalizados también. Por ejemplo, estaba pensando en usar el plugin Discourse Points Mall para mis moderadores, y quizás incluso para miembros de la comunidad, como una forma de recompensar cosas para nuestro Discord y, en el futuro, también dentro del juego.

Podría funcionar como un sistema de otorgamiento manual o mediante un código que deban canjear. Entiendo que el alcance de este plugin está más orientado a interacciones a nivel de Discourse, pero sería agradable ver si podría ampliarse más allá. Porque, como en mi caso de uso, Discourse es solo una parte de nuestro ecosistema, no el único destino.

Edición para aclarar: sé que hay formas de lograr lo que mencioné anteriormente mediante una API, pero creo que esos métodos están más orientados a fuentes externas. Aunque también podrían otorgar puntos, creo que seguiría siendo mejor tener algo nativo :wink:

2 Me gusta

¿Has visto Cómo integrar la gamificación de Discourse con un sistema externo (canjear y otorgar puntos)?