Skip to content

Systeme d'XP et de niveaux

Le systeme de gamification recompense l'activite des membres avec de l'experience (XP). L'XP accumule permet de monter de niveau et de debloquer des roles.

Sources d'XP

SourceXP gagneConditions
Message texte+5 XPCooldown de 60s entre chaque gain
Vocal+2 XP/minuteCalcule a la deconnexion du salon vocal

Anti-spam (cooldown messages)

Le cooldown est gere via une Map<string, number> en memoire qui associe chaque discordId au timestamp de son dernier message ayant donne de l'XP.

  • Si un membre envoie un message moins de 60 secondes apres le precedent, aucun XP n'est accorde.
  • Le cooldown se reinitialise au redemarrage du bot (puisqu'il est en memoire).

Detecteur AFK (vocal)

Le detecteur AFK empeche les membres de gagner de l'XP vocal en etant inactifs.

Fonctionnement :

  1. Quand un membre se met en mute + sourd en vocal, un timestamp est enregistre en memoire.
  2. Un cron tourne toutes les 5 minutes et verifie tous les membres en mute+sourd.
  3. Si un membre est mute+sourd depuis plus de 15 minutes (AFK_THRESHOLD_MS = 15 * 60 * 1000) :
    • Sa session vocale est cloturee (l'XP vocal s'arrete).
    • Un DM d'avertissement est envoye.
    • L'utilisateur est marque comme "deja traite" pour eviter les notifications repetees.
  4. Des que le membre desactive le mute ou le sourd, le tracking est reinitialise et une nouvelle session vocale demarre.

Les donnees AFK sont en memoire (Map et Set) et se reinitialiser au redemarrage.

Formule de calcul de niveau

Le calcul utilise une progression exponentielle :

niveau 0 -> 1 : 100 XP
niveau 1 -> 2 : 150 XP  (100 * 1.5^1)
niveau 2 -> 3 : 225 XP  (100 * 1.5^2)
niveau N -> N+1 : floor(100 * 1.5^N) XP

Parametres (definis dans src/config/constants.ts) :

  • LEVEL_BASE = 100
  • LEVEL_MULTIPLIER = 1.5

L'XP total cumule est utilise pour determiner le niveau. La fonction calculateLevel(totalXp) itere les paliers jusqu'a trouver le niveau correspondant.

Roles de niveau

13 roles de niveau sont disponibles, crees via /setup level-roles :

NiveauRoleCouleur
1🌱 Level 1#95A5A6 gris
5⭐ Level 5#3498DB bleu
10💎 Level 10#2ECC71 vert
15🔥 Level 15#E67E22 orange
20⚡ Level 20#F1C40F jaune
50🏆 Level 50#E74C3C rouge
100👑 Level 100#9B59B6 violet
200🌟 Level 200#1ABC9C turquoise
250💀 Level 250#2C3E50 sombre
300🐉 Level 300#C0392B rouge fonce
500🌌 Level 500#8E44AD violet fonce
750✨ Level 750#F39C12 or
1000:sports_medal: Level 1000#FFD700 or brillant

Attribution : a chaque montee de niveau, le bot verifie si le membre atteint un palier de role. Le role le plus eleve applicable est assigne. Le mapping { "niveau": "roleId" } est stocke dans GuildConfig.levelRoles (champ JSON).

Reset hebdomadaire

Un cron s'execute chaque lundi a minuit (0 0 * * 1, timezone Europe/Paris) et reinitialise le champ weeklyXp de tous les membres a 0. Le champ weeklyResetAt est mis a jour avec la date du reset.

Ce reset permet d'alimenter le classement hebdomadaire (/leaderboard weekly).