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
| Source | XP gagne | Conditions |
|---|---|---|
| Message texte | +5 XP | Cooldown de 60s entre chaque gain |
| Vocal | +2 XP/minute | Calcule 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 :
- Quand un membre se met en mute + sourd en vocal, un timestamp est enregistre en memoire.
- Un cron tourne toutes les 5 minutes et verifie tous les membres en mute+sourd.
- 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.
- 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) XPParametres (definis dans src/config/constants.ts) :
LEVEL_BASE= 100LEVEL_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 :
| Niveau | Role | Couleur |
|---|---|---|
| 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).
