Est-il possible de réinitialiser manuellement l’URL du classement ?
Par exemple, passer de leaderboards/2 à leaderboards/1.
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 ? ![]()
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"
}'
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
. 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é.
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. ![]()
Merci beaucoup. Cela a du sens.
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 !