Un badge d'argent pour _chaque_ 5 badges de bronze

Nous avons créé un badge de bronze, Users Helping Users, pour les personnes qui essaient d’aider d’autres utilisateurs. Il est attribué manuellement (afin de faire la différence entre les tentatives d’aide et les « moi aussi »).

Pour chaque groupe de 5 badges de bronze, nous voulons attribuer un badge d’argent, Invaluable.

Le SQL que j’ai trouvé identifie les deux bons utilisateurs, mais une seule fois chacun :

SELECT user_id, current_timestamp AS granted_at 
FROM user_badges
WHERE badge_id = 110 -- Users Helping Users
    AND (:backfill OR user_id IN (:user_ids))
GROUP BY user_id
HAVING COUNT(*) >= 5

Est-ce qu’il me manque une :magic_wand: formule magique dans mon SQL, ou le multiplicateur se fait-il en dehors du SQL ?

De plus, il n’est pas très clair pour moi comment les calculs sont effectués pour que mes deux utilisateurs n’obtiennent pas de nouveaux badges tous les jours (cela s’exécutera sur un déclencheur nocturne) même s’ils n’ont pas obtenu 5 nouveaux badges de bronze.

Existe-t-il un guide à ce sujet que mes recherches n’ont pas trouvé ?

Une recherche plus approfondie m’a mené à un guide : le guide

Le remplissage a posteriori est encore un peu flou, mais j’ai décidé (évidemment !) d’essayer cela sur notre instance de test. Je suppose que le remplissage s’exécute pendant la nuit, donc j’en saurai plus demain.

À moins que vous ne cochiez « Peut être accordé plusieurs fois », il ne devrait pas être attribué plus d’une fois, même s’ils se qualifient pour la deuxième fois (ou plus). :+1:


D’accord, j’ai relu votre message plus attentivement et je pense avoir une idée plus claire de ce que vous visez.

Sur la base de l’SQL actuel, ces utilisateurs ne recevront le badge d’argent qu’une seule fois, même si vous autorisez son attribution multiple :

  • J’ai créé les badges pertinents sur mon site de test (y compris l’autorisation de plusieurs attributions)
  • J’ai attribué 5 badges de bronze et lancé le travail d’arrière-plan pour attribuer le badge (le badge d’argent a été attribué avec succès :partying_face:)
  • J’ai ensuite relancé le travail BadgeGrant et ils n’ont pas reçu le badge d’argent une deuxième fois
  • J’ai ensuite augmenté leurs badges de bronze à 11 et relancé le travail d’attribution de badges
  • Aucun deuxième badge d’argent n’a été attribué

J’ai vérifié « plusieurs fois »

mais cela n’a été accordé qu’une seule fois, alors que cela aurait dû être deux fois

1 « J'aime »

Alors… que dois-je faire pour que mon utilisateur, qui a 12 badges de bronze, reçoive les 2 badges d’argent qu’il mérite ?

1 « J'aime »

C’est une bonne question à laquelle je ne connais pas immédiatement la réponse. :slight_smile:

Je pense provisoirement à quelque chose utilisant RANK, mais je rame peut-être… :thinking:


Prototype approximatif...
WITH badge_count AS (

    SELECT 
        user_id,
        granted_at,
        RANK() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS rank
    FROM user_badges
    WHERE badge_id = 110

)

SELECT user_id, granted_at
FROM badge_count
WHERE rank IN (5,10,15,20,25,30,35,40,45,50)

Okay, une deuxième tentative utilisant ROW_NUMBER à la place :

WITH badge_count AS (

    SELECT 
        user_id,
        granted_at,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS row
    FROM user_badges
    WHERE badge_id = 110

)

SELECT user_id, granted_at
FROM badge_count
WHERE row % 5 = 0

Cependant, lors de tests supplémentaires, cela fonctionne correctement dans l’aperçu mais n’est pas accordé plusieurs fois lorsque le travail réel d’octroi de badge s’exécute. Je ne suis pas vraiment sûr pourquoi. :thinking:

Je me suis embrouillé. Je vais prendre une tasse de thé et me ressaisir. :slight_smile:

1 « J'aime »

Eh bien… J’ai donné 4 autres bronzes à mon utilisateur hier pour voir si l’exécution nocturne ajouterait au moins le nouveau badge qu’il venait de « gagner ». (Je me suis dit que si je devais rattraper le reste à la main, je pourrais.) Mais même cela n’a pas fonctionné.

Je ne peux pas vous aider avec cette requête, mais je vous suggère de demander de l’aide au bot Discourse AI - sélectionnez l’icône du bot en haut
image → GPT-4 → SQL Helper.

Je l’ai trouvé très efficace pour créer des requêtes d’exploration de données à partir de simples descriptions de mes besoins et je suppose qu’il peut aider avec les requêtes de badges.

1 « J'aime »

Tout le monde n’a pas ça, Toni :shushing_face: Tu vas rendre les gens jaloux. :slight_smile: (bien que @ganncamp en ait un, donc c’est une option)

Mais… je suis à peu près sûr que ma requête est correcte. Elle sélectionne les bons dans l’aperçu, mais n’en accorde qu’un seul lorsqu’on utilise le déclencheur ‘Mettre à jour quotidiennement’.

J’en ai configuré une autre presque identique pour la tester, basée sur un badge pour ‘tous les 5 messages dans un sujet spécifique’ en utilisant le déclencheur ‘lorsqu’un utilisateur crée ou modifie un message’ - et celle-ci fonctionne parfaitement. Je me renseigne pour savoir quelle pourrait être la différence…

Voici le SQL pour ce badge de test à comparer si quelqu’un peut repérer quelque chose :

