Comment exclure les droits d’un badge personnalisé si un niveau supérieur a déjà été accordé ? L’objectif est d’accorder uniquement le niveau le plus élevé auquel un utilisateur est éligible…
Supposons que j’aie 3 badges :
Niveau 1 : 5 J’aime donnés, 5 reçus
Niveau 2 : 100 J’aime donnés, 100 reçus
Niveau 3 : 250 J’aime donnés, 250 reçus
Le code ci-dessous est pour le niveau 2. Les autres niveaux n’ont rien de différent à part le nombre ‘100’
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received >= 100
AND us.likes_given >= 100
AND (:backfill OR us.user_id IN (:user_ids))
Dans les paramètres /admin/badges/BADGE-ID, cochez simplement l’option Exécuter la requête de révocation quotidiennement. Le badge sera supprimé s’ils ne répondent plus aux critères SQL.
Vous voudrez peut-être aussi les mettre à jour Mise à jour quotidienne pour que l’attribution / la révocation se produisent à peu près au même moment (minuit, heure locale de votre instance, je pense).
Cela nécessiterait-il également une ligne supplémentaire dans le SQL du badge pour l’équilibrer ? Quelque chose comme :
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received >= 100
AND us.likes_given >= 100
AND us.likes_given < 250
AND (:backfill OR us.user_id IN (:user_ids))
(peut-être utiliser un BETWEEN ou similaire, bien que je ne l’aie pas encore testé )
Et ensuite, lorsque la requête s’exécutera, elle attribuera le badge pour 100 Likes la première fois, l’ignorera pour 101 à 249, puis le révoquera à 250 (où le badge suivant prendra le relais).
Mise à jour : J’ai un peu pratiqué avec BETWEEN, et quelque chose comme ceci semble capturer toutes les bonnes personnes dans le test d’échantillon :
SELECT us.user_id
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
ORDER BY us.likes_received DESC
Donc, quelque chose comme ceci devrait fonctionner s’il est converti en badge déclenché :
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
AND us.likes_given BETWEEN 100 AND 249
AND (:backfill OR us.user_id IN (:user_ids))
C’est presque parfait. Un événement rare peut se produire : l’utilisateur en donne trop dans « donné » tout en en recevant peu (ou vice versa), de sorte que le badge pourrait être perdu avant que le suivant ne soit accordé (routine de révocation).
J’ai cherché et découvert une propriété intéressante : something.badge_id = 123 où « something » est la variable définie par l’utilisateur et « 123 » l’ID d’un autre badge. Je vais essayer et compléter les SQL originaux des niveaux 1 et 2 avec des vérifications de disqualification par rapport aux badges de niveau supérieur.