Bot Discord pour créer et gérer des zones communautaires privées, avec messagerie anonyme, panneau de configuration interactif et suivi d'activité.
- Création de zones privées avec permissions configurables
- Création automatique des canaux (réception, général, anonyme, vocal)
- Contrôle d'accès par rôles (Owner/Membre)
- Alertes d'activité faible
- Groupes temporaires avec expiration automatique
- Canaux personnalisés configurables
- Identités anonymes persistantes par zone
- Relais de messages via webhooks
- Journal d'audit complet pour la modération
- Sanitisation des mentions (@everyone, @here)
- Wizard interactif envoyé aux nouveaux membres : navigation des zones, code d'invitation, demande de zone
- Zones découvrables avec pagination et barre d'activité
- Codes d'invitation à usage unique, valables 24 h (6 caractères A–Z0–9)
- Trois modes : open (accès libre), ask (sur demande), closed (fermé)
- Gestion des demandes d'adhésion avec décideur configurable (owner ou membres)
- Salle
cv-entretiencréée automatiquement en modeask / owner - Profil public de la zone (titre, description, couleur, tags)
- Score d'activité normalisé (60 % messages, 40 % minutes vocales)
- Alertes quotidiennes pour les zones inactives
- Suivi par jour en base de données
- Planificateur de tâches avec protection contre l'exécution concurrente
- Rate limiting en mémoire
- Arrêt gracieux
- Logs structurés avec Pino
┌─────────────────────────────────────────────────────────────┐
│ Discord Gateway │
└─────────────┬───────────────────────────────────────────────┘
│
┌─────────────▼───────────────────────────────────────────────┐
│ Gestionnaires d'événements │
│ • messageCreate • interactionCreate • guildMemberAdd │
│ • guildMemberRemove │
└─────────────┬───────────────────────────────────────────────┘
│
┌─────────────▼───────────────────────────────────────────────┐
│ Couche service │
│ • ZoneService • AnonService • HubService │
│ • ActivityService • TempGroupService • EventService │
│ • PolicyService • PanelService • WelcomeService │
│ • StaffPanelService • ThrottleService │
└─────────────┬───────────────────────────────────────────────┘
│
┌─────────────▼───────────────────────────────────────────────┐
│ Base de données (MySQL) │
│ • Zones • Members • Channels • Activity • Logs │
└─────────────────────────────────────────────────────────────┘
- Node.js >= 20.0.0
- MySQL >= 8.0
- Token de bot Discord avec les intents suivants :
GUILDSGUILD_MEMBERSGUILD_MESSAGESMESSAGE_CONTENTGUILD_VOICE_STATESGUILD_MESSAGE_REACTIONS
git clone https://github.com/Petite-Brioche0/SelfWorld.git
cd SelfWorld/botnpm installcp .env.example .env# Discord
DISCORD_TOKEN=votre_token_discord_ici
CLIENT_ID=votre_client_id_discord_ici
GUILD_ID=votre_serveur_id_discord_ici
# Propriétaire du bot
OWNER_ID=votre_id_discord_ici
# Base de données
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=nom_utilisateur
DB_PASSWORD=mot_de_passe_database
DB_NAME=selfworld
# Environnement
NODE_ENV=developmentmysql -u root -pCREATE DATABASE selfworld;
CREATE USER 'nom_utilisateur'@'localhost' IDENTIFIED BY 'mot_de_passe_database';
GRANT ALL PRIVILEGES ON selfworld.* TO 'nom_utilisateur'@'localhost';
FLUSH PRIVILEGES;
EXIT;Remplacez
nom_utilisateuretmot_de_passe_databasepar les valeurs choisies dans votre.env.
mysql -u nom_utilisateur -p selfworld < bot/schema.sqlnpm run deploy:cmdnpm run devbot/
├── src/
│ ├── commands/
│ │ └── admin/ # Commandes réservées au propriétaire
│ │ ├── zone.create.js
│ │ ├── zone.delete.js
│ │ ├── zones.list.js
│ │ └── settings.anonlog.set.js
│ ├── events/ # Gestionnaires d'événements Discord
│ │ ├── ready.js
│ │ ├── messageCreate.js
│ │ ├── interactionCreate.js
│ │ ├── guildMemberAdd.js
│ │ └── guildMemberRemove.js
│ ├── i18n/
│ │ └── fr.js # Locale française (clé/valeur plat)
│ ├── services/
│ │ ├── ZoneService.js
│ │ ├── AnonService.js
│ │ ├── HubService.js # Coordinateur (mixin)
│ │ ├── hub/
│ │ │ ├── requests.js # Gestionnaires de modaux + cycle de vie des demandes
│ │ │ └── builders.js # Constructeurs d'embeds, formatters
│ │ ├── ActivityService.js
│ │ ├── TempGroupService.js
│ │ ├── EventService.js
│ │ ├── PolicyService.js # Coordinateur (mixin)
│ │ ├── policy/
│ │ │ ├── creation.js # Demandes de création de zone
│ │ │ ├── config.js # Politique, profil public, salle entretien
│ │ │ ├── joinRequests.js # Cycle de vie des demandes d'adhésion
│ │ │ └── inviteCodes.js # Génération et utilisation des codes
│ │ ├── PanelService.js # Coordinateur (mixin)
│ │ ├── panel/
│ │ │ ├── render.js # Rendus des panneaux (membres, rôles, canaux, politique)
│ │ │ ├── members.js # Interactions membres
│ │ │ ├── roles.js # Interactions rôles
│ │ │ └── channels.js # Interactions canaux
│ │ ├── StaffPanelService.js
│ │ ├── WelcomeService.js
│ │ └── ThrottleService.js
│ └── utils/
│ ├── TaskScheduler.js
│ ├── db.js
│ ├── discord.js # safeReply, safeDefer, fetchChannel…
│ ├── embeds.js # errorEmbed, successEmbed, infoEmbed + constantes couleur
│ ├── i18n.js # t(key, vars) — interpolation {variable}
│ ├── ids.js # shortId
│ ├── anonNames.js
│ ├── commandLoader.js
│ ├── permissions.js
│ ├── serviceHelpers.js # normalizeColor, parseParticipants…
│ └── validation.js
├── tests/
│ ├── helpers/
│ │ ├── mockDb.js
│ │ ├── mockClient.js
│ │ └── mockInteraction.js
│ ├── services/
│ │ └── ActivityService.test.js
│ └── utils/
│ └── serviceHelpers.test.js
├── schema.sql
├── vitest.config.js
├── package.json
└── .env.example
Note : Les interactions utilisateur (rejoindre une zone, codes d'invitation, événements, etc.) passent par des boutons, modaux et menus déroulants routés via
interactionCreate.js, sans commandes slash dédiées.Note : Les grands services (HubService, PolicyService, PanelService) sont décomposés en sous-modules via un pattern de mixin prototypal. Le coordinateur gère le routage et l'infrastructure partagée ; les sous-modules contiennent la logique métier.
| Commande | Description |
|---|---|
/zone-create |
Créer une zone manuellement |
/zone-delete <id> |
Supprimer une zone et toutes ses ressources |
/zones-list |
Lister toutes les zones du serveur |
/settings-anonlog-set |
Configurer le canal de logs anonymes |
Gère le cycle de vie des zones : création, suppression, gestion des membres et permissions. Assure le nettoyage des ressources orphelines.
Messagerie anonyme avec identités persistantes par zone. Relais via webhooks, journal d'audit complet.
Gère les canaux hub personnalisés par membre. Cycle de vie des demandes de hub (annonces, événements) avec workflow brouillon/révision/approbation.
Wizard d'onboarding interactif envoyé aux nouveaux membres. Permet de parcourir les zones avec pagination, rejoindre via code d'invitation (6 caractères, 24 h, usage unique), envoyer une demande d'adhésion à une zone, ou demander la création d'une nouvelle zone.
Gère la politique d'accès des zones (open/ask/closed), les demandes d'adhésion, les codes d'invitation, le profil public (titre, description, couleur, tags) et la liste des zones découvrables. Crée/supprime automatiquement le salon cv-entretien selon le mode de décision.
Panneau d'administration interactif au sein de chaque zone : configuration de la politique et du profil public, gestion des membres, des rôles personnalisés et des canaux.
Panneaux de planification d'annonces et d'événements avec workflow prévisualisation/approbation.
Suivi de l'activité des zones. Score normalisé (60 % messages, 40 % minutes vocales). Alertes quotidiennes pour les zones inactives.
Groupes temporaires dans les zones, avec expiration automatique et structure de canaux isolée.
Gestion du cycle de vie des événements : planification, suivi des participants, groupes temporaires associés.
Rate limiting en mémoire pour prévenir le spam sur tous les types d'interactions.
Le projet utilise Vitest.
# Exécuter tous les tests
npm test
# Mode watch
npm run test:watchLes tests couvrent la logique métier critique (calcul de score d'activité, fonctions utilitaires) via des mocks légers — aucune connexion réelle à Discord ou MySQL requise.
Le bot inclut un planificateur qui gère les opérations périodiques :
- Sweep des groupes expirés : nettoyage horaire
- Alertes d'activité faible : vérification quotidienne
- Traitement des tâches planifiées : annonces et événements, toutes les minutes
Toutes les tâches bénéficient de :
- Protection contre les exécutions simultanées
- Timeout configurable
- Comptage des erreurs et logs
- Arrêt gracieux
- Sanitisation des mentions : protection contre @everyone / @here dans les canaux anonymes
- Rate limiting : prévention du spam
- Vérification des permissions : contrôles stricts sur toutes les commandes
- Sécurité webhook : identités anonymes uniques par zone
- Requêtes paramétrées : prévention des injections SQL avec liste blanche des colonnes
- Journal d'audit : logs complets pour la modération
- Vérification de connexion : la base de données est testée au démarrage
MySQL normalisé avec clés étrangères et suppressions en cascade :
- zones — configuration principale et IDs Discord
- zone_members — appartenance aux zones
- zone_member_roles — rôles personnalisés par membre
- zone_roles — définitions des rôles de zone
- zone_invite_codes — codes d'invitation
- zone_join_requests — demandes d'adhésion
- zone_creation_requests — demandes de création de zone
- temp_groups — groupes temporaires
- temp_group_members — membres des groupes temporaires
- temp_group_channels — canaux des groupes temporaires
- events — définitions et planification
- event_participants — participants aux événements
- anon_channels — configuration des canaux anonymes
- anon_logs — logs d'audit des messages anonymes
- zone_activity — données d'activité
- hub_channels — canaux hub par membre
- hub_requests — workflows des demandes hub
- staff_announcements — planification des annonces staff
- panel_messages — état des panneaux interactifs
- panel_message_registry — suivi des messages de panneau
- settings — configuration au niveau du serveur
- Passer
NODE_ENV=developmentpour des logs lisibles avec traces complètes. - Le planificateur de tâches loggue les compteurs d'exécution, d'erreurs et le timestamp du dernier succès.
- Le bot valide la connexion MySQL au démarrage et quitte avec un message clair si elle échoue.
- Forker le dépôt
- Créer une branche (
git checkout -b feature/ma-fonctionnalite) - Commiter les changements
- Ouvrir une Pull Request
- ESLint strict — toujours lancer
npm run lintaprès modification - Suivre les conventions de nommage existantes
MIT — voir le fichier LICENSE.
- Discord.js — wrapper Discord API
- Pino — logger JSON ultra-rapide
- MySQL2 — driver MySQL