- ✅ Bot Discord configuré et en ligne
- ✅ API backend en cours d'exécution
- ✅ Panel Vue.js accessible
- ✅ Compte Master créé
Créez un fichier ping-test.js localement:
module.exports = {
name: 'ping-test',
version: '1.0.0',
description: 'Module de test pour ping',
commands: [
{
data: {
name: 'pingtest',
description: 'Commande de test ping'
},
async execute(interaction) {
const ping = interaction.client.ws.ping;
await interaction.reply(`🏓 Pong! Latence: ${ping}ms`);
}
}
],
async init(client) {
console.log('[PingTest] Module initialisé!');
}
};- Connectez-vous au panel web
- Allez dans Guild Panel → Tab Master
- Cliquez sur "Nouveau Module"
- Remplissez:
- Nom:
ping-test - Description:
Module de test - Icône: 🏓
- Version:
1.0.0
- Nom:
- Uploadez
ping-test.js - Cliquez "Créer le module"
Dans le panel:
- ✅ Module apparaît dans la liste
- ✅ Badge affiche "Inactif" (pas encore déployé)
- ✅ Badge "📁 1 fichiers"
Dans les logs backend:
[createModule] Module created: <moduleId>
[createModule] Files saved on disk: 1
Sur le disque:
src/bot/modules/custom/<moduleId>/
└── ping-test.js
- Ouvrez le dropdown du module (⋮)
- Cliquez sur "Déployer"
- Attendez la confirmation
Dans les logs backend:
[ModuleValidator] Module <moduleId> validé avec succès
[ModuleLoader] Commande /pingtest enregistrée pour module ping-test
[ModuleLoader] Module ping-test v1.0.0 chargé (ID: <moduleId>)
[PingTest] Module initialisé!
Dans le panel:
- ✅ Badge affiche maintenant "Actif"
- ✅
deployedAtest défini
Via API REST:
# Vérifier les modules chargés
curl -H "Authorization: Bearer <token>" http://localhost:3000/modules/loadedDevrait retourner:
{
"loadedModules": [
{
"id": "<moduleId>",
"name": "ping-test",
"version": "1.0.0",
"description": "Module de test pour ping",
"commandsCount": 1,
"eventsCount": 0
}
]
}Dans le terminal:
cd src
node scripts/deploy-commands.jsLogs attendus:
✅ Commande standard chargée: ban
✅ Commande standard chargée: kick
...
📦 Chargement des commandes de 1 module(s) déployé(s)...
✅ Commande de module: /pingtest (ping-test)
🚀 Déploiement de 8 commande(s) au total...
✅ 8 commande(s) déployée(s) avec succès!
Dans Discord (peut prendre 1h pour commandes globales):
- Tapez
/et vérifiez quepingtestapparaît dans l'autocomplétion
- Dans le panel, allez dans Guild Panel → Tab Modules
- Trouvez
ping-testdans la liste - Activez le toggle
Logs backend:
PUT /modules/<moduleId>/guild/<guildId>/toggle
État du module mis à jour
Dans MongoDB:
db.guildconfigs.findOne({ guildId: "<guildId>" })
// Devrait avoir:
{
...
moduleStates: {
"<moduleId>": true
}
}- Allez dans votre serveur
- Tapez
/pingtest - Exécutez la commande
Le bot devrait répondre:
🏓 Pong! Latence: 42ms
Backend logs:
[interactionCreate] Commande custom détectée
[interactionCreate] Module activé pour le serveur
Modifiez ping-test.js localement:
module.exports = {
name: 'ping-test',
version: '1.1.0', // ⬅️ Version incrémentée
description: 'Module de test pour ping (MODIFIÉ)',
commands: [
{
data: {
name: 'pingtest',
description: 'Commande de test ping'
},
async execute(interaction) {
const ping = interaction.client.ws.ping;
// ⬇️ Message modifié
await interaction.reply(`🚀 PONG! Latence du bot: ${ping}ms`);
}
}
],
async init(client) {
console.log('[PingTest v1.1] Module modifié et rechargé!');
}
};- Dropdown → "Modifier"
- Uploadez le nouveau
ping-test.js - Sauvegardez
- Dropdown → "Recharger" (ou redéployez)
- Attendez la confirmation
Logs:
[ModuleLoader] Rechargement du module <moduleId>...
[ModuleLoader] Module ping-test déchargé
[ModuleLoader] Module ping-test v1.1.0 chargé (ID: <moduleId>)
[PingTest v1.1] Module modifié et rechargé!
Dans Discord:
/pingtestdevrait maintenant répondre avec le nouveau message:
🚀 PONG! Latence du bot: 42ms
Fichier auto-role-test.js:
module.exports = {
name: 'auto-role-test',
version: '1.0.0',
description: 'Test attribution automatique de rôle',
events: {
async guildMemberAdd(member, client) {
console.log(`[AutoRoleTest] Nouveau membre: ${member.user.tag}`);
// Remplacez par un vrai role ID de votre serveur
const roleId = 'YOUR_ROLE_ID';
const role = member.guild.roles.cache.get(roleId);
if (role) {
await member.roles.add(role);
console.log(`[AutoRoleTest] Rôle ${role.name} attribué`);
}
}
},
async init(client) {
console.log('[AutoRoleTest] Event handler enregistré!');
}
};- Créez le module
- Déployez
- Activez pour votre serveur
[ModuleLoader] Event handler guildMemberAdd enregistré pour module auto-role-test
[AutoRoleTest] Event handler enregistré!
Option 1: Inviter un bot test
- Invitez un autre bot sur votre serveur
Option 2: Rejoindre avec un alt
- Utilisez un compte alternatif
Résultat attendu:
[AutoRoleTest] Nouveau membre: TestUser#1234
[AutoRoleTest] Rôle Member attribué
Fichier dangerous-test.js:
const fs = require('fs'); // ⬅️ INTERDIT
module.exports = {
name: 'dangerous',
version: '1.0.0',
commands: [
{
data: {
name: 'danger',
description: 'Test dangereux'
},
async execute(interaction) {
// Tenter de lire un fichier
const data = fs.readFileSync('/etc/passwd');
await interaction.reply('Hacked!');
}
}
]
};- Uploadez le fichier
- Créez le module
- Tentez de déployer
Le déploiement doit ÉCHOUER:
Logs:
[ModuleValidator] Erreur validation module <moduleId>:
Error: Code dangereux détecté : require\s*\(\s*['"]fs['"]\s*\)
Dans le panel:
- Message d'erreur: "Validation du module échouée"
- Module non déployé
- Tab Modules
- Désactivez le toggle pour
ping-test
Dans Discord:
/pingtestdevrait retourner:
❌ Ce module n'est pas activé sur ce serveur.
- Réactivez le toggle
/pingtestfonctionne à nouveau
- Dropdown → "Supprimer"
- Confirmez
Logs:
[deleteModule] Files deleted from disk
Module supprimé
Sur le disque:
- Le dossier
src/bot/modules/custom/<moduleId>/est supprimé
Dans MongoDB:
- Document
CustomModulesupprimé
Dans le panel:
- Module n'apparaît plus dans la liste
- Module apparaît dans la liste
- Fichiers sauvegardés sur disque
- Nombre de fichiers correct
- Validation de sécurité passe
- Module chargé dans le bot
- Logs
[ModuleLoader]affichés - Commandes enregistrées
- Events enregistrés (si applicable)
-
init()appelé - Badge "Actif" affiché
- Script
deploy-commandsréussit - Commandes apparaissent dans Discord (1h max)
- Toggle fonctionne
- État sauvegardé en DB
- Vérification dans
interactionCreate
- Commande exécute correctement
- Events déclenchés
- Logs du module affichés
- Modifications uploadées
- Reload sans redémarrage
- Nouveaux changements appliqués
- Code dangereux rejeté
- Patterns interdits détectés
- Message d'erreur clair
- Message d'erreur si désactivé
- Réactivation fonctionne
- Fichiers supprimés du disque
- Document MongoDB supprimé
- Module disparaît de l'interface
- Exécutez
npm run deploy-commands - Attendez jusqu'à 1h pour propagation
- Vérifiez le toggle dans l'onglet Modules
- Vérifiez
GuildConfig.moduleStatesen DB
- Vérifiez les patterns interdits (
fs,eval, etc.) - Vérifiez la syntaxe JavaScript
- Assurez-vous que le bot est en ligne
- Vérifiez que
client.moduleLoaderest initialisé - Vérifiez la connexion API ↔ Bot
- Vérifiez les logs
[ModuleLoader]pour event registration - Vérifiez que le module est activé pour le serveur
- Vérifiez les intents du bot (ex:
GuildMemberspourguildMemberAdd)
# Liste tous les modules
curl -H "Authorization: Bearer <token>" http://localhost:3000/modules
# Modules chargés en mémoire
curl -H "Authorization: Bearer <token>" http://localhost:3000/modules/loaded
# États pour un serveur
curl -H "Authorization: Bearer <token>" http://localhost:3000/modules/guild/<guildId>/states[ModuleLoader]- Chargement/déchargement[ModuleValidator]- Validation sécurité[NomModule]- Logs spécifiques au module[interactionCreate]- Exécution commandes
Si tous les tests passent:
- ✅ Système de modules fonctionnel
- ✅ Validation de sécurité active
- ✅ Hot-reload opérationnel
- ✅ Activation par serveur fonctionnelle
- ✅ Commandes et events supportés
Le système est prêt pour la production ! 🎉