- Installation
- Configuration
- Démarrage
- Commandes disponibles
- Système d'escalade
- Intégration Bot ↔ Site
- Système d'expiration automatique
- Node.js v18 ou supérieur
- MongoDB v6 ou supérieur
- Un bot Discord créé sur le Discord Developer Portal
npm installCréez un fichier .env à la racine du projet :
# Discord Bot
DISCORD_BOT_TOKEN=votre_token_bot
DISCORD_CLIENT_ID=votre_client_id
DISCORD_CLIENT_SECRET=votre_client_secret
# MongoDB
MONGODB_URI=mongodb://localhost:27017/discord-moderation
# API
PORT=3000
JWT_SECRET=votre_secret_jwt_tres_long_et_securise
BOT_API_KEY=votre_cle_api_bot_tres_securisee
# OAuth2
DISCORD_REDIRECT_URI=http://localhost:3000/auth/discord/callback
CLIENT_URL=http://localhost:8080npm run deploy-commandsCette commande enregistre toutes les commandes slash auprès de Discord. Les commandes globales peuvent prendre jusqu'à 1h pour se propager.
npm startnpm run bot:devnpm run api:devAvertit un membre pour une infraction.
Options :
utilisateur(requis) - Le membre à avertirraison(requis) - Raison de l'avertissementtype(requis) - Type d'infraction (SPAM, INSULT, HARASSMENT, NSFW, RAID, ADVERTISING, OTHER)
Permissions : Modérer les membres
Exemple :
/warn @User raison:Spam type:SPAM
Met un membre en timeout (mute).
Options :
utilisateur(requis) - Le membre à muteraison(requis) - Raison du mutetype(requis) - Type d'infractionduree(optionnel) - Durée du mute (1h, 12h, 1day, 3days, 1week)
Permissions : Modérer les membres
Exemple :
/mute @User raison:Flood duree:12h type:SPAM
Note : Si aucune durée n'est spécifiée, le système d'escalade détermine automatiquement la durée selon l'historique.
Retire le timeout d'un membre.
Options :
utilisateur(requis) - Le membre à unmuteraison(optionnel) - Raison de l'unmute
Permissions : Modérer les membres
Exemple :
/unmute @User raison:Erreur de modération
Expulse un membre du serveur.
Options :
utilisateur(requis) - Le membre à kickraison(requis) - Raison du kicktype(requis) - Type d'infraction
Permissions : Expulser des membres
Exemple :
/kick @User raison:Comportement toxique type:HARASSMENT
Bannit un membre du serveur.
Options :
utilisateur(requis) - Le membre à bannirraison(requis) - Raison du bantype(requis) - Type d'infractionsupprimer-messages(optionnel) - Nombre de jours de messages à supprimer (0-7)
Permissions : Bannir des membres
Exemple :
/ban @User raison:Raid type:RAID supprimer-messages:7
Retire le ban d'un utilisateur.
Options :
userid(requis) - L'ID Discord de l'utilisateur à unbanraison(optionnel) - Raison de l'unban
Permissions : Bannir des membres
Exemple :
/unban userid:123456789012345678 raison:Appel accepté
Note : Nécessite l'ID Discord car l'utilisateur n'est plus dans le serveur.
Affiche l'historique des sanctions d'un utilisateur.
Options :
utilisateur(requis) - L'utilisateur dont voir l'historique
Permissions : Modérer les membres
Exemple :
/history @User
Affiche :
- Total de sanctions
- Compteurs par type d'infraction
- Les 10 dernières sanctions (avec détails complets)
- Lien vers le panel web pour voir l'historique complet
Le bot utilise un système d'escalade automatique basé sur l'historique des infractions.
- Compteur par type d'infraction : Chaque type d'infraction (SPAM, INSULT, etc.) a son propre compteur
- Niveaux d'escalade : Plus un utilisateur commet d'infractions du même type, plus les sanctions sont sévères
- Escalade progressive : warn → mute court → mute long → kick → ban temporaire → ban permanent
| Niveau | Action | Durée | Après combien d'infractions |
|---|---|---|---|
| 1 | WARN | - | 1ère infraction SPAM |
| 2 | MUTE | 1 heure | 2ème infraction SPAM |
| 3 | MUTE | 12 heures | 3ème infraction SPAM |
| 4 | MUTE | 3 jours | 4ème infraction SPAM |
| 5 | KICK | - | 5ème infraction SPAM |
| 6 | BAN | 7 jours | 6ème infraction SPAM |
| 7+ | BAN | Permanent | 7+ infractions SPAM |
L'escalade est configurable par serveur depuis le Panel Web :
- Connectez-vous au panel web
- Sélectionnez votre serveur
- Allez dans l'onglet "Escalade"
- Configurez les niveaux pour chaque type d'infraction
Le bot et le site web sont complètement synchronisés grâce à l'API.
Toutes les sanctions appliquées via les commandes Discord sont automatiquement :
- ✅ Enregistrées dans la base de données MongoDB
- ✅ Visibles dans le panel web
- ✅ Comptabilisées dans les statistiques
- ✅ Prises en compte pour le trust factor
Flux :
/warn @User → Bot appelle API → MongoDB mis à jour → Visible sur le site
Les sanctions appliquées depuis le panel web sont automatiquement :
- ✅ Appliquées sur Discord (timeout, ban, etc.)
- ✅ Envoyées en notification DM à l'utilisateur
- ✅ Révoquées automatiquement à expiration
Flux :
Modérateur clique "Mute" sur le site → API enregistre → Bot applique timeout Discord
Le bot utilise une API Key pour communiquer avec l'API :
- Header :
X-Bot-Api-Key - Valeur : définie dans
.env(BOT_API_KEY) - Routes protégées : toutes les routes
/moderation/*
| Endpoint | Méthode | Utilisation |
|---|---|---|
/guilds/:id/moderate |
POST | Appliquer une sanction |
/guilds/:id/users/:userId/sanctions |
GET | Récupérer l'historique |
/guilds/:id/config |
GET | Récupérer la config d'escalade |
/guilds/:id/templates |
GET | Récupérer les templates de sanction |
Le bot inclut un scheduler qui vérifie toutes les 30 secondes les sanctions expirées.
- Les mutes avec durée définie expirent automatiquement
- Le bot retire le timeout Discord
- La sanction est marquée comme
active: falseen base
- Les bans temporaires expirent automatiquement
- Le bot unban l'utilisateur sur Discord
- La sanction est marquée comme
active: falseen base
- Quand un modérateur révoque une sanction sur le site :
- L'API marque la sanction comme révoquée
- Le scheduler applique immédiatement l'action Discord (unmute/unban)
- L'utilisateur reçoit une notification
// Démarre automatiquement au lancement du bot
client.once('ready', () => {
const sanctionScheduler = new SanctionSchedulerService(client);
sanctionScheduler.start(); // Vérifie toutes les 30s
});Vérifications :
- Récupère toutes les sanctions avec
expiresAt <= nowetactive: true - Pour chaque sanction expirée :
- Si
action === 'mute'→ Retire le timeout Discord - Si
action === 'ban'→ Unban l'utilisateur
- Si
- Marque la sanction comme
active: false
Si le serveur Discord est inaccessible ou si l'utilisateur est déjà parti :
- ✅ La sanction est quand même marquée comme expirée en base
⚠️ Un warning est loggé dans la console- ➡️ Le scheduler continue avec les autres sanctions
- MASTER (super-admin global) - Accès total
- GUILD_ADMIN - Admin d'un serveur spécifique
- GUILD_MODERATOR - Modérateur d'un serveur spécifique
Les commandes nécessitent les permissions Discord suivantes :
/warn,/mute,/unmute,/history→ Modérer les membres/kick→ Expulser des membres/ban,/unban→ Bannir des membres
Le bot vérifie automatiquement :
- ✅ Permissions Discord de l'utilisateur
- ✅ Rôle dans le système (via API
canModerate()) - ✅ Hiérarchie des rôles (impossible de modérer un rôle supérieur)
Le bot affiche en temps réel :
- ✅ Commandes chargées au démarrage
- ✅ Événements chargés
- ✅ Connexion à MongoDB
- ⏰ Sanctions expirées détectées
- ❌ Erreurs et warnings
Le panel web affiche :
- Toutes les sanctions appliquées
- Date, heure, modérateur
- Utilisateur ciblé
- Type d'action et raison
- Statut (actif/révoqué)
-
Vérifier que les commandes sont déployées :
npm run deploy-commands
-
Vérifier les permissions du bot sur Discord :
- Scope OAuth2 :
bot+applications.commands - Permissions : Administrator (ou permissions spécifiques)
- Scope OAuth2 :
-
Vérifier les logs console pour erreurs
-
Vérifier que MongoDB est connecté :
# Dans les logs, chercher : ✅ MongoDB connecté -
Vérifier que
BOT_API_KEYest identique dans :.env(racine)- Variable d'environnement du bot
-
Tester l'API manuellement :
curl -H "X-Bot-Api-Key: votre_cle" http://localhost:3000/guilds/GUILD_ID/sanctions
-
Vérifier que le scheduler est démarré :
# Dans les logs, chercher : 📅 Démarrage du scheduler de sanctions... -
Vérifier que les sanctions ont une
expiresAtdéfinie :// Dans MongoDB db.sanctions.find({ expiresAt: { $exists: true, $ne: null } })
-
Vérifier les logs du scheduler :
# Toutes les 30s, devrait afficher : ⏰ X sanctions expirées trouvées
-
Ne jamais commit le .env
- Ajouté dans
.gitignore - Utiliser
.env.examplepour le template
- Ajouté dans
-
Générer des secrets forts
// JWT_SECRET (64+ caractères) require('crypto').randomBytes(64).toString('hex') // BOT_API_KEY (32+ caractères) require('crypto').randomBytes(32).toString('hex')
-
Limiter les permissions du bot
- Ne donner que les permissions nécessaires
- Éviter
Administratoren production
-
Rate limiting
- L'API a déjà un rate limiter configuré
- 100 requêtes / 15 minutes par IP
En cas de problème :
- Vérifier les logs du bot et de l'API
- Consulter les fichiers
DEBUG_DISCORD.mdetAPI_DOCUMENTATION.md - Vérifier que toutes les dépendances sont installées
- S'assurer que MongoDB est en cours d'exécution
Dernière mise à jour : Janvier 2025