Repository navigation
v7.8
📝 BILAN EXHAUSTIF DES ÉVOLUTIONS ET NOTES TECHNIQUES : KOTBO (v1.0.0 ➔ v7.8)
🏗️ I. CONFIGURATION DU RUNTIME, ARCHITECTURE & MODALITÉS DE DÉPLOIEMENT
1. Environnement d'Exécution et Gestion des Dépendances
-
Runtime applicatif : L'écosystème a opéré une migration intégrale sous Bun. Le fichier de verrouillage binaire
bun.lockba été supprimé des règles d'exclusion.gitignoreet remplacé par le format texte standardisébun.lockafin d'éviter les erreurs de lockfile gelé (frozen lockfile) lors des déploiements en intégration continue (CI). -
Mise à niveau de la pile technique (Bumps) : Les dépendances clés ont été actualisées. Côté Bot, la version globale est passée de
6.75à6.86puis7.8, et le Dashboard est passé de3.50à3.65. Les paquets mis à jour incluent@napi-rs/canvas(^0.1.100),discord.js(^14.26.4),bullmq(^5.76.11),ioredis(^5.10.1),pg(^8.21.0),typescript(^5.9.3), et@prisma/client(^7.8.0). -
Conteneurisation (Docker) : Introduction de
DockerfileBotetDockerfileDashs'appuyant sur l'image alpine figéeoven/bun:1-alpinepour assurer la reproductibilité des builds. -
Le build du dashboard injecte les arguments Vite (
VITE_API_URL,VITE_DISCORD_CLIENT_ID,VITE_DISCORD_REDIRECT_URI) avant de générer les actifs statiques servis par un serveur Nginx configuré pour les applications mono-page (SPA). -
La commande de démarrage du conteneur du bot exécute séquentiellement le déploiement des commandes slash et le lancement du runtime via
sh -c(bun deploy-commands && bun run [...]).
2. Traitement Asynchrone, Cache et Observabilité
-
Infrastructure de File d'Attente (BullMQ) : Intégration de Redis et BullMQ pour déporter les tâches lourdes hors du thread principal de
discord.js. Les routines transférées incluent : -
L'agrégation toutes les 10 minutes des statistiques d'activité des salons vocaux et des messages (
GuildHourlyStatetMemberDailyStat). -
La vérification horaire des rapports de modération manquants via
checkMissingReports. -
Les routines d'expiration des sanctions et de dégradation automatique des membres du personnel modérateur.
-
Centralisation des Exceptions : Injection du SDK
@sentry/buncôté applicatif pour la capture automatique des promesses rejetées non interceptées (unhandledRejection).
🚨 II. SÉCURISATION, AUTHENTIFICATION ET CONTRÔLE D'ACCÈS (RBAC)
1. cycle d'Authentification OAuth2 et API Keys
-
Authentification Dashboard : Centralisation du flux Discord OAuth en redirigeant le client vers le point de terminaison du backend (
/api/auth/discord/login), supprimant la construction manuelle de l'URL côté navigateur. Un mécanisme de validation strict (DASHBOARD_OAUTH_STRICT) bloque le démarrage du serveur ou émet des alertes si les variables d'environnement secrètes sont manquantes. -
Passerelle de Webhooks de Recrutement : La fonction
verifyRecruitmentWebhookAuthvalide les soumissions via JWT ou clés d'API, renvoyant un résultat structuré (ok_jwt,ok_api_key,missing_credentials,invalid_jwt,invalid_api_key) inclus dans les réponses 401 pour faciliter le débogage.
2. Permissions Granulaires et Matrice d'Accès
-
Calcul des Droits Applicatifs : Implémentation de
FeatureAccessMapet du helperresolveFeatureAccessMappour évaluer dynamiquement les permissions d'un utilisateur d'après ses rôles Discord, les configurations de la guilde et son statut d'administrateur global. Les administrateurs globaux disposent d'un bypass (resolveAdminAccess) pour accéder aux terminaux de gestion même sur les guildes non activées. -
Séparation des Rôles Spécifiques :
-
La permission
canModerateDailyAlgoa été isolée pour permettre la revue des exercices de code sans requérir les droits complets de modération de contenu. -
La permission
canManageTutoring(dérivée du champstaffMember.isTutor) remplace l'obligation d'être administrateur pour configurer le tutorat. -
Système d'Activation des Guildes : Mise en place d'un système de verrouillage des fonctionnalités par code d'activation. Les événements des serveurs non enregistrés en base de données ou absents du cache mémoire (
loadActivatedGuilds) sont interceptés et bloqués à l'entrée.
📊 III. RESTRUCTURATION DE LA BASE DE DONNÉES (SCHÉMA PRISMA)
Le fichier schema.prisma a reçu de multiples extensions cumulatives pour supporter les modules optionnels et les structures d'indexation complexes :
-
GuildLogEventConfig(Routage des événements) : Table créée pour stocker l'activation et le salon cible de chaque type de log. Clé unique composite@@unique([guildId, eventType])et index@@index([guildId]). -
StaffResignation(Suivi RH) : Modèle stockant l'identifiant utilisateur, la raison du départ, la date de soumission, la date de résolution et un statut sous forme de chaîne de caractères (PENDING,APPROVED,REJECTED). -
GuildHourlyStat&MemberDailyStat(Analytics) : Tables de stockage temporel dédiées à l'enregistrement quantitatif des volumes de messages envoyés, du temps passé en salon vocal et du décompte des membres actifs. -
CodePoliceRule(Régulation syntaxique) : Table dédiée au stockage des expressions régulières et des configurations de risques pour l'analyse des blocs de code sur Discord. -
Champs de Configuration Globale (Table
Guild) : Ajout des colonnes de drapeaux de fonctionnalités (propagateSanctions,translation,codePolice,dailyAlgo,githubReleases,digest,youtube), des configurations de pseudonymes (autoNicknameModerationEnabled,autoNicknameModerationWords) et des identifiants de canaux par défaut (publicChannelId,dailyAlgoChannelId,baseStaffRoleId,testStaffRoleId).
📡 IV. SYSTÈME DE LOGS AVANCÉS ET CONFIGURATION DE NOTIFICATIONS
Le module de journalisation a été refondu pour remplacer les flux génériques par un routage dynamique guidé par l'arborescence des types d'événements :
[Émetteur du Bot] ➔ Appel logEvent(eventType, payload)
│
▼
[Vérification GuildLogEventConfig]
│
┌────────────────┴────────────────┐
▼ ▼
[enabled == false] [enabled == true]
│ │
Silencieux (Skip) Envoi vers channelId dédié
(Fallback sur canal général si absent)
-
Routage Typé : La fonction
logEventévalue l'état d'activation de l'eventTypedemandé. Si l'événement est activé mais qu'aucun canal spécifique n'est assigné, le système utilise par défaut le canal de log principal de la guilde. -
Gestion des Modifications de Configuration : Toute modification des routes de notification ou d'absence via les terminaux
PUT /guilds/:guildId/logs/event-configsdéclenche l'envoi immédiat d'une entrée d'audit administrative pour assurer la traçabilité des actions du staff.
🛡️ V. ENGINS D'AUTOMODÉRATION : PSEUDONYMES ET CODEPOLICE
1. Inspecteur Automatisé de Pseudonymes (Auto-Nickname Moderation)
-
Mécanisme de Détection : Surveillance active via les écouteurs d'événements
GuildMemberAddetGuildMemberUpdate. Le contenu du pseudonyme est confronté à un dictionnaire multilingue (FR/EN) géré via une interface CRUD stockée en base de données. -
Sanction Immédiate : En cas de détection d'un mot interdit, le membre est automatiquement renommé sous un format neutre type
Modérateur_XXXX. L'action applique une modification instantanée sur Discord, inscrit l'événement dans le casier judiciaire du membre et lui transmet un message privé (DM) d'avertissement automatique.
2. Le Module CodePolice (Analyse des Blocs de Code)
-
Analyse de Contenu : Analyse syntaxique des messages textuels pour repérer l'absence de balises de code (fences Markdown) sur les longs payloads ou détecter des structures de code à haut risque.
-
Évitement des Faux Positifs : Le service intègre une fonction
hasDiscordMentionspermettant d'ignorer les messages contenant des mentions Discord valides afin de ne pas déclencher d'alertes injustifiées. -
Interceptions : Les motifs jugés de sévérité critique déclenchent un blocage immédiat du message. Les configurations modifiées vident instantanément le cache local via
invalidateCodePoliceEnabledCache.
👥 VI. WORKFLOWS DE RECRUTEMENT ET OFFBOARDING DES ÉQUIPES (HR)
1. Gestion des Candidatures de Recrutement
-
Heuristiques de Rejet Automatique : Le système intègre des règles de filtrage lors de la réception des candidatures (vérification de l'âge minimum, déclaration de la possession d'un microphone fonctionnel et taille minimale des paragraphes de motivation). Les candidatures rejetées par ces règles prennent le statut
AUTO_REJECTEDmais disposent d'un bouton de contournement "Accepter quand même" dans l'interface admin. -
Passage à l'Oral et Onboarding : La validation d'un candidat génère un salon Discord temporaire muni de boutons d'action. L'acceptation finale bascule automatiquement le statut, crée la fiche du personnel, attribue les rôles Discord requis et initie la période de test (
TestingPeriod).
2. Suivi de Démission (Staff Resignations)
-
Processus d'Offboarding Neutre : L'ouverture d'un formulaire de démission par un modérateur génère un ticket de discussion privé sur le serveur Discord de l'encadrement pour organiser la transition.
-
Automatisation de Sortie : Dès approbation finale de la démission sur le Dashboard, Kotbo révoque immédiatement l'ensemble des rôles de modération de l'utilisateur, inscrit la clôture dans les logs de transition du personnel et lui envoie une notification de confirmation par DM.
📰 VII. SYSTÈME DE TICKETS, SYNAPSE DE TRANSCRIPTS ET ACTUALITÉS
1. Module de Support par Tickets
- Synchronisation Temps Réel : Implémentation de
socket.iopour assurer la diffusion instantanée des messages des tickets entre le serveur Discord et l'interface Web du Dashboard. Un moteur de rendu dédié convertit le Markdown Discord en HTML enrichi, extrait les URL de médias et résout les structures d'émoticônes et de mentions.
2. Générateur de Transcripts Spécifiés
- Filtres Temporels et Quantitatifs : La commande
/transcripts'appuie sur la fonctionparseDateTimeOrDurationpour extraire des historiques de messages basés sur un décompte précis, une durée relative, des identifiants de messages bornes ou des fenêtres de dates complexes. Les métadonnées associées sont sauvegardées dans le modèleTranscriptde Prisma pour générer des liens de consultation publics.
3. Module d'Actualités et Fils Automatiques (Auto-Thread)
-
Syndication RSS : Le module d'actualités expose un point de terminaison public générant dynamiquement des flux XML conformes à la spécification RSS 2.0 pour chaque guilde.
-
Auto-Thread Réactif : Écoute et analyse des messages dans les canaux configurés pour y attacher instantanément un fil de discussion Discord. Le système s'appuie sur un mécanisme de cache interne dont l'invalidation est déclenchée dès modification des options du Dashboard.
🛠️ VIII. RÉPERTOIRE MÉTHODIQUE DES COMMANDES SLASH DISCORD (v7.8.0)
L'environnement deploy-commands.ts valide et expose les interactions suivantes au sein de l'API Discord :
| Commande | Sous-commandes / Options réglementées | Comportement Applicatif & Services Consommés |
|---|---|---|
| /help | [cmd] (Optionnel avec autocomplétion) |
Explore le schéma JSON des commandes enregistrées. Construit un affichage catégorisé des options et statuts de requis. |
| /info | Sans option | Retourne l'uptime précis, l'état de la mémoire RAM de Bun, le volume des files BullMQ et l'état des modules. |
| /post | digest, daily-algo |
Force l'exécution immédiate et asynchrone de la distribution des digests éditoriaux ou des défis algorithmiques. |
| /sanction | Arguments utilisateur et motifs | Applique une sanction (Avertissement, Exclusion, Bannissement, Mutisme) avec persistance et calcul des dates d'expiration. |
| /casier | Cible utilisateur | Appelle le service memberCaseService pour compiler l'historique complet (invitations, logs, sanctions). |
| /profil | Sans option | Construit la fiche de performance du modérateur (statistiques de présence vocale, rapports de mentorat). |
| /rescan | dc scan, pseudo scan |
Déclenche instantanément une analyse globale des membres pour identifier les doubles comptes ou les pseudonymes illicites. |
| /activate | [code] |
Terminal d'entrée permettant aux administrateurs de serveurs d'enregistrer une clé d'activation valide. |
| /absent | declare, terminate, list |
Enregistre ou clôture les fiches d'absences du personnel avec synchronisation immédiate sur le calendrier d'équipe. |
| /meeting | create, sync, checkin |
Crée un événement planifié Discord, gère les boutons d'émissions d'excuses (RSVP) et calcule le temps de présence vocal. |
| /note | Cible utilisateur + message | Persiste une note d'évaluation textuelle sur le profil d'un membre (memberProfile.moderatorNote), invisible pour l'intéressé. |
📉 IX. NETTOYAGE CRITIQUE ET DESTRUCTION DE CODE HÉRITÉ (DETTE TECHNIQUE)
Lors du sprint de stabilisation (clôturé au commit 5f12a1b), plusieurs fonctionnalités historiques instables ont été définitivement purgées de l'application afin de réduire l'empreinte mémoire et d'alléger de 60% le payload d'état initial du serveur:
-
Purge du sous-système de surveillance brute de YouTube : Retrait complet des écouteurs et des tâches d'analyse de flux vidéo non optimisées.
-
Suppression de l'ancienne modération de contenu standard : Remplacement global par le dictionnaire dynamique basé sur la base de données PostgreSQL.
-
Remplacement de dépendances tierces : La dépendance tierce obsolète
@vitalets/google-translate-apia été entièrement supprimée du fichierbun.lock. Le système s'appuie désormais de manière exclusive sur un adaptateur auto-hébergé LibreTranslate équipé de politiques de tentatives (retries) et de détection de quotas d'appels. -
Destruction des fichiers résiduels : Élimination définitive des répertoires d'environnement
.vscodeet.codex, ainsi que du fichier d'image d'arrière-planapps/dashboard/public/noise.svgpour mettre un terme aux requêtes HTTP 404 superflues lors du chargement du layout principal du Dashboard.
What's Changed
- Make kotbo scale by @Klaynight-dev in #1
- feat(automod): add automatic nickname moderation system by @Intercalaire in #2
- e by @Klaynight-dev in #3
New Contributors
- @Klaynight-dev made their first contribution in #1
- @Intercalaire made their first contribution in #2
Full Changelog: v1.0.0...v7.8