Gamification dans Discourse

Est-il possible de réinitialiser manuellement l’URL du classement ?

Par exemple, passer de leaderboards/2 à leaderboards/1.

Est il possible d’attribuer des points à un utilisateur comme récompense supplémentaire ? :grin:

1 « J'aime »

Vous pourriez vouloir voir :

qui contient cette requête curl à l’intérieur :

curl --location 'https://my.discourse.com/admin/plugins/gamification/score_events' \
--header 'Api-Key: <votre clé>' \
--header 'Api-Username: <votre nom d\'utilisateur>' \
--header 'Content-Type: application/json' \
--data '{
    "user_id": "101",
    "date": "2024-05-15",
    "points": "-141",
    "description": "Ajustement des points de gamification"
}'
2 « J'aime »

J’ai activé ce plugin dans l’administration, mais la barre d’onglets n’a pas automatiquement affiché “Leaderboard”, et l’ajout de nouvelles listes n’a pas non plus fait apparaître. Pourquoi ? Où puis-je voir ces listes ?

Je pense que vous devez les ajouter vous-même à la barre latérale :thinking:. Les classements se trouvent sur /leaderboard, /leaderboard/2, /leaderboard/3, etc.

Est-il possible de créer un classement pour une catégorie ou une étiquette spécifique ?

Les classements sont liés aux groupes. Mais vous pouvez spécifier quelles catégories affectent tous les classements dans les paramètres de gamification. Cela semble être une idée intéressante de déplacer cela vers le classement, par exemple pour avoir un classement de Support ici dans cette communauté.

4 « J'aime »

2 messages ont été divisées dans un nouveau sujet : Réduction des points pour les utilisateurs signalés

Y a-t-il un moyen de m’exclure des classements ?

oui ajoutez-vous à un nouveau groupe (appelez-le « exclusion-classement » ou quelque chose de similaire) puis excluez ce groupe dans les paramètres du plugin.

édition : cela vous permettra également d’exclure facilement toute autre personne si vous le souhaitez à un moment donné, en l’ajoutant au même groupe. :slight_smile:

3 « J'aime »

Merci beaucoup. Cela a du sens.

2 « J'aime »

Après avoir effectué la mise à niveau vers la version 2026.1.0, j’ai créé un nouveau classement mensuel, puis j’ai rencontré une erreur en accédant à l’URL suivante :

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

L’erreur est la suivante :

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)

J’ai localisé le fichier problématique comme suit :

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

Le code spécifique :

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

La cause de l’erreur est :

Erreur d’assertion de gestion d’état réactif d’Ember.js (plus précisément, le système de suivi Glimmer). Le problème principal est que : dans le même cycle de calcul, vous lisez d’abord une valeur tracked (suivie), puis vous tentez de modifier cette valeur. Cette opération de “lecture puis mise à jour” provoque des incohérences logiques, des boucles de réévaluation infinies ou des problèmes de performance, et est donc directement interdite par Ember.

Problème clé :

  • Array.sort() modifie le tableau d’origine sur place, ce qui met à jour l’état leaderboards @tracked.

  • La propriété calculée (sortedLeaderboards) est censée dériver une nouvelle valeur, et non modifier l’état original ; elle devrait être une “fonction pure” (sans effets secondaires, ne modifie pas la source d’entrée).

Voici la solution de correction :

  @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)) || []
    );
  }

Capture d’écran après correction :

Il semble que ce type de problème ne soit pas un cas isolé. Je suppose qu’il s’agit d’un problème d’incompatibilité dû à la mise à niveau d’emberjs. Or, de nombreux endroits dans les plugins n’ont pas été modifiés pour refléter cette mise à jour, car ce travail n’est pas aussi simple qu’il y paraît.

Question : Y a-t-il un délai dans l’attribution des points ? Par exemple, les nouveaux utilisateurs effectuent des actions qui rapportent des points, comme publier un nouveau sujet ou donner un “j’aime”, mais leurs scores n’apparaissent pas. J’ai inclus le niveau de confiance 0 dans les paramètres, donc je suppose qu’il s’agit simplement d’un délai dans l’attribution des points ? Si oui, à quelle fréquence le calcul et la mise à jour ont-ils lieu ? Merci !

4 « J'aime »

Je souhaiterais revenir sur cette idée. Pour l’instant, j’ai verrouillé les classements à une seule catégorie, mais le fait de les déplacer vers un classement individuel serait préférable.

2 « J'aime »

C’est quelque chose que nous souhaitons vraiment faire, il s’agit simplement de trouver le temps de le faire ou de trouver un client prêt à financer l’effort.

5 « J'aime »

Bonjour,

J’ai créé un nouveau classement, mais cela a effacé les paramètres de mon classement original.

Existe-t-il un moyen de choisir quel classement mes utilisateurs voient sur le front-end ?

Tu peux personnaliser une section pour aller directement sur le lien du classement choisi

2 « J'aime »

Ce serait bien de voir cette fonctionnalité permettre également l’attribution de points via des événements personnalisés. Par exemple, je souhaitais utiliser le plugin Discourse Points Mall pour mes modérateurs, et peut-être même pour les membres de la communauté, afin d’attribuer des récompenses pour notre Discord et, à l’avenir, peut-être dans le jeu.

Cela pourrait fonctionner comme un système d’attribution manuelle ou via un code à échanger. Je comprends que la portée de ce plugin soit davantage axée sur les interactions au niveau de Discourse, mais il serait agréable de voir si elle pourrait être étendue au-delà. En effet, dans mon cas d’utilisation, Discourse n’est qu’une partie de notre écosystème, pas la seule destination.

Pour préciser, je sais qu’il existe des moyens d’accomplir les choses mentionnées ci-dessus via une API, mais je pense que ces méthodes sont davantage conçues pour des sources externes. Bien qu’elles puissent également attribuer des points, je crois qu’il serait préférable d’avoir quelque chose de natif :wink:

2 « J'aime »

Avez-vous vu Comment intégrer la gamification de Discourse avec un système externe (récupérer et attribuer des points) ?