WITH post_count AS (

    SELECT 
        user_id,
        id,
        created_at,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at ASC) AS row
    FROM posts
    WHERE topic_id = 864

)

SELECT user_id, created_at granted_at, id post_id
FROM post_count
WHERE row % 5 = 0
  AND (:backfill OR id IN (:post_ids))

2 « J'aime »

J’y ai accès @tpetrov, mais mes tentatives pour l’utiliser ont été… moins qu’utiles. Ou peut-être que j’excelle à poser des questions difficiles ? :rire:

1 « J'aime »

Après un peu d’exploration et de consultation, il semble que l’attribution automatique de badges n’accordera plusieurs badges que s’ils sont basés sur des publications spécifiques. Donc, ces types de badges n’accorderont que le premier badge (l’aperçu est trompeur :frowning:).

Je pense que dans des cas similaires, les badges « escaladés » peuvent bien fonctionner (comme ceux résolus). Donc un Argent pour 30 et un Or pour 100, par exemple, si cela pouvait être une alternative viable ?

Donc… même si les badges de bronze sont attribués en fonction des publications… cela ne compte pas, n’est-ce pas ?

Je ne sais pas. Je ne pense pas comprendre la question. :rire:

Je suppose que la suggestion n’est pas de trouver 5 badges, mais 5 publications où un badge a été attribué ? Je peux faire ça. Je l’ai plus ou moins déjà fait dans mon rapport « trouver de nouvelles publications pour attribuer des badges ».

Hmm. :thinking: Je pense que je vois où vous voulez en venir. Laissez-moi essayer à nouveau…


@ganncamp - Je pense que nous pourrions avoir du succès… :slight_smile:

Basé sur le fait que le Badge Bronze A est attribué via la clé de publication ou en donnant une raison sur la page /admin/users/{user_id}/{username}/badges :

Alors je pense que c’est effectivement possible. :partying_face:

WITH badge_count AS (

    SELECT 
        user_id,
        granted_at,
        post_id,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at DESC) AS row
    FROM user_badges
    WHERE badge_id = 110
      AND post_id IS NOT NULL
)

SELECT user_id, granted_at, post_id
FROM badge_count
WHERE row % 5 = 0
  AND (:backfill OR post_id IN (:post_ids))

(L’ajout de AND post_id IS NOT NULL le protège si quelqu’un en reçoit un sans raison, sinon cela casse)

Je viens de l’essayer et d’accélérer en déclenchant le travail d’arrière-plan GrantBadge et mon utilisateur de test a enfin reçu le crédit total qu’il mérite. :slight_smile:

Je lui ai ensuite attribué 5 autres Badges A pour 5 autres publications différentes et je l’ai relancé : :tada:

3 « J'aime »

Merci @JammyDodger ! :tada: :tada: :tada:

Je l’ai configuré sur mon instance de test (non pas que je ne vous fasse pas confiance :joy:) et j’espère le mettre en production cette semaine ! :star_struck:

Et… est-ce le bon moment pour demander que le tutoriel soit mis à jour avec ce que vous avez appris dans cette quête ? :smiley:

Oh, bien sûr. Faire confiance, mais vérifier est certainement un choix judicieux. :slight_smile:

Je vais voir si je peux ajouter un petit quelque chose. :slight_smile: :+1:

2 « J'aime »

Eh bien… quand le travail s’est exécuté pendant la nuit,
mon utilisateur avec 6 bronzes a obtenu 1 argent :white_check_mark:
mon utilisateur avec 13 bronzes a obtenu… 1 argent :slightly_frowning_face:

Cette partie du tutoriel m’a fait penser qu’un travail de remplissage séparé et explicite n’était pas nécessaire

Puisqu’un remplissage complet s’exécute quotidiennement de toute façon, vous devez en tenir compte et inclure la gestion du paramètre :backfill.

Pour les utilisateurs qui ont déjà gagné plus d’1 argent, comment puis-je les faire attribuer ? Dois-je le faire manuellement ?

Le remplissage est le travail quotidien. Le déclencheur « Mettre à jour quotidiennement » est essentiellement cela, tandis que les autres déclencheurs sont beaucoup plus « au moment présent » (par exemple, si un badge utilisait « lorsqu’un utilisateur crée ou modifie un article », il n’aurait pas besoin d’attendre le lendemain matin pour être attribué).

Pouvez-vous joindre une capture d’écran de votre badge pour que je puisse voir ce qui pourrait être différent ?

Voici :\n\n

\n\nAu fait, j’ai vérifié certaines de ces choses parce que… je ne sais pas ce que je fais :joy:

1 « J'aime »

Et votre utilisateur avec 13 « Badge A » a les raisons remplies lorsqu’il consulte sa page /admin/users/{user_id}/{username}/badges ?

Vous avez les éléments importants en commun. :slight_smile: Les autres sont toujours légitimes, mais facultatifs.

Est-ce que vous exécutez ceci sur votre site de staging ou sur un site de test auto-hébergé ?

Woah ! Mystère résolu !

J’avais supposé que le travail s’exécutait aux petites heures du matin (de ma part).

En fait, j’avais initialement accordé des badges à cet utilisateur sans raison, alors hier je les ai tous révoqués, j’ai déterré des publications de sa part et je les ai réattribués. Le travail s’est exécuté au milieu de mon attribution.

Ceci est sur mon site de staging, d’ailleurs.

Je suppose que le 2ème badge sera accordé dans quelques heures, mais j’aimerais voir plusieurs badges accordés en même temps. Est-ce que cela se produira si je révoque l’argent ? Lui accordera-t-on 2 nouveaux argents dans… 2h ?

1 « J'aime »