Skip to content

v7.8

Choose a tag to compare

@Klaynight-dev Klaynight-dev released this 26 May 18:31
· 3196 commits to main since this release

📝 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.lockb a été supprimé des règles d'exclusion .gitignore et remplacé par le format texte standardisé bun.lock afin 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.86 puis 7.8 , et le Dashboard est passé de 3.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 DockerfileBot et DockerfileDash s'appuyant sur l'image alpine figée oven/bun:1-alpine pour 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 (GuildHourlyStat et MemberDailyStat).

  • 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/bun cô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 verifyRecruitmentWebhookAuth valide 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 FeatureAccessMap et du helper resolveFeatureAccessMap pour é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 canModerateDailyAlgo a é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 champ staffMember.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'eventType demandé. 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-configs dé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 GuildMemberAdd et GuildMemberUpdate. 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 hasDiscordMentions permettant 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_REJECTED mais 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.io pour 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 /transcript s'appuie sur la fonction parseDateTimeOrDuration pour 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èle Transcript de 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-api a été entièrement supprimée du fichier bun.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 .vscode et .codex , ainsi que du fichier d'image d'arrière-plan apps/dashboard/public/noise.svg pour mettre un terme aux requêtes HTTP 404 superflues lors du chargement du layout principal du Dashboard.

What's Changed

New Contributors

Full Changelog: v1.0.0...v7.8