📰 Dernière mise à jour — Un salon supprimé éteignait six fonctions en silence 🧭Demote without banning, and a log that no longer accuses the wrong person 📉
Publié le 2 septembre 2026 à 17:05
- 📉
+derank @membre— retire à quelqu'un ce qui lui donne du pouvoir, en lui laissant son rôle de membre et ses rôles décoratifs. Le bot savait deranker tout seul dans cinq situations, jamais sur demande — et un+massrole dellui aurait aussi pris sa couleur et son appartenance, ce qui en fait un inconnu incapable d'écrire. Réparable par+rerank, comme les cinq autres. - 🎭
+blrank— « cette personne ne sera plus jamais promue », sans la bannir. C'est une commande à part entière, pas un autre nom pour+bl:+blretire les rôles et bannit au retour,+blrankretire les rôles et sanctionne qui en redonne un, point. Pour un ancien staff rétrogradé définitivement, le seul outil disponible était le bannissement — quatre crans trop haut, choisi faute de mieux. - 🔍 Le journal pouvait attribuer un ajout de rôle à qui avait fait un retrait — l'auteur était cherché une seule fois pour les deux, avec les rôles ajoutés et retirés mélangés : la première entrée d'audit qui touchait l'un d'eux signait les deux lignes. Il suffisait que deux gestes se croisent sur le même membre en quinze secondes — un grade posé par le bot pendant qu'un modérateur retire un rôle — pour lire « @Modo a ajouté le rôle Staff ». Une fausse accusation dans la pièce qu'on relit justement après un incident. Chaque ligne porte désormais son propre auteur.
- 🔒 La quarantaine exigeait « Bannir des membres », alors qu'elle ne bannit personne — elle retire les rôles et pose un rôle d'isolement, c'est-à-dire exactement ce que « Gérer les rôles » permet déjà de faire à la main. Le modérateur pour qui elle est faite ne pouvait donc pas s'en servir, et se rabattait sur plus sévère faute d'accès au plus doux. Le palier suit maintenant le pouvoir réellement exercé.
- 🏆 Les deux récompenses du premier du mois n'en font plus qu'une. « 🏆 Champion des jeux » et « 🥇 Top 1 activité » étaient deux rôles dorés hoistés côte à côte, même cadence, le plus souvent la même personne : la récompense apparaissait en double en tête de la liste des membres. C'est désormais 🏆 Champion du mois, un seul rôle, que l'on gagne des deux façons — et que l'on garde tant qu'on en mérite l'une des deux. Les serveurs qui portaient les deux voient le doublon disparaître, ceux qui le portaient reçoivent le rôle unique, et le journal explique la fusion. Un rôle à qui un administrateur avait confié des permissions n'est jamais supprimé : ce n'est plus une décoration, on le laisse et on le dit.
- 🔑 Les noms de la documentation existent enfin.
+set perm,+del perm,+clear perms,+change,+changeall: cinq formes écrites dans la doc des permissions, et introuvables dans le bot. Les fonctions étaient là, sous d'autres noms — qui suivait la documentation tapait une commande inconnue. Les nouveaux noms ne réimplémentent rien : ils passent la main aux commandes existantes, qui gardent leurs propres portes.+del perm modo @Staffrefuse d'ailleurs si la cible est ailleurs qu'au palier modo, en disant où elle est : retirer sans regarder lui aurait pris son vrai palier. - 📚 Le site de documentation rattrape le bot. 22 commandes n'y avaient aucune fiche — elles n'existaient donc pas pour qui découvre le bot par la doc. 47 descriptions et 35 lignes d'usage décrivaient un comportement que le bot n'a plus ; une syntaxe périmée, c'est la page elle-même qui fait taper une commande qui ne marche pas. 11 fiches ignoraient un alias ajouté depuis. Les compteurs suivent.
- 🆕 Sept fonctions n'avaient aucune porte dans
+menu. Filtre de fichiers, rafale de pièces jointes, émojis interdits, réactions automatiques, rôle et XP des boosteurs, fenêtre de rerank : douze réglages qui n'étaient joignables que par leur commande, à condition d'en connaître le nom. Ils ont maintenant leur page —+menu→ 🆕 Modules récents — avec l'état de chacun sous les yeux. L'écran lit et écrit par les fonctions des modules eux-mêmes : il ne peut donc pas accepter ce que la commande refuse, ni l'inverse. Et il ne promet pas plus qu'il ne fait : une réaction automatique associe un émoji à un SALON, ça reste+autoreact— l'écran affiche l'état et le dit, plutôt que d'offrir un réglage dégradé qui aurait l'air complet. - 🏆 Le podium de fin de saison partait quatre fois, et pas dans le salon des jeux. Signalé ce matin, capture à l'appui : quatre podiums identiques à la même minute. Ce n'était pas quatre calculs — c'était UN message que la couche réseau a rejoué trois fois, après avoir cru chaque envoi perdu alors qu'il était passé. Les annonces mensuelles empruntent maintenant le chemin qui n'insiste jamais : mieux vaut un message perdu que quatre copies. Et le podium des jeux va désormais dans le salon des jeux — il tombait jusqu'ici dans le salon système du serveur, faute de connaître celui que l'assistant crée pour ça.
- 🔑 Retirer des permissions sensibles redevient un geste de propriétaire. Le bouton proposé sous l'alerte « rôle à permissions sensibles modifié » acceptait n'importe quel administrateur — c'est-à-dire exactement la personne dont l'alerte signale le geste. Quelqu'un qui venait de s'accorder « Administrateur » pouvait ensuite manipuler lui-même le menu de retrait. Le contrôle remonte là où l'alerte est adressée, et le message de refus dit enfin la vraie porte.
- 🌍
publicdevient un palier — et reste impossible sur ce qui fait mal.+change <commande> publicouvre une commande à tout le monde. La mécanique le permettait déjà en silence :canUsecompare le palier du membre à celui de la commande, donc un 0 en base ouvrait tout — seul le MOT manquait, ce qui est le pire des garde-fous, celui qui protège tant que personne ne trouve la porte. Le mot arrive avec sa serrure : bannir, expulser, purger, promouvoir en masse, tout ce que le bot range en « sécurité critique », et tout ce que Discord réserve déjà par une permission sensible — le refus est franc, et rien n'est écrit.+changeallobéit à la même règle et annonce combien de commandes il a écartées. - 🚩
+reportexplique au lieu de signaler. Le signalement se fait sur le message lui-même : appui long (ou clic droit) → Applications → « Signaler ce message ». C'est le chemin le plus sûr, et il existait déjà : la commande faisait double emploi, en moins fiable — elle devait deviner qui était visé à partir d'une réponse et d'une mention, au point qu'il avait fallu lui ajouter un garde-fou contre+report @Untelécrit en réponse au message de quelqu'un d'autre.+reportest désormais l'écran qui montre les deux gestes, dit ce que le staff reçoit, et annonce si l'anonymat est actif sur ce serveur. Quand le module est coupé, il le dit au lieu de décrire un menu qui n'apparaîtra pas. - 🎨 Le changelog prend la couleur du logo. Il partait en or — la couleur MINORITAIRE de l'icône. Mesurée pixel par pixel, transparence et gris exclus : 82,4 % du logo est bleu
#5865F2, 16,8 % doré. Un thème configuré garde la priorité : ce n'est qu'un défaut, pas une couleur imposée. - 🔗 Les nouveaux raccourcis sont annoncés. Une commande neuve part avec ses alias — ils sont dans son entrée d'aide. Mais un alias ajouté à une commande qui existait déjà n'était annoncé nulle part : le raccourci existait, fonctionnait, et personne ne l'apprenait. La donnée était pourtant là — le bot mémorisait déjà les alias pour distinguer un retrait d'un renommage ; c'est la question qui n'était jamais posée. Le champ est borné comme les autres : au-delà d'un millier de caractères, Discord refuse le message entier, pas seulement le champ.
- 🎫 Trois limites sur les tickets, et deux commandes qui manquaient.
+ticket max <1-10>: combien de dossiers une même personne peut tenir ouverts — la limite valait déjà 1, en dur, la règle existait sans être réglable, donc rien ne change pour qui n'y touche pas.+ticket interdit @rôle: le miroir des rôles requis, et le refus nomme le rôle qui bloque — « accès refusé » tout court envoie le membre écrire au staff en privé, exactement ce que les tickets existent pour éviter.+ticket depart onferme le ticket quand son auteur quitte le serveur ; éteint par défaut, parce qu'un membre part par accident et que son ticket porte souvent la seule trace écrite d'un litige. - ✋
+claimet+rename. Le bouton « Prendre en charge » remonte : dans un ticket de cinquante messages, il faut défiler jusqu'au premier pour le retrouver — alors deux personnes répondent en même temps.+claimfait le même geste depuis le clavier, avec les mêmes règles (elles sont appelées, pas recopiées), et+claim librerelâche.+rename remb-commande-4412rend une liste de tickets lisible. Discord limite les renommages à 2 par 10 minutes et met l'appel en attente au lieu d'échouer : la commande rend la main en le disant, plutôt que de rester muette plusieurs minutes. - 🧩
+custom <mot-clé>ouvre enfin son menu. L'éditeur complet existait — onze champs, dix options : réponse, destination, rôles donnés et retirés, rôles autorisés et refusés, salon de logs, cible, auto-suppression, pause, suppression. Il fallait simplement connaître le chemin+setup → Commandes perso → (choisir). Le geste naturel — taper le mot-clé qu’on vient de créer — répondait « action inconnue », la seule réponse qui n'apprend rien. C'est le même écran qui s'ouvre, pas une copie : deux éditeurs pour une même commande finiraient par proposer des options différentes, et personne ne saurait lequel fait foi. - 🎲 Une commande perso peut avoir plusieurs réponses, tirée au hasard à chaque appel.
+custom set salut reponse+ Salut à toi !en ajoute une ; jusqu'à huit. La réponse d'origine reste la principale — une commande déjà configurée répond exactement pareil tant qu'on n'ajoute rien, et tous les écrans qui l'affichent continuent de fonctionner sans migration. - ⏳ Un cooldown qui vaut pour tout le serveur, pas seulement par membre. Les deux existent maintenant, et ils ne répondent pas à la même question :
cooldowndit « chacun une fois par jour »,cdglobaldit « une fois par jour, pour le serveur entier ». C'est le second qu'il faut pour une commande qui poste dans un salon public ou qui distribue quelque chose. Le refus est distinct : « reviens dans 5 min » sur un cooldown global ferait croire au membre que c'est lui qui est limité, alors que la commande est fermée pour tout le monde. - 🎟️ Plusieurs sortes de tickets, chacune avec ses réglages.
+ticket type add 💰 Remboursement, puis sa catégorie, ses rôles prévenus, ses rôles d'accès, son message d'ouverture, son salon de logs et son nom de salon — tout est facultatif, et ce qui manque retombe sur la configuration du serveur. Le panneau s'adapte : un bouton par type, un sélecteur au-delà de cinq (une rangée Discord n'en porte que cinq, et la liste déroulante montre en plus les descriptions). Un serveur qui n'en définit aucun garde exactement le panneau d'avant, au bouton et à la couleur près — et une configuration abîmée y retombe aussi, plutôt que de casser l'ouverture. - ✋ Quatre façons de prendre un ticket en charge —
+ticket claim <mode>. Jusqu'ici c'était un interrupteur : pris en charge, ou pas.simplemarque le ticket comme avant ·verrouiller(lock) ne laisse plus écrire que celui qui l'a pris, le reste du staff continue de lire (donc de reprendre le dossier en connaissance de cause) ·cacher(hide) le fait disparaître pour les autres, quand le contenu est sensible ·autole donne au premier du staff qui écrit dedans — personne ne pense à cliquer avant de répondre, et un ticket sans porteur est un ticket que deux personnes traitent en même temps. L'auteur du ticket, lui, garde toujours l'accès : c'est sa demande. - ➕ Le panneau de réglages dit maintenant LEQUEL des quatre est actif. Il affichait « activée » tout court — ce qui laissait croire au simple marquage sur un serveur qui cache peut-être les tickets à tout son staff. Et son bouton oui/non ne perd plus le mode : couper puis rallumer rend celui d'avant, au lieu de tout ramener à « simple » sans que rien ne l'annonce.
- 🧾 Le panneau de tickets peut porter VOTRE texte —
+ticket source <bot|dernier|lien>. Le bot écrivait toujours son propre encadré : un serveur qui avait déjà rédigé son annonce d'accueil devait choisir entre garder son texte et avoir le bouton. Désormais le panneau peut recopier le dernier message du salon visé, ou n'importe quel message dont vous collez le lien — le bouton d'ouverture reste posé par le bot dans tous les cas. Le message d'origine n'est pas déplacé (ses réactions et ses réponses restent), et ses mentions ne sonnent pas une seconde fois. Si la source devient illisible, le bot le dit au lieu de poster son encadré en silence. - ⚙️ Les réglages de tickets deviennent un ÉCRAN, pas une liste de commandes à connaître.
+ticket settings→ Règles d'ouverture : le nombre de tickets simultanés, les rôles interdits d'ouverture, le mode de prise en charge, la source du texte du panneau et la fermeture au départ de l'auteur — tout se règle en cliquant, et l'écran DIT ce qui est réglé. Les sous-commandes ne disparaissent pas : un serveur qui a écrit+ticket max 3dans sa documentation interne garde sa phrase. - 🔗 Les boutons des commandes perso savent trois choses de plus.
+custom lien <mot-clé> <https://…> <libellé>pose un bouton-lien (il ouvre l'adresse ; https seul, parce qu'une URL invalide ferait rejeter le message ENTIER par Discord et la commande cesserait de répondre).+custom composants <mot-clé> off 2grise un bouton sans le supprimer — et il ne lance plus rien, même si un clic arrive quand même.+custom composants <mot-clé> mode 2 public|prive|remplacerchoisit comment il répond : dans le salon (comme aujourd'hui), au seul cliqueur, ou en remplaçant le message — ce dernier est ce qui fait enfin un vrai menu à étages au lieu d'une pile de réponses. La liste affiche l'état de chaque composant. - 🖼️ L'encadré d'une commande perso s'arrêtait à quatre réglages — titre, couleur, image, pied de page. Il gagne la miniature (
embedthumb), l'auteur et son icône (embedauthor,embedauthoricon), l'icône du pied de page, le lien du titre (embedurl— et le bot prévient qu'il ne se verra pas sans titre, Discord ne l'affichant que là), l'horodatage (embedtime) et surtout jusqu'à cinq champs :+custom set tarifs champ 1 Mensuel | 5 € !— la barre sépare le nom de la valeur, le!final met le champ en ligne. C'est la différence entre un tarif lisible et un pavé. - 🌐 Le bot est entièrement bilingue. Les derniers écrans encore écrits en français — les statistiques et l'écran de fin de Make It Meme, le nettoyage OffBackup et son bilan, les libellés d'AutoMod dans les logs — parlent désormais la langue choisie sur le serveur. Il ne reste aucun texte français en dur : le compteur est à zéro, et il est lui-même éprouvé (on lui donne du français à trouver pour vérifier qu'il n'est pas simplement devenu aveugle).
- 🛡️ Les alertes de sécurité ne peuvent plus se perdre en route. Les trois familles d'alertes — changement de configuration de sécurité, alerte aux propriétaires, alerte anti-raid — étaient déclenchées « au mieux » depuis des dizaines d'endroits, sans que personne n'attende leur résultat. Elles portent désormais elles-mêmes leur promesse : un échec d'envoi est journalisé au lieu de disparaître dans un filet global, et il ne peut plus emporter l'action qui l'a déclenchée.
- 🔎 Sept commandes servaient une vue « état » que personne ne pouvait deviner.
+lockword status,+autoslowmode status,+creation status,+oncall status,+pinlog status,+drops statuset+createur listfonctionnaient déjà — aucune ligne d'aide ne les citait. C'est le défaut que tu avais signalé sur+blrank: la fonction existe, personne ne peut la trouver. Les sept sont désormais annoncées, dans les deux langues. - 🧹 Quand le bot quitte un serveur, il cesse enfin de rafraîchir ses panneaux. Les panneaux vivants (
+base,+alertesnipe) restaient suivis pour toujours : le bot continuait d'aller chercher leurs messages dans des salons qu'il ne voit plus, à chaque cycle. Rien de visible pour toi — mais c'était du travail inutile qui ne s'arrêtait jamais. La trace est conservée : si le serveur réinvite le bot, ses panneaux se ré-arment comme avant. - 👁️ Trois fonctions existaient sans que personne puisse les trouver.
+custompermtout court affiche la liste de tes surcharges de permissions ;+digest journal apercumontre le résumé du jour sans le consommer ;+birthday message <texte>personnalise le message d'anniversaire. Les trois marchaient déjà — aucune ligne d'aide ne les citait, et le refus de+digest journalénumérait même tout SAUF l'aperçu. Sur les 29 sous-commandes non annoncées passées en revue, ce sont les trois seules vraies : le reste étaient des raccourcis de confort. - 🔒 Deux verrous de sécurité resserrés. Le bot ne peut plus mentionner
@everyoneou@hereen répondant à un message mal tapé — sa réponse reprenait le texte reçu, et seule une garde d'envoi manquait pour que ce texte redevienne une vraie mention. Et+massrolere-contrôle désormais le rôle au moment de l'appliquer, pas seulement au moment de le choisir : entre les deux, la sélection peut changer, et c'est le rôle appliqué qui compte. Trouvés en revue adversariale, reproduits, puis éprouvés par des tests qui rejouent l'attaque. - ⚖️ Les boutons de signalement respectent le rang. « Mettre en quarantaine » et « Bannir » vérifiaient la permission, jamais la hiérarchie : un modérateur pouvait sanctionner un administrateur placé au-dessus de lui — ce que ni
+banni Discord ne lui auraient laissé faire. Le contrôle partagé du bot est désormais appelé là aussi, avec la même exemption que partout ailleurs. - ⏱️ Le mute d'une commande perso durait soixante fois trop longtemps. La durée était écrite en secondes et relue en minutes :
10msilençait 10 heures,2hcinq jours — et1j, qui dépassait alors le plafond, retombait sur 10 minutes, donc la sanction la plus longue devenait la plus courte. La durée appliquée est maintenant celle que tu règles. - 🛑
+custom set <mot-clé> cdglobalne bloquait rien. Le cooldown partagé par tout le serveur était accepté, annoncé et enregistré — puis jeté à chaque relecture, donc sans le moindre effet. Une commande réglée « une fois par jour pour tout le monde » restait relançable en boucle. Il fonctionne. - 🖼️ L'annonce de montée de niveau se règle enfin.
+setup→ Niveaux : un bouton choisit entre la carte image (comme aujourd'hui) et un encadré simple, plus léger. Le code testait déjà ce réglage à chaque montée de niveau — rien ne permettait de l'écrire, donc la carte était imposée à tous. - ⚖️
+punition <module> <sanction>agit enfin. Le barème PAR MODULE s'écrivait, s'affichait… et n'atteignait jamais le code qui sanctionne : les treize endroits qui appliquent une sanction antiraid oubliaient tous de dire DE QUEL module ils parlaient. Résultat, régler+punition antichannel derankne changeait rien — seul+punition allfonctionnait, ce qui a masqué le problème. Le défaut ne bouge pas : sans réglage, c'est toujours le bannissement. - 📋
+config Pousserne recopie plus le vécu d'un serveur sur un autre. Quatre familles de clés passaient au travers du filtre : les archives de bilan (datées, donc invisibles pour les autres règles), les historiques écrits_histau lieu de_history, les jalons_done—onboarding_donecloné, et le serveur cible n'affichait jamais son écran d'accueil, croyant l'avoir déjà montré — et les verrous de publication, qui lui faisaient sauter un bilan qu'il n'avait jamais reçu. Les vrais réglages, eux, se copient toujours. - 🔑 L'écran des permissions cachait six paliers sur neuf.
+setup→ Permissions laisse choisir les neuf paliers, mais n'affichait que les trois premiers : un rôle placé au palier 4 à 9 était bien enregistré et bien actif — et totalement invisible sur l'écran qui existe pour montrer qui a des droits. On revenait, on lisait « aucun » partout, et on croyait son réglage perdu. Les paliers au-delà du troisième s'affichent maintenant dès qu'ils servent. - 🛡️ Un rôle de couleur ne rend plus intouchable. Le rôle perso acheté à la boutique, celui du niveau 50 et les rôles de podium étaient posés juste sous le rôle du bot — donc au-dessus de tout ton staff. Ils n'ont aucune permission, mais Discord interdit de sanctionner quelqu'un dont le rôle le plus haut domine le vôtre : un membre pouvait donc s'acheter l'immunité. Ils se placent désormais juste sous le plus bas de tes rôles de modération : la couleur prime toujours sur les rôles ordinaires, et personne ne perd son autorité.
- 🔒 N'importe qui pouvait tuer la confirmation d'un admin.
+xpdecayet+claimtop resetdemandent une confirmation par bouton. Le premier clic ARRÊTAIT la demande, quel qu'en soit l'auteur : le bot répondait bien « ce n'est pas à toi », mais l'administrateur ne pouvait plus valider — et il pouvait recommencer autant de fois qu'un curieux avait envie de cliquer. Les deux confirmations n'écoutent plus que celui qui les a demandées. - 🎟️ La transcription d'un ticket peut enfin partir à celui qui l'a ouvert. À la fermeture, elle ne partait qu'au salon de logs : le membre, lui, perdait tout — y compris les réponses du staff et ce qui avait été convenu. Un nouveau bouton dans
+ticket→ Règles d'ouverture la lui envoie aussi en message privé. Éteint par défaut, et c'est voulu : un transcript quitte le serveur et contient tout ce que le staff a écrit, ce n'est pas au bot de décider ça à ta place. Si ses messages privés sont fermés, la fermeture du ticket se déroule normalement. - 🎲 Les autocollants d'une commande personnalisée peuvent tourner. On ne pouvait en régler que trois, et les trois partaient à chaque fois. Tu peux maintenant en garder jusqu'à dix : le bot en tire trois au hasard à chaque réponse (Discord n'en accepte pas plus). Rien ne change pour qui en a réglé trois ou moins — ils partent tous, dans ton ordre.
- 👍 Tu choisis où se posent les réactions d'une commande personnalisée. Elles se posaient toujours sur la réponse du bot.
+custom set <mot-clé> reactou reponse|auteur|deuxpermet de les poser plutôt sur le message qui a déclenché la commande, ou sur les deux. Le réglage par défaut ne bouge pas. - 🆘 Une option de menu peut porter son émoji.
+custom menu <mot-clé> <libellé> 🆘:aide faqdonne l'émoji 🆘 à l'option « aide » et laisse « faq » sans. Un mot-clé écrit seul continue de marcher exactement comme avant. - 🔇 Un émoji mal écrit rendait une commande personnalisée muette. Un bouton ou une option avec un émoji invalide (
bonjour,:tada:, un identifiant tronqué) faisait refuser le message entier par Discord — pas seulement le bouton fautif. Le refus était avalé : la commande cessait simplement de répondre, sans erreur, sans log, et sans rien qui pointe vers l'émoji tapé la veille. Le bot refuse maintenant franchement l'émoji au moment où on l'écrit, et écarte ceux déjà enregistrés plutôt que de perdre le message. - ⏱️ Les deux cooldowns d'une commande personnalisée s'annulaient l'un l'autre. Le cooldown par membre et le cooldown global partagent la même table, et chacun effaçait la ligne de l'autre : réglés ensemble sur un même mot-clé, ils se détruisaient mutuellement en silence. Mesuré :
cooldown 1m+cdglobal 1h, et le premier membre qui passe deux minutes plus tard fait tomber le global de 58 minutes restantes à zéro ; dans l'autre sens, la pose du global effaçait un cooldown d'un jour. Les deux réglages apparaissaient pourtant bien dans la liste des options. Second point, sur les serveurs actifs : la ligne du compteur global était évincée par 200 membres plus récents — c'est-à-dire précisément là où un cooldown global sert. Les deux sont corrigés, et l'élagage continue de borner la table. - 🎫
+claimprenait le ticket sans rien verrouiller. Le bouton « ✋ Prendre en charge » applique le mode configuré : enlockil retire la parole aux autres, enhideil retire la vue. La commande, elle, prenait le ticket, annonçait « pris en charge »… et ne restreignait personne. Deux chemins pour le même geste, deux résultats — et c'est le chemin silencieux qui gagnait, puisqu'il annonçait quand même. Un serveur enlockcroyait son ticket fermé aux autres alors qu'il restait grand ouvert. La commande ne laissait aucune trace dans les logs non plus : prendre un ticket au clavier était invisible, impossible à arbitrer trois jours plus tard. Les deux chemins font désormais exactement la même chose. - 📁 Le salon de logs par type de ticket ne servait à rien.
+ticket type set <id> logs #salonse saisissait, se validait, s'écrivait — et aucun code ne le relisait. Tout continuait d'arriver dans le salon de logs global. Un admin qui séparait les logs de ses tickets de deban de ceux de l'aide n'avait aucune raison de soupçonner le bot plutôt que sa propre saisie. C'est branché : ouverture, prise en charge, transfert et transcription de fermeture suivent le salon du type. Un type sans salon propre continue d'écrire là où il a toujours écrit, et la liste+ticket type listaffiche enfin le salon réglé. - 🧩 L'éditeur ouvert par
+custom <mot-clé>ne faisait rien. L'écran s'affichait bien — onze champs, dix options, trois boutons — et les dix options du menu déroulant ne répondaient pas : chacune renvoyait à la liste générique des commandes personnalisées. Seuls les trois boutons marchaient. La raison : le menu ne transportait pas le mot-clé qu'on venait d'ouvrir, et le retrouvait dans une mémoire que seul+setupremplissait. Il le transporte maintenant, comme les boutons le faisaient déjà — et le mot-clé transporté est re-confronté à la configuration du serveur avant la moindre écriture. - 💬 L'invite d'un menu ne pouvait faire qu'un seul mot.
+custom menu m Choisis ton rôle aidemettait « Choisis » en invite puis cherchait une commande nommée « ton » — et répondait « cible inconnue », une erreur qui ne parlait pas du tout du vrai problème. Entoure l'invite de guillemets pour lui donner plusieurs mots :+custom menu m "Choisis ton rôle" aide faq. Les guillemets français « » et courbes fonctionnent aussi. Sans guillemets, rien ne change : un seul mot, exactement comme avant. - 🗑️ Le délai avant la suppression d'un salon de ticket se règle enfin. Il valait 5 secondes en dur depuis toujours : trop court pour relire le salon avant qu'il s'efface, et de trop pour un serveur qui préfère archiver ses tickets fermés.
+ticket suppression <1-3600>fixe le délai,+ticket suppression offconserve le salon — la fermeture retire les accès et envoie le transcript comme avant, seule la destruction est annulée. Le défaut ne bouge pas : un serveur qui ne touche à rien garde ses cinq secondes. Et l'annonce ne promet plus une suppression qui n'aura pas lieu. - 🎨 Le changelog arrivait dans deux couleurs différentes selon le chemin d'annonce. Les nouveautés partent par deux annonceurs ; l'un employait le bleu du logo, l'autre l'or — c'est-à-dire la couleur minoritaire du logo (16,8 % de ses pixels colorés, contre 82,4 % pour le bleu). Les deux emploient maintenant la même.
- 📌 Poser un panneau de tickets sans quitter les menus. L'écran
+ticket settingsgagne un bouton « Poser le panneau ici ». Il fait exactement ce que fait+ticket panel, avec les mêmes garde-fous — sans rôle staff configuré, il refuse plutôt que de poser un panneau que personne ne pourra traiter. - 🛡️ Un fichier que le bot n'avait PAS pu analyser était annoncé « 🟢 Sain ». Quand le quota d'analyse s'épuise au mauvais moment, VirusTotal ne rend aucun verdict. Ce cas n'était trié nulle part : la pièce jointe tombait dans la dernière branche et partait dans tes logs en vert, avec « 0 détection(s) / 0 moteurs ». Le staff lisait « vérifié et propre » là où rien n'avait été vérifié — le pire message possible, parce qu'il fait baisser la garde au lieu de la lever. Le même cas était pourtant déjà traité pour les liens. Il est désormais annoncé en jaune, « analyse différée », comme les autres fichiers non vérifiés, et le compteur d'analyses ne compte plus ce qui n'a pas été analysé.
- 💾 Le scan des pièces jointes pouvait faire redémarrer le bot. Il téléchargeait chaque fichier en un seul bloc en mémoire, jusqu'à 50 Mo, sans compter combien de téléchargements tournaient en même temps. Une dizaine de fichiers postés simultanément sur l'ensemble des serveurs suffisait à dépasser la mémoire allouée au bot et à le faire relancer. Les fichiers sont maintenant lus par morceaux, coupés net au dépassement, et trois téléchargements au plus tournent à la fois — au-delà, l'analyse est différée et annoncée comme telle, jamais présentée comme un fichier sain.
- 🔐 Éteindre un module de sécurité redevient un geste de propriétaire. Le panneau
+secuacceptait n'importe quel administrateur — alors que les mêmes modules sont réservés au propriétaire du serveur partout ailleurs (+setup, l'assistant). C'était la seule porte ouverte pour couper la surveillance des changements de configuration, la détection de self-bots et la surveillance des webhooks — les trois sont allumés par défaut, et aucun n'est couvert par la double validation. Les allumer reste ouvert aux administrateurs : renforcer son serveur ne doit attendre personne. - 👑 Un rôle portant le bon nom pouvait devenir un passe-droit. La couronne du Roi de la Colline et les trois rôles de podium des jeux sont distribués automatiquement — au vainqueur, au top 3, toutes les dix minutes, sans que personne ne clique. Quand un rôle du bon nom existait déjà, le bot l'adoptait sur son seul nom : un modérateur ayant « Gérer les rôles » pouvait donc créer un « 👑 Roi de la Colline » chargé de ses propres permissions et laisser le bot le distribuer pour lui. Ces deux modules appliquent désormais le même filtre que les autres rôles du bot — permissions sensibles, rôle géré par une application, rôle hors de portée : refusé. Et un refus ne fabrique pas un deuxième rôle du même nom, sans quoi le bot en attraperait un au hasard la fois suivante.
- 🌐 Un serveur pouvait effacer, pour tout le réseau, un signalement né sur un autre serveur. Le bouton « Innocenter » de
+setupdemandait depuis toujours à qui appartenait la fiche. Le bouton « 🔓 Libérer » du panneau de quarantaine, lui, effaçait sans rien demander : la couronne d'un serveur pouvait révoquer l'accusation d'un autre, et les serveurs suivants ne s'en méfiaient plus jamais. La règle vit désormais en un seul endroit, appelée par les deux boutons — retirer son PROPRE signalement reste l'usage prévu, et le propriétaire du bot garde le pardon global. Une fiche dont on a perdu la provenance n'est plus effaçable par personne d'autre que lui. La libération locale, elle, ne change pas d'un pouce. - 🕶️
+auditne publie plus de liste nominative dans un salon ouvert. L'audit s'affiche dans le salon où on le lance — c'est voulu, les boutons de correction y sont utilisables par toute l'équipe. Mais il y affichait aussi les noms des membres à risque et leur indice exact, quel que soit le salon. Le bot sait pourtant rendre une version en nombres (« 3 membres à risque ») ; cette version existait, entièrement écrite, et n'était jamais demandée. Désormais : salon réservé au staff → tout le détail et les boutons ; salon lisible par tout le monde → les nombres seuls. Dans le doute, le bot considère le salon comme public. - 🐛
+bugn'avait aucun frein propre. La commande est ouverte à tous et chaque signalement écrit sur le disque, envoie un message privé au propriétaire et poste dans les logs — mais elle retombait sur le délai générique de 2 secondes, soit une trentaine de rapports par minute et par serveur. Elle passe à 60 secondes, comme+reportqui fait exactement le même travail. - 🧱 Une liste blanche antiraid abîmée faisait tomber les commandes qui la lisent. Onze endroits du bot lisent la liste blanche ; deux seulement vérifiaient sa forme. Si la valeur en base n'était pas une liste — après une restauration de sauvegarde d'une autre version, par exemple —
+unwl,+antiraid,+blet trois contrôles de Guardian plantaient au lieu de répondre. Et+unwlétait justement l'une des rares commandes capables de réparer la liste. Pire pour+bl: le plantage arrivait après l'inscription en blacklist, laissant la sanction à moitié posée — pas de dérank, pas de réponse, pas de trace — et relancer la commande répondait « déjà blacklisté ». Tout passe maintenant par une lecture unique qui borne la liste et son contenu ; une liste illisible n'exempte simplement personne. - 🎨 La couleur d'un refus était perdue. Le bot a une règle : ❌ rouge, ⚠️ orange, ✅ vert. Mais toute réponse en texte simple était ré-habillée avec la couleur du thème du serveur avant que cette règle ne s'applique — un refus sortait donc dans la même couleur qu'une confirmation. Sur un message d'erreur, la couleur est la première chose qu'on lit. Elle est rétablie ; le thème du serveur ne s'applique plus qu'aux messages neutres, jamais à une erreur. Corrigé au passage : à partir de la deuxième réponse d'une même commande, le bot perdait aussi son en-tête de marque.
- 🧪 Une copie de développement ne peut plus rien diffuser sur tes serveurs. Un bot lancé par erreur depuis une machine de développement se connecte avec le même jeton, voit tous tes serveurs, et lance ses tâches automatiques une minute plus tard — avec sa base de données, qui est en retard. C'est ce qui a fait repartir le podium de fin de saison une seconde fois, 24 heures après le vrai. Rien dans le bot ne pouvait l'empêcher : le verrou anti-doublon vit en mémoire (donc par processus) et le repère de saison vit en base (donc par copie de base). Un fichier repère à la racine coupe désormais toutes les tâches automatiques d'une copie locale — les commandes, elles, continuent de répondre. La production n'a pas ce fichier et ne change pas d'un pouce.
- 📌 Le bot laissait son propre avis d'épinglage sous ses panneaux. Quand il épingle un de ses panneaux — la salle des trophées, l'écran de configuration — Discord glisse juste en dessous « Hasu Protect a épinglé un message dans ce salon ». Cet avis ne dit ni quoi a été épinglé, ni où aller, et il salit un salon que le bot vient de soigner. Le nettoyage existait pourtant… mais il était placé après le filtre qui ignore les messages de bots, or l'auteur d'un avis d'épinglage est celui qui a épinglé. Il ne voyait donc que les épinglages humains — et seulement si le module d'épingles était activé, ce qu'il n'était sur aucun serveur. Le bot nettoie maintenant son bruit sans rien demander, et écrit à la place une trace dans ton journal : qui a épinglé, un extrait du message, et un lien direct. L'avis d'un membre, lui, reste intact tant que tu n'as pas activé
+pinlog. - 📦 Les caisses surprise atterrissaient dans le règlement. Sur un serveur qui vient d'ajouter le bot, celui-ci choisit tout seul un salon pour les caisses. Quand aucun salon ne ressemblait à un « général », il prenait le premier de la liste — c'est-à-dire, sur un serveur neuf, presque toujours le règlement ou l'accueil. Ce n'était pas du hasard, c'était systématique : mesuré sur les serveurs, quatre avaient reçu leurs caisses dans
#règles,#rules,#〢🚀・bienvenueou#server. Le bot écarte désormais les salons de règlement, d'annonces, de logs, d'accueil et de staff, ainsi que ceux qu'il gère lui-même — et s'il n'en trouve aucun de convaincant, il n'active rien du tout. C'est au propriétaire de choisir, avec+drops setup #salon. - Les salons de présentation ont été remis au propre. Le nombre de commandes n'est plus écrit deux fois dans le même écran, chaque catalogue reprend l'emoji de son propre salon au lieu d'en afficher un autre, les pages suivantes s'annoncent comme des suites, et la syntaxe passe sous le nom de la commande au lieu de couper la phrase en deux.
- Le contrôle qui relit les salons de présentation ne savait pas lire les noms de commandes accentués :
+défiétait vérifié sous le nomd,+trophéessoustroph. Une faute de frappe sur un nom accentué pouvait donc passer inaperçue. Il lit maintenant le nom entier. - Le quota d'analyse antivirus était lu avant de télécharger la pièce jointe et débité seulement après. Entre les deux, plusieurs fichiers arrivés en même temps lisaient tous « il reste de la place » et se téléchargeaient tous — jusqu'à 50 Mo chacun — pour une seule place réellement libre. Le créneau est maintenant réservé avant la descente et rendu ensuite, donc rien n'est téléchargé pour rien.
- Retirer quelqu'un de la liste blanche antiraid plantait.
+unwl @membreet+antiraid whitelist remove @membrelevaient une erreur au lieu d'agir — mais seulement quand la personne y était vraiment, c'est-à-dire dans le seul cas qui compte. Un membre absent de la liste recevait bien son message d'erreur, ce qui donnait l'illusion que la commande marchait. Corrigé. - Le blindage
+baseréécrivait à la main la liste des dix-sept modules antiraid, à côté d'une liste de référence qui existait déjà. Elle la reprend maintenant, en gardant l'exclusion volontaire de l'anti mass-join. Un module ajouté plus tard sera blindé sans qu'on ait à y penser. +imagesest la commande de lecture la plus chère du bot : jusqu'à douze salons parcourus sur trente pages d'historique, soit environ 360 requêtes. Elle n'avait pourtant que le délai d'attente par défaut de deux secondes, et rien n'empêchait plusieurs personnes de la lancer en même temps. Elle a maintenant son propre délai de trente secondes, et un seul balayage tourne à la fois par serveur — pendant qu'elle travaillait, les sanctions et les alertes attendaient leur tour dans la même file.- À partir de leur deuxième message, les réponses d'une commande perdaient l'en-tête du bot et leur couleur : un refus s'affichait dans le bleu de l'information au lieu du rouge. Trois habillages se superposent sur une réponse, et celui du bouton ⚙️ Menu effaçait son voisin en se retirant. Il ne se retire plus — il n'en avait jamais eu besoin.
- La réinitialisation d'un serveur préserve les protections de base et l'ancrage de la quarantaine — c'était déjà le cas, mais rien ne le vérifiait vraiment : le contrôle rejouait la séquence de son côté au lieu de l'exécuter. Il l'exécute maintenant, et inverser l'ordre de l'effacement le fait échouer.
- Les boutons de l'audit qui accordent la confiance à un membre pouvaient échouer si la liste blanche du serveur avait été abîmée par un import de configuration. Trois endroits lisaient encore la liste sans la protection que les commandes emploient déjà. Ils l'emploient maintenant.
- Le bot ne s'entendait pas avec lui-même sur les durées :
+tempban 1dmarchait,+announce 1détait refusé. Huit endroits lisaient les durées chacun à sa façon, et l'aide anglaise d'+announceannonçait justement1d— un anglophone recopiait l'exemple qu'on lui montrait et se faisait refuser.detjsont désormais acceptés partout, pour toutes les commandes qui prennent une durée. - Si la valeur de l'antibot avait été abîmée — par exemple en recopiant
3/5m, une forme que la commande proposait elle-même en exemple — les écrans du bot ne disaient plus la même chose : la note de protection l'annonçait manquant, le tableau de bord actif, l'assistant proposait de l'activer. Plus grave : Guardian se croyait seul et sanctionnait une seconde fois le bot que l'antiraid venait déjà de traiter. Tout le monde lit maintenant la même valeur. - Quand le compactage automatique de la base échouait, personne n'était prévenu : le message partait dans un journal, et la prochaine tentative n'avait lieu que six jours plus tard. Or un compactage qui échoue échoue souvent encore le lendemain — la base pouvait donc gonfler pendant des semaines en silence. Le propriétaire reçoit maintenant une alerte, avec le nombre d'échecs consécutifs.
- Les réglages chiffrés de l'automodération (sensibilité de l'anti-spam, seuil de mentions) étaient contrôlés à l'écriture mais pas à la relecture. Une valeur hors limites — venue d'une restauration de configuration, ou écrite avant que ce contrôle n'existe — revenait donc telle quelle en mémoire. Les deux appliquent maintenant les mêmes limites, et une valeur aberrante retombe sur le réglage par défaut.
- Retirer un message épinglé automatique (
+sticky off) au moment précis où le bot le reposait pouvait le faire réapparaître, en laissant en plus un message orphelin dans le salon. Le retrait et le repost se marchaient dessus. Ils se relisent maintenant l'un l'autre, et le message de trop est effacé. - Un duel de classement joué pendant la clôture mensuelle de la saison pouvait être perdu — et un joueur disputant son tout premier duel juste après minuit disparaissait du classement. La clôture repartait d'un état lu plusieurs secondes plus tôt.
- Deux membres qui réclamaient leur rôle de couleur personnalisé au même moment : le second effaçait le premier de la configuration. Son rôle existait toujours sur Discord, mais le bot croyait qu'il n'en avait pas — et lui en créait un second au clic suivant, sans jamais nettoyer l'ancien. La même précaution a été posée sur les rôles de podium et les rôles de grade.
- Un écran 📌 Panneau rejoint les réglages de tickets. Il dit dans quels salons tes panneaux sont posés, liste tes types de tickets, et permet enfin d'en retirer un ou de supprimer les panneaux — deux gestes qui n'existaient nulle part ailleurs. Le bouton « Poser le panneau ici » s'y trouve aussi : l'écran des couleurs était plein.
- Le bot retient désormais où il pose ses panneaux de tickets — il jetait cette information jusqu'ici, ce qui rendait impossible d'en retrouver un. Avant d'effacer quoi que ce soit, il exige trois preuves : que le message vienne de lui, qu'il porte bien le bouton d'ouverture, et qu'il soit dans le bon serveur. Un message qui n'est pas un panneau du bot est laissé intact.
- Retirer un type de ticket dit maintenant ce que ça fait aux tickets déjà ouverts : ils restent ouverts et gardent leurs accès, mais leurs journaux et leur transcription de fermeture repartent dans le salon de logs général au lieu de celui du type. Ça se produisait déjà en silence.
- Si l'un de tes types de tickets portait un émoji que Discord n'accepte pas, l'écran des panneaux aurait refusé de s'ouvrir — le bouton aurait simplement paru mort, alors que c'est précisément cet écran qui sert à retirer le type fautif. Il se rouvre maintenant sans les émojis plutôt que de ne pas s'ouvrir.
- Le compte rendu affiché après une suppression de panneau montrait du code au lieu d'une phrase — une syntaxe de pluriel que le bot ne sait pas rendre. Corrigé le jour même de sa sortie.
+temprolemontrait aux serveurs anglophones des durées que le bot refusait : on leur proposait7det2w, ils les tapaient, et le refus leur redemandait exactement ce qu'ils venaient d'écrire. Les deux écritures sont acceptées maintenant, sans rien changer aux durées françaises.- Le message qui refuse un seuil de mentions annonçait « entre 1 et 50 » écrit en dur : changer la limite l'aurait laissé annoncer l'ancienne. Il dit maintenant la limite réellement appliquée.
- Les événements automatiques (pluie d'aura, quick draw) pouvaient tomber n'importe où. Quand le salon désigné avait été supprimé depuis, le réglage restait en base — il avait l'air posé — et le bot repliait sur « le premier salon écrivable venu », c'est-à-dire le premier dans l'ordre interne : souvent le règlement ou l'accueil. C'est le même défaut que les caisses surprise, corrigé pour elles seulement. Les événements passent désormais par le même choisisseur prudent : règlement, annonces, journaux, staff et tickets sont écartés, et faute de vrai salon général le bot se tait au lieu de choisir au hasard.
- Le salon système du serveur garde sa priorité pour ces événements — c'est le « général » implicite de Discord, quel que soit son nom — sauf quand c'est manifestement un salon d'accueil ou de règlement.
- Quand un salon désigné dans les réglages était supprimé, son identifiant restait en base — et une chaîne non vide passe pour un réglage valide. Les replis prévus exactement pour ce cas ne s'exécutaient donc jamais : les annonces de promotion et de rétrogradation ne partaient NULLE PART alors que le salon de logs, deuxième maillon, était vivant. Idem pour les cadeaux vocaux. La cascade regarde maintenant si le salon existe vraiment, pas si le réglage est rempli.
+birthdaycachait son avertissement « aucun salon d'annonce » quand le salon choisi avait été supprimé : le réglage était encore là, donc tout avait l'air en ordre. Le membre enregistrait sa date en croyant qu'elle serait annoncée. L'avertissement s'affiche maintenant dès que rien ne peut réellement être annoncé.- Quand l'antivirus ne peut pas se prononcer sur une pièce jointe — quota épuisé, erreur, fichier trop volumineux — le bot ne supprime rien et ne dit jamais que le fichier est sain. Mais cet avertissement ne partait que dans le salon de logs : sans salon de logs configuré, il n'existait pour personne, et le silence du bot se lisait « rien à signaler ». L'avertissement est désormais posé dans le salon où le fichier a été publié quand aucune destination de logs ne répond — une seule fois par message, même avec cinq pièces jointes. Les serveurs qui ont un salon de logs ne voient aucun changement.
- 95 descriptifs de commandes réécrits pour être compris par quelqu'un qui découvre le bot. Le vocabulaire interne a été retiré partout où il servait d'explication : « derank » devient « retrait de ses rôles de pouvoir », « quarantaine » devient « mise à l'écart, sans bannissement », « self-bots » devient « comptes automatisés ». 146 autres descriptifs étaient déjà clairs et n'ont pas été touchés.
- Trois erreurs de fait corrigées au passage, publiées jusqu'ici sur le serveur de présentation :
+secuannonçait huit protections dont « confiance progressive », qui a été retirée de ce panneau — il y en a sept.+antiraiddisait ses seize protections « à allumer ou éteindre un par un », alors que trois d'entre elles ne s'éteignent jamais. Et+raidignorelaissait croire à une zone franche, alors que l'exception ne porte QUE sur la création et la suppression de salons. - Deux descriptifs affichaient encore des exemples avec l'ancien préfixe
!au lieu de+. - Cibler quelqu'un par son identifiant plutôt que par une mention fonctionnait déjà sur
+blrank,+derank,+warn,+owneret+antiraid whitelist— mais aucune de leurs syntaxes ne le disait, donc personne ne pouvait le deviner. C'est désormais écrit partout :@membre/ID. Utile surtout quand la personne a quitté le serveur et qu'aucune mention n'est possible. - ⛔ La blacklist de rang s'applique maintenant AU MOMENT DU GESTE.
+blrankposait la règle « cette personne ne sera plus jamais promue », mais aucune commande ne la consultait : le rôle était donné, PUIS retiré par l'antiraid, et le modérateur sanctionné pour un geste que rien ne l'empêchait de faire ni ne l'avertissait. Pire, les attributions automatiques — montée de niveau, grades, podium, boutique, rôle de boost — ne passent pas par l'antiraid et rendaient donc en silence ce que+blrankvenait de retirer.+addrolerefuse désormais avant d'agir, avec un message qui dit pourquoi et comment lever la règle. - 🔴 Corrigé : être sur la whitelist antiraid annulait la blacklist de rang, en silence. Signalé en production (« la blrank ne marche pas si un membre blrank reçoit un rôle mis à la main ») et reproduit : la garde confondait les intouchables structurels — le propriétaire du serveur, le bot — avec la whitelist, qui n'est qu'une liste de confiance générale. Une décision prise personne par personne était donc annulée par un réglage posé des mois plus tôt, sans alerte et sans trace. Une décision nominative prime désormais sur une liste générale.
- 🗂️ « Modules récents » a disparu du menu, et c'est une amélioration. « Récent » est une date, pas une catégorie : cette étagère vieillissait toute seule, et dans trois mois personne n'y aurait cherché un filtre de fichiers. Ses six réglages ont rejoint les catégories où on les cherche — extensions de fichiers, rafale et émojis interdits dans Listes de l'automod, réactions automatiques et boosteurs dans Modules, fenêtre de rerank dans Réglages avancés, à côté de l'expiration des warns. Aucun réglage perdu, et les boutons déjà posés continuent de répondre.
- 🔓 Être sur la whitelist ne donne aucun pouvoir, et c'est maintenant garanti. La whitelist dit une seule chose : l'automod et l'antiraid passent leur chemin. Elle n'accorde aucun palier — le calcul des permissions ne la lit jamais, et aucune commande n'est gatée dessus. C'était déjà vrai ; c'est désormais éprouvé à chaque test, parce qu'une propriété vraie par accident se perd en silence.
- 🚨 En lockdown, la whitelist ne protège plus. Le mode MAX la coupait déjà ; le lockdown, non — alors que c'est l'état le plus grave des deux : on ferme le serveur parce qu'une attaque est en cours, et c'est exactement le moment où un compte de confiance compromis fait le plus de dégâts. Le propriétaire du serveur et le bot restent intouchables, et l'exemption revient dès le lockdown levé.
- 📝 La description de
+bls'appelait elle-même « Blacklist rank » — le nom de+blrank. Le routage était correct, mais en lisant+helpon ne pouvait pas distinguer les deux commandes.+bldit maintenant ce qui la distingue vraiment : elle BANNIT au (re)join, là où+blrankne bannit jamais. - 🔴 Corrigé : un membre whitelisté puis blacklisté revenait librement sur le serveur. Le bannissement au retour déférait lui aussi à la whitelist, comme le retrait de rôles corrigé plus tôt. Une décision prise personne par personne prime désormais partout sur une liste de confiance générale.
- 🎟️
+ticketouvre maintenant un écran, plus une page d'aide. Avant, taper+ticketaffichait six étapes numérotées expliquant quoi taper —+ticket role @Staff,+ticket category <id>… Le rôle du staff et la catégorie se règlent désormais par sélecteur, directement sur l'écran, avec le formulaire, les règles, le claim et les panneaux à portée de bouton. Les couleurs des boutons, qui se règlent une fois puis plus jamais, ont leur propre sous-écran — c'est ce qui a libéré la place. Toutes les sous-commandes restent vivantes : c'est un chemin de plus, pas un retrait. - 🤖
+ticketaise règle maintenant sur un écran. Le panneau disait déjà tout — allumé ou non, salon d'apprentissage, taille de sa base — mais il fallait ressortir taper une sous-commande pour changer quoi que ce soit : un tableau de bord qui ne commande rien est un rapport. Le salon se choisit par sélecteur, et quatre boutons allument l'assistant, lui apprennent une réponse, montrent ce qu'il sait et l'essaient à blanc. Le bouton d'allumage reste grisé tant qu'aucun salon n'est choisi — sans lui, une question sans réponse ne va nulle part. - 🔒 Corrigé : quitter le serveur effaçait une quarantaine. Discord ne rend aucun rôle à un membre qui revient — mais l'état de la sanction, lui, survit en base. Partir et revenir était donc une porte de sortie : dix secondes pour annuler une mise à l'écart que le staff n'avait pas levée, pendant que le bot continuait d'afficher la personne comme quarantainée. Au retour, le rôle est remis, l'accès au ticket de contestation est reposé, et la personne reçoit un message privé avec le lien. Une quarantaine que le staff A levée, elle, ne se réapplique pas.
- ⚖️ Le ticket de contestation porte enfin deux boutons de décision, réservés au propriétaire. Il disait « le staff va te répondre » sans donner au staff le moindre moyen de trancher : il fallait sortir du ticket et taper une commande en recopiant un identifiant. « Rendre ses rôles » mène à l'écran de libération — qui garde son vote à deux propriétaires distincts, protection contre un compte owner compromis qu'un bouton neuf n'a pas à percer. « Ne plus jamais promouvoir » agit directement : c'est une décision unique de propriétaire, et elle ne rend aucun pouvoir à personne.
- 🎫 Le ticket de contestation est désormais retrouvable. Il n'existait que dans l'instant de sa création : ni le membre à son retour, ni le staff, ne pouvaient y revenir. Son emplacement est rangé avec l'état de la quarantaine — celui qui survit au redémarrage et au départ.
- ⏳ Un membre en quarantaine est désormais freiné : un message toutes les 3 secondes. Le rôle de quarantaine l'empêchait déjà d'écrire partout sauf dans son salon d'isolement et son ticket de contestation — mais rien ne le freinait dans ces deux endroits, précisément ceux où la personne est en colère et où le staff doit pouvoir lire. Le message excédentaire est supprimé, sans avertissement ni sanction ajoutée : écrire trop vite en contestant une sanction n'est pas un raid, et punir deux fois le même geste serait injuste. Le rappel n'apparaît qu'une fois par minute — sinon le frein deviendrait lui-même le spam.
- 🎫 Contester quand on n'est plus sur le serveur fonctionne enfin. Le message privé « tu as été deranké » propose de contester par ticket — mais l'escalade avait parfois AUSSI expulsé ou banni la personne : on lui créait un salon qu'elle ne pouvait pas ouvrir, et on lui rendait un lien mort. La voie de recours existait sur le papier et nulle part ailleurs. Trois réponses honnêtes désormais : encore membre, rien ne change ; parti ou expulsé, le ticket est créé et une invitation à usage unique l'accompagne ; banni, une invitation ne servirait à rien — on le dit franchement et on l'oriente vers la demande de révision, qui part aux propriétaires par message privé. Et si le bot n'arrive pas à vérifier le bannissement, il ne promet aucun ticket plutôt que d'en promettre un mort.
- 🔕 Le compte propriétaire ne déclenche plus de réveil pour rien. Trois alertes critiques arrivaient coup sur coup sur la couronne — indice de dangerosité, escalade de permissions, dérive de configuration — alors que le bot avait déjà décidé de ne rien annuler : le propriétaire en a le droit, et aucune sanction automatique ne peut le viser. Une alerte dont la réponse est connue d'avance use l'attention qu'on doit aux autres. La trace reste intégralement dans le journal — un propriétaire qui s'octroie des permissions doit rester relisable après coup — mais le ping et le message privé partent. Strictement la couronne : un compte whitelisté qui escalade reste alerté, parce que la whitelist dit « ne le sanctionne pas », jamais « ne me préviens pas ».
- 🧠 Le bouton « Pourquoi ? » ne devient plus muet après un redémarrage. Il répondait « explication détaillée indisponible » sur des alertes encore vivantes et encore actionnables — donc après chaque déploiement. La cause : la surveillance sauvegardait tout (score, statut, rôles retirés, jeton de décision) sauf précisément les deux choses que l'explication lit — les signaux mesurés et le verdict des règles. Les deux sont désormais gardés. Et quand une vieille alerte n'a toujours pas ses signaux, le bot ne se tait plus pour autant : il rend le verdict expert et le score, au lieu de jeter la réponse avec sa note de bas de page. Une IA qui refuse de se justifier cesse d'être vérifiable.
- 🕵️ L'anti-self-bot ne confond plus « rapide » et « automatisé ». Il alertait dès 6 messages en moins de 2 secondes — ce qui décrit quelqu'un qui colle six lignes ou martèle Entrée, pas un compte piloté par du code. Un self-bot ne se reconnaît pas à sa vitesse mais à sa régularité : un script poste toutes les N secondes à quelques millisecondes près, et il le tient ; un humain a des écarts erratiques et il s'arrête. La signature exige désormais les trois à la fois — au moins 8 messages, étalés sur 20 secondes ou plus, avec des écarts réguliers à mieux que 12 %. Une rafale collée, même parfaitement régulière, n'est plus signalée : elle est trop courte. La détection multi-salons (3 salons distincts en 3 secondes), elle, ne bouge pas — un humain ne peut pas taper dans trois salons à la fois.
- ⏳
+blrankaccepte enfin une durée et une raison — et la forme courte.+blrank @membresuffit désormais (le motadddevient facultatif), et+blrank @membre 7j il a revendu son gradebloque sept jours en journalisant le motif et l'auteur de la décision. Sans durée, le blocage reste sans limite comme avant. Le blocage se lève tout seul à l'échéance : un balayage régulier, et une levée immédiate à la première lecture — pour qu'une échéance passée pendant un arrêt du bot ne bloque personne au redémarrage. Une raison qui commence par un chiffre reste entière : le bot ne lit une durée que si le mot en est vraiment une. - ↩️ Nouvelle commande
+unban @membre/ID [raison]. Le bot savait débannir dans cinq situations — un appel accepté, une décision Guardian, une restauration, la fin d'un+tempban, le bouton ↩️ — mais aucune commande ne permettait de le faire à la demande : il fallait attendre l'une de ces cinq voies, ou débannir à la main dans Discord, donc sans aucune trace dans le casier du membre. La commande ouvre un dossier à son nom, et la raison inscrite dans le journal Discord nomme la personne qui a décidé. Elle distingue aussi deux échecs que tout le monde confond : « cette personne n'est pas bannie » et « je n'ai pas pu vérifier » — le second ne débannit rien à l'aveugle. - 🔑
+unbanest au palier propriétaire, et+updateest désormais réservé au propriétaire racine. Débannir renverse une décision de sécurité — au point qu'un module entier existe pour sanctionner ceux qui le font hors du bot : le laisser au niveau Admin l'aurait mis au même rang que le réglage d'un salon de bienvenue. Quant à+update, il met à jour le processus entier, donc les vingt et un serveurs à la fois : « propriétaire » ne suffisait pas, puisque chaque serveur a le sien. - 🔐
+lockdownet+punishétaient annoncées « Owner » sans l'être. Le palier seul ne ferme pas la porte : l'accès est ouvert d'office à quiconque a la permission Administrateur de Discord — c'est une porte de secours voulue, pour les serveurs qui n'ont jamais réglé leurs paliers. Or ces deux commandes n'avaient aucune garde interne : n'importe quel administrateur pouvait verrouiller tout le serveur ou réécrire le barème des sanctions automatiques. Elles sont désormais réservées au propriétaire pour de vrai. - 🎫 Les modérateurs peuvent enfin gérer un ticket en entier.
+closeleur était ouvert, mais+claim,+rename,+addet+removene l'étaient pas : un modérateur pouvait FERMER un ticket sans jamais pouvoir le prendre en charge — la moitié de la fonction d'un côté, l'autre moitié de l'autre. Les cinq gestes sont maintenant au même niveau, et leurs contrôles internes (staff du ticket, ou auteur) continuent de s'appliquer. L'écran de configuration+ticket, lui, reste au-dessus : régler le système n'est pas traiter un ticket. - 📋 Le tableau
+helpalldisait faux, dans les deux sens. Il classait les commandes par leur palier sans jamais lireownerOnly— un marqueur qui prime sur le palier et ferme la commande aux administrateurs. Des commandes qu'aucun admin ne peut lancer s'affichaient donc en « Admin », et deux commandes ouvertes aux admins s'affichaient en « Owner ». C'est précisément l'écran sur lequel on s'appuie pour juger la répartition de ses droits : un tableau de permissions qui se trompe donne une confiance qu'il ne mérite pas. - 🔔 L'alerte « Autoriser / Refuser » proposait un choix déjà tranché. Quand Guardian ouvre une surveillance, il envoie un message privé aux propriétaires avec deux boutons — puis retire les rôles de 3 à 30 secondes plus tard si personne n'a répondu. Aucun humain ne reçoit une notification, la lit et décide en six secondes : le propriétaire découvrait donc un message lui proposant de choisir, alors que les rôles étaient déjà partis, sans que rien ne le dise. Le message est maintenant corrigé dès que le retrait a lieu : il annonce ce qui s'est passé, rappelle que « Autoriser » rend les rôles exactement comme ils étaient, et explique pourquoi le délai est volontairement court — si c'était un raid, attendre coûterait le serveur.
- 🔹 Corrigé : « 🔹 🔹 Palier 4 ». Dans l'écran des permissions, les six paliers au-delà d'owner affichaient leur emoji deux fois — Discord pose l'emoji d'une option à côté de son libellé, et le libellé commençait déjà par le même. Le nettoyage existait dans le dépôt et manquait à cet endroit précis.
- 🔒 Le tableau de bord
+basesait maintenant fermer son propre salon. Quand le panneau est posé dans un salon visible par @everyone, il le signalait — et laissait le propriétaire aller le corriger à la main dans les permissions Discord, c'est-à-dire ailleurs, au moment précis où il vient d'ouvrir son tableau de bord de sécurité. Un bouton Rendre ce salon privé est désormais proposé, réservé aux owners du serveur, et il n'apparaît que là où il sert : sur un salon déjà privé, il serait un bouton qui ne fait rien. Le bot s'accorde l'accès — et te l'accorde — avant de fermer, pour que le panneau continue de se rafraîchir et que personne ne reste dehors. - 💡
+help <commande>donne enfin des exemples. Une syntaxe comme+perm <1-9 ou modo|admin|owner> add <@rôle ou @membre>est exacte et illisible : elle décrit la grammaire, pas l'usage. Un champ Exemples apparaît désormais sur les commandes qui en ont —+perm,+customperm,+blrank,+unbanpour commencer — avec des lignes à recopier telles quelles, et le piège de la commande expliqué en une phrase. Le champ ne paraît que là où il existe : personne n'a besoin d'exemples pour+ping. - 🔑 La fiche d'une commande dit maintenant le palier qu'elle exige. Elle affichait « Selon tes permissions », ce qui ne renseigne personne : la seule façon de savoir était de lancer la commande et de voir si elle refusait. La fiche connaît pourtant le serveur — elle donne donc le palier réellement requis ici, surcharges comprises, et rappelle que
+permmontre qui l'a. - 🎁
+blgwécarte des giveaways,+blticdes tickets — et plus les deux à la fois. Une seule liste privait de TOUT : qui trichait à un giveaway perdait aussi le droit d'ouvrir un ticket, c'est-à-dire le seul moyen de contester. Les deux motifs n'ont rien à voir, ils ont désormais deux listes. L'ancienne liste générale n'est pas touchée et continue de tout couvrir : rien ne change pour qui l'a déjà remplie. - 🛡️ Une exclusion de service n'est pas un bannissement, et le bot le dit. Le message de confirmation rappelle que la personne reste membre, garde ses rôles et continue d'écrire — pour qu'on ne confonde plus
+blgw/+blticavec+blrankau moment de choisir. Le propriétaire du serveur, lui, ne peut pas être écarté de son propre serveur. - ✍️
+blgw 123456789012345678marche comme+blgw @membre. L'identifiant est accepté partout où la mention l'était, y compris quand la personne a déjà quitté le serveur — c'est justement le moment où l'on ne peut plus la mentionner. - 🧹 L'antispam supprime enfin TOUTE la rafale, pas seulement le dernier message. Il retirait exactement le message qui franchissait le seuil : avec le réglage par défaut, quatre messages sur cinq restaient à l'écran, et aucun autre module ne les rattrapait. C'était structurel — la mémoire ne gardait que des horodatages, le bot n'avait aucun identifiant à supprimer. Elle garde maintenant les références des derniers messages, et les efface tous.
- 🔇 Une rafale ne compte plus comme plusieurs fautes. Les messages qui arrivaient pendant la suppression relisaient un compteur encore plein et repassaient par toute la sanction : plusieurs avertissements du bot dans le salon, plusieurs exclusions temporaires, plusieurs strikes pour une seule rafale — de quoi transformer un spam en mute, voire en kick sur un serveur qui a configuré
+punish. Le compteur est maintenant remis à zéro avant toute attente ; pendant les secondes qui suivent, ce qui continue d'arriver est effacé sans être re-sanctionné. - 👁️ Le spam supprimé ne revient plus par
+snipe. Chaque message retiré par l'antispam est désormais marqué comme retrait de sécurité —+snipeest une commande publique, et le filet automatique ne reconnaît pas un spam répétitif. - 🚨 Un antispam muet parce qu'il lui manque une permission le dit maintenant. Dans un salon où le bot n'a pas « Gérer les messages », il ne supprimait rien et n'écrivait nulle part : le propriétaire se croyait protégé. Il reçoit une alerte, une seule par salon toutes les dix minutes. La sanction, elle, tombait déjà et continue de tomber.
- 🛡️ Être whitelisté fait enfin ce que la commande promet : l'automod passe son chemin.
+wlannonçait « exemption totale de la sécurité », et seul l'antiraid la respectait. Le filtre de messages, lui, ne regardait que le statut d'administrateur : un membre whitelisté sans ce rôle était supprimé, muté, puis kické ou banni par l'escalade des avertissements — alors que le propriétaire l'avait nommément déclaré de confiance. - ⚠️ Sauf quand une attaque est en cours. La whitelist ne s'applique ni en mode
max, ni pendant un verrouillage : c'est exactement le moment où un compte de confiance compromis fait le plus de dégâts. Dès que le verrouillage se termine, l'exemption revient d'elle-même. - 👁️ Et une exemption ne crée plus un angle mort silencieux. Si un membre whitelisté poste — ou édite un message en — quelque chose qui ressemble à du phishing, le propriétaire est prévenu sans que rien ne soit supprimé ni sanctionné. La même trace existait déjà pour les administrateurs.
- 🔗 La création et l'édition d'un message partagent désormais UNE seule règle d'exemption. Elles en portaient deux copies, et c'est ainsi que l'édition avait fini par diverger de la création sans que personne ne le voie.
- 🔨
+blbannit vraiment. Il annonçait « sera banni automatiquement s'il (re)joint le serveur » — vrai pour quelqu'un qui revient, faux pour la cible la plus courante : celle qui est déjà là. Elle perdait ses rôles, la liste la contenait, et elle restait sur le serveur à écrire. Elle est maintenant bannie sur-le-champ — et si je n'y arrive pas, je le dis au lieu d'annoncer une porte fermée qui ne l'est pas. - 🌐 Et la portée traverse tes serveurs.
+blbannit désormais sur ce serveur ET sur tous ceux dont tu es owner — en étant la couronne, ou en y ayant été ajouté par+owner. Jamais sur un serveur où tu n'es owner que par ton statut global : un pouvoir jamais accordé serveur par serveur ne doit pas pouvoir vider une communauté. Le propriétaire de chaque serveur, lui, reste intouchable partout. - 🔓
+unbla exactement la même portée. Lever la blacklist débannit, sur les mêmes serveurs. Une levée qui n'aurait valu qu'ici laissait la personne dehors ailleurs, avec un dossier disant qu'elle est pardonnée. - 🏷️ Neuf messages appelaient cette liste « blacklist rank » — c'est le nom d'une AUTRE commande.
+blrankretire les rôles sans bannir ;+blbannit. Les deux portaient le même nom à l'écran, y compris dans le message qui refuse de rendre un rôle à quelqu'un et dans les traces de modération. Chacune dit maintenant la sienne. - 🔑 Le bouton « Rendre ce salon privé » n'enferme plus les autres owners dehors. Il rouvrait l'accès au bot, au propriétaire et à celui qui avait cliqué — et fermait le tableau de bord de sécurité à tous les autres owners du serveur, c'est-à-dire exactement les gens à qui ce bouton est réservé.
- 🔓 Libérer quelqu'un de quarantaine ne rend plus un rôle que le bot reprend dans la seconde. Le compte-rendu annonçait « 1 rôle rendu », puis l'antiraid le retirait aussitôt parce que la personne était sur
+blou+blrank: deux décisions du propriétaire se contredisaient, et l'écran affichait la perdante. La question est maintenant posée AVANT, aucun rôle n'est posé pour rien, et le compte-rendu dit lesquels sont retenus — avec la commande exacte qui les débloque. - 🧹 L'anti-doublon de salons ne te demande plus ton avis pour un travail déjà fait. Il retirait déjà tout seul les doublons vides dont il peut prouver qu'il les a créés — mais le rapport disait l'inverse (« il ne supprime jamais un salon de lui-même ») et proposait un bouton, y compris quand il ne restait QUE des salons qu'aucun clic ne peut légitimement retirer. Le texte dit maintenant ce qui se passe vraiment, et le bouton n'apparaît plus que dans le seul cas où la question a un sens : un doublon épargné parce qu'il contient des messages humains.
- 🚨 Un modérateur pouvait bannir quelqu'un placé au-dessus de lui en ajoutant un point.
+banet+tempbannettoyaient la cible en retirant tous les caractères non chiffrés :<@ID>.,IDxou"ID"échappaient au résolveur — donc au contrôle de hiérarchie — puis redevenaient un identifiant valide. L'identifiant doit maintenant être écrit exactement, et la présence de la cible est revérifiée avant d'agir. - 🔐
+importconfigne remettait plus tes paliers de commandes par défaut. Sur les quatre tables de permissions, une seule était copiée d'un serveur à l'autre : un serveur ayant durciban/kick/tempbanles voyait revenir au défaut, sans un mot. - ⭐ Un message que le tableau des étoiles n'arrivait pas à publier n'est plus perdu en silence. L'échec est journalisé, et la réservation n'est libérée que sur un refus certain — jamais sur un délai d'attente, qui republierait en double.
- ⏱️ Sept appels sortants sans délai d'attente sont bornés. Analyse de fichiers et surveillance : un service distant qui ne répond jamais ne peut plus retenir la tâche indéfiniment.
- 📖 Le serveur de présentation est à jour. Les 242 commandes publiques y figurent —
+blgwet+blticcompris — et les explications disent les nouveautés : la rafale de spam qui part en entier, la whitelist qui esquive vraiment l'automod,+blqui bannit sur tous tes serveurs, et la libération de quarantaine qui ne promet plus un rôle repris aussitôt. - 🎭
+makeitmemeétait annoncé à tout le monde et refusé à tout le monde. Le catalogue des jeux le désignait par son aliasmemegame; le bot, lui, résout l'alias vers le vrai nom AVANT de juger le droit — et ce vrai nom n'était dans aucune table, donc réservé aux administrateurs. Le contrôle censé empêcher exactement ça était aveugle pour la même raison : il mesurait l'alias. - 🎫 Les modérateurs peuvent enfin gérer un ticket en entier, pour de vrai. Le lot précédent l'annonçait sans le faire : « Gérer les messages » ouvrait
+closeet rien d'autre, parce que les quatre autres gestes n'étaient pas dans la table qu'une permission Discord ouvre. Mesuré avant/après :+claim,+rename,+addet+removepassent maintenant comme+close. - 📚 Le serveur de présentation a une RÉFÉRENCE complète. Une fiche par commande — les 242 — avec sa description, chacune de ses façons de s'écrire, chaque paramètre (obligatoire ou non, valeurs acceptées), ses sous-commandes, ses autres noms et le palier requis. Plus un index alphabétique A→Z : on n'a plus à deviner la famille d'une commande pour la trouver. Tout est dérivé du registre réel, rien n'est écrit à la main.
- 🔇 Et les coulisses ne s'affichent plus aux visiteurs. Les salons de service du serveur de présentation sont fermés à
@everyone— sauf la salle des trophées, les jeux et les suggestions, qui montrent le bot à l'œuvre. - 🚨 Répondre à un message pouvait faire viser la mauvaise personne — sur quatre commandes. Discord place l'auteur du message auquel on répond en tête des mentions.
+undo,+purge,+cmdpermet+del permlisaient cette mention AVANT l'identifiant tapé : la commande agissait donc sur la personne à qui l'on répondait. Le cas le plus grave :+undo <attaquant>tapé en réponse à mon alerte débannissait en masse les comptes que l'antiraid venait d'écarter. L'identifiant tapé prime maintenant partout, et une nouvelle barrière empêche toute commande qui AGIT de retomber dans ce piège. - 🔐
+temprolepouvait servir à s'élever. La commande ne vérifiait que la hiérarchie du BOT, jamais celle de la personne qui la tape : un membre placé au palier admin, sans aucune permission Discord, pouvait s'attribuer à lui-même un rôle situé tout en haut du serveur. Elle emploie désormais le même contrôle que+addrole. Le propriétaire du serveur, lui, n'est toujours pas limité. - 🛡️ Et
+undorefuse maintenant de viser la défense. Annuler mes propres bannissements, ou ceux d'un owner du serveur, n'a jamais été une annulation de raid — c'est défaire le travail qui vient d'être fait. - ⚡ Le bot lit sa configuration douze fois plus vite. Le cache gardait ses entrées sous une clé composée à la volée (
serveur:réglage) : à chaque lecture, cette chaîne devait être fabriquée puis hachée — dix-huit fois par message. Elle est maintenant rangée à deux niveaux, sans aucune chaîne intermédiaire. Mesuré sur le banc, six passages entrelacés : 39,4 → 33,7 µs par message. - 🔒 Sous un raid, la zone de quarantaine ne se crée plus en plusieurs exemplaires. Chaque arrivée déclenchait sa propre création : trois arrivées simultanées faisaient trois rôles et trois salons, dont un seul était enregistré. Les membres isolés par les autres devenaient invisibles au bot — non ralentis, et surtout sans plus aucune voie de recours, le bouton de libération leur répondant qu'ils n'étaient pas en quarantaine.
- 🔍 L'alerte « l'IA n'était pas d'accord » dit enfin POURQUOI — et arrête d'accuser ton staff. Elle donnait un pourcentage, signé du nom de ton serveur, alors que le compteur agrège les décisions de tous les serveurs que je protège : tu lisais, devant ton staff, un taux produit ailleurs. Le texte le dit maintenant franchement, et précise que la moitié des décisions comptées vient de mes modules automatiques, pas d'humains. Cinq champs expliquent l'écart : le sens des erreurs, l'état de mon apprentissage (s'il est gelé, attendre ne réglera rien), la santé de mon modèle de référence, l'accord habituel auquel comparer, et les décisions que je n'avais pas le droit d'apprendre.
- 🇬🇧 Deux écrans de Guardian restaient en français sur un serveur anglophone. Le bloc « signaux du modèle » de l'alerte et l'écran « Pourquoi ? » oubliaient de passer la langue du serveur.
- 🎫 Un émoji de trop ne fait plus disparaître ton panneau de tickets. L'émoji d'un type de ticket est ce que ton staff tape : s'il n'était pas d'une forme que Discord accepte, le panneau d'ouverture ne se construisait pas du tout — et sans un mot. Le bouton perd désormais son émoji, jamais le panneau son existence.
- 🧹 La vraie cause des salons de logs en double. Quand je vois mon salon de logs supprimé, j'en recrée un — mais c'était le seul de mes six chemins de création qui oubliait d'inscrire « c'est moi qui l'ai fait ». Or mon nettoyeur de doublons refuse, par principe, de supprimer un salon dont il ne peut pas prouver l'origine : je fabriquais donc un doublon que je m'interdisais ensuite de nettoyer, pour toujours. Mesuré : quatre serveurs concernés. C'est corrigé à la source, et une barrière vérifie désormais que tout salon que je crée déclare son origine — sauf ceux que je ne fais que restaurer, qui appartiennent au serveur et que je n'ai pas à pouvoir supprimer.
- 📖 Le serveur de présentation dit maintenant les PARAMÈTRES de chaque commande. Sous chaque commande, la syntaxe — et sous la syntaxe, chaque paramètre séparément : ce qu'il accepte, et s'il est obligatoire ou non. Les 242 commandes publiques y sont, dans les douze salons de sujet et nulle part ailleurs : la catégorie séparée que j'avais ajoutée faisait doublon avec eux, elle est retirée.
- 🔗 Mes défenses se parlent enfin. J'ai un état de menace partagé : un module qui repère une attaque élève le niveau, et les autres se renforcent tout seuls. Dix modules le LISAIENT, quatre seulement l'élevaient — et aucun des six détecteurs ajoutés ces deux dernières semaines. Six détections neuves, six silos. Ils sont branchés, chacun au bon palier : une vague de messages identiques dit « attaque en cours » tout de suite, une cohérte d'arrivées lente dit seulement « quelque chose cloche » — elle durcit les seuils sans jamais faire sanctionner. Et pour les comptes trop jeunes, c'est l'accumulation qui parle : un refus ne dit rien, trois en huit minutes disent une vague.
- ⚙️
+fichiers spamet+antispamne peuvent plus diverger. Les deux se règlent enn/t— « n en t secondes » — et chacun vérifiait cette forme de son côté, avec ses propres bornes recopiées à la main. Mesuré : les deux disaient exactement la même chose sur douze cas limites, ce qui est l'état d'une copie qui n'a pas ENCORE divergé. Une seule définition désormais — et si tu changes une borne, les deux commandes suivent. - 🎭 Un membre bloqué de rang ne reçoit plus ses récompenses par la petite porte.
+blrankdit « cette personne ne sera plus jamais promue » — mais les attributions AUTOMATIQUES (montée de niveau, grades, podium mensuel, rôle de boost, rôle d'arrivée, champion) lui rendaient en silence ce que la commande venait de lui retirer. Neuf modules, vingt-deux attributions, zéro vérification. Elles demandent maintenant la permission, et un refus se voit dans les journaux au lieu de disparaître. Le rôle de quarantaine, lui, reste toujours posable — sinon on ne pourrait plus isoler quelqu'un précisément parce qu'il est déjà sanctionné. - 🔒 Le bouton « Ne plus jamais promouvoir » empêchait ensuite de mettre la personne en quarantaine. Mon antiraid retire tout rôle donné à quelqu'un de bloqué — y compris, sans le vouloir, le rôle d'isolement lui-même. La personne était donc enregistrée « en quarantaine », le panneau l'affichait enfermée, et elle ne l'était pas du tout : elle continuait de voir et d'écrire partout. Le geste le plus dur du parcours désactivait la capacité d'isoler. C'est corrigé, et le rôle de privilège, lui, est toujours retiré.
- 🤖 Cocher « Anti-bot ajouté » ne bannit plus tes bots vérifiés. La case écrivait le mode STRICT — qui expulse tout bot non whitelisté, même vérifié par Discord — alors que
+antibot onécrivait le mode intelligent, et que le texte sous la case promet que « les bots vérifiés passent ». Même intention, deux résultats opposés. Pire : l'auto-escalade réécrivait le mode strict par-dessus ton réglage, toute seule, à la première vague d'arrivées. Les cinq portes écrivent maintenant la même valeur que la commande. - ⚖️ Retirer un rôle à tout le monde obéit enfin aux mêmes règles que le retirer à une personne.
+massrolerefusait d'AJOUTER un rôle placé au-dessus du tien — et acceptait de le RETIRER à tout le serveur, sans contrôle et sans alerte, là où+delrolete le refuse sur une seule personne. Le geste le plus destructeur des trois était le seul à ne rien vérifier. - 🏆
+levelrolene sert plus à s'élever. Un rôle-récompense voit ses permissions dangereuses retirées — mais un rôle à zéro permission placé tout en haut du serveur met quand même son porteur au-dessus de ton staff. La commande ne regardait que MA hiérarchie, jamais celle de la personne qui la tape : un délégué pouvait se poser un tel rôle, rétroactivement, et devenir intouchable par tes modérateurs. Même contrôle que+addroledésormais. - 💸
+importconfigne transporte plus les dettes d'un serveur à l'autre. À une lettre près, deux clés étaient inversées : le RÉGLAGE du système de dettes ne se copiait pas, et le REGISTRE des dettes par membre, si. Quelqu'un devait donc 5 500 aura sur un serveur où il n'avait jamais rien emprunté — et chacun de ses gains y était absorbé à 100 %. C'est l'inverse maintenant, comme le fichier le promettait déjà. - 🤖 Antibot intelligent — les usurpateurs de gros bots : un bot qui porte le nom d'un bot connu (MEE6, Dyno, Carl-bot, Wick, Ticket Tool…) mais qui arrive sous un autre identifiant est banni à l'entrée, même s'il écrit son nom en caractères cyrilliques pour tromper l'œil. Le vrai bot, lui, entre normalement.
- 🤖 Déclare tes propres bots officiels — *propriétaire du serveur uniquement* :
+antibot officiel <nom> <id>enregistre l'identifiant légitime d'un bot moins célèbre. Ensuite, tout bot du même nom arrivant sous un autre identifiant est refusé.+antibot officiel listemontre le registre,+antibot officiel del <nom>retire une entrée. La lecture est fermée elle aussi : cette liste dit à un attaquant quels identifiants il lui suffirait d'usurper. - 🤖 Un sosie ne passe pas, même vérifié par Discord : un bot qui porte le nom d'un bot connu sous un autre identifiant est banni à l'entrée, badge officiel ou pas. Un attaquant qui obtient la vérification pour un bot nommé « MEE6 » n'en est que plus dangereux — la règle est sans exception, et c'est ce qui la rend incontournable.
- 🛡️ Correction —
+antiraid all onmettait l'antibot en mode strict : la bascule globale écrivaitondans tous les modules, ce qui pour l'antibot signifie strict (bannir tout bot non whitelisté à l'entrée) alors que+antibot onsignifie intelligent. Deux formulations du même geste donnaient deux modes opposés.+antiraid all onallume désormais chaque module dans SON mode allumé. - 🎚️ La carte de montée de niveau ne part plus en plusieurs exemplaires : quand l'image mettait trop de temps à monter, Discord la recevait quand même mais le bot croyait avoir échoué — il renvoyait la carte jusqu'à quatre fois, et ajoutait l'annonce de secours par-dessus. Une annonce peut désormais être perdue, mais plus jamais répétée.
- 🎮 Le tableau des jeux ne laisse plus de classements orphelins : le rafraîchissement automatique pouvait poster plusieurs copies du classement, dont une seule continuait d'être mise à jour — les autres restaient là pour toujours. Le bot cherche maintenant son propre tableau dans le salon avant d'en poster un nouveau, et l'adopte s'il le retrouve.
- 🎫 Transfert de ticket : la cible est jugée par la même règle que toi : « est-ce du staff de ticket ? » se posait à deux endroits avec deux réponses écrites séparément. Celle qui jugeait la personne à qui tu transfères était la plus fragile — elle pouvait faire échouer le transfert sans message au lieu de refuser proprement.
- 🧩
+customne crée plus de commande morte-née : si ton mot-clé était déjà un raccourci vers une commande du bot — un alias (duelmène à+bang,eventsà+autoevents) ou un début de nom unique (levelrmène à+levelrole) — la commande personnalisée était acceptée, annoncée « créée », visible dans+custom list… et ne répondait jamais, parce que le bot résolvait le raccourci avant de la regarder. Elle est maintenant refusée, en te disant quelle commande occupe le mot. Même contrôle à l'import depuis un autre serveur. - 🧪 L'antivirus ne dit plus « fichier supprimé » quand il n'a pas pu le supprimer : VirusTotal met parfois deux minutes à rendre son verdict. Sur ce chemin-là, l'alerte annonçait la suppression avant de la tenter — si elle échouait (permission retirée, salon en lecture seule), le staff lisait « 🔴 DANGEREUX — fichier supprimé » pendant que l'exécutable restait téléchargeable, et personne n'allait le chercher. Le bot supprime d'abord, annonce ensuite ce qui s'est réellement passé, et prévient les responsables en urgence quand le fichier est toujours là.
- 🧪 Le verdict de l'antivirus n'est plus perdu en route : quand VirusTotal mettait plus de deux minutes, ou quand le quota de l'antivirus était momentanément plein, l'alerte restait sur « 🟡 Analyse en cours » pour toujours — sans qu'on puisse savoir si le bot attendait encore ou avait renoncé. Le bot patiente maintenant jusqu'à douze minutes, ne gaspille plus ses tentatives quand il n'a pas pu joindre VirusTotal, et dit clairement qu'aucun verdict n'est arrivé — avec le lien du rapport et un rappel que le fichier n'a pas été supprimé.
- 🛡️ Un rôle restauré après un nuke ne repart plus avec les droits de @everyone : quand un attaquant supprime un rôle Administrateur, Discord interdit au bot de le recréer à l'identique. Le bot repliait alors sur une création simplifiée — et l'API donne à un rôle créé sans permissions explicites celles de
@everyoneau moment de la création. Le jour où@everyoneest resserré (+lockdown, mode raid), ses porteurs gardaient les droits d'avant, sous un nom que tout le monde croit connaître. Le rôle est désormais recréé vide de droits, et l'alerte te dit clairement qu'il faut remettre ses permissions à la main. - 🧹 Le rapport anti-doublon ne disparaissait plus qu'il n'était long : Discord refuse un message dont les encadrés dépassent 6 000 caractères au total — et il refuse le message entier, en silence. Sur un serveur avec beaucoup de doublons et des noms de salon longs, le rapport atteignait 6 181 caractères et n'arrivait donc jamais : plus il y avait à signaler, moins on voyait quelque chose. Il est maintenant raccourci proprement, et il dit combien de sections n'ont pas pu être affichées.
- 🧩 Une commande personnalisée trop garnie n'est plus muette : un embed rempli à fond (titre, description, pied de page et cinq champs) pouvait atteindre près du double de la taille maximale d'un message Discord. La commande ne répondait alors plus rien du tout, sans le moindre message d'erreur — et c'était indevinable, puisque chaque champ pris séparément était accepté par l'écran de réglages. Elle répond désormais, en retirant les derniers champs si nécessaire.
- 🛡️ Un verrouillage antiraid pouvait ne plus jamais se lever : le verrouillage automatique est déclenché à chaque arrivée dès que le seuil est franchi — donc en rafale pendant un raid. Deux déclenchements simultanés et le second enregistrait comme « état d'origine » celui que le premier venait de poser : à l'échéance, le serveur restait en vérification haute et invitations coupées, définitivement, alors que le verrouillage devait durer quelques minutes.
- 🛡️ Le bouclier de raid ne laisse plus le salon d'accueil ralenti pour toujours : en montant au niveau 2, il pose un ralentissement sur le salon système et mémorise la valeur d'avant pour la rétablir. Deux montées simultanées et la valeur « d'avant » mémorisée devenait celle de la crise — le ralentissement ne partait donc jamais.
- 🚨 Lever le siège (
+panic) ne peut plus effacer un siège tout juste réengagé : la levée rouvre les salons un par un, ce qui prend un moment sur un gros serveur. Si quelqu'un réengageait le siège pendant ce temps, la levée effaçait en terminant l'état du nouveau siège — le serveur restait verrouillé sans que rien ne sache comment le rouvrir. Une seule levée tourne désormais à la fois, et elle n'efface que l'état qu'elle a elle-même lu. - ⛔ Un blocage de rang expiré ne sanctionne plus le modérateur qui rend le rôle :
+blrank @membre 1hpose bien une durée, mais la surveillance des rôles ajoutés lisait la liste sans jamais regarder les échéances. Pendant la fenêtre entre l'expiration réelle et le balayage (jusqu'à 10 minutes), rendre son rôle à la personne déclenchait encore une alerte et une sanction contre le modérateur — puni pour avoir fait exactement ce que la fin du blocage venait de l'autoriser à faire. - 🔎 Une anomalie de sécurité ne se perd plus sur un MP fermé : l'audit des règles de Guardian te signale ce qu'il trouve d'incohérent, et le message privé est sa seule façon de parler. Il marquait pourtant l'anomalie « signalée » avant d'envoyer, et l'envoi avalait ses échecs : un seul MP refusé (messages privés fermés, bot bloqué, compte injoignable) et l'anomalie était classée comme vue — pour toujours, sans que personne ne l'ait lue. Elle est maintenant marquée uniquement quand le message est réellement parti, et retentée sinon.
- 📖 Six messages du bot renvoyaient vers des commandes qui n'existent pas : « quarantaine » (la vraie est
+quarantine), « casier » (ce sont+caseet+history), « unwarn » (c'est+sanctions del <id>), « harden » (c'est le bouton 🛡️ Blinder du panneau+base), « bye », et « doublons » — ce dernier inexistant par conception, le balayage anti-doublon étant automatique. Un message d'aide qui envoie dans le vide est pire que pas d'aide : on en conclut que le bot est cassé, pas la phrase. Tous corrigés, et un contrôle empêche désormais qu'un nouveau se glisse. - 🔑
+permsalon listcassait net sur une configuration bien remplie : au-delà de 4 096 caractères, l'affichage lève une erreur avant même d'avoir construit son message — la commande ne répondait plus du tout, sans le moindre avertissement. Chaque entrée pouvant porter dix rôles, une configuration complète atteignait 7 474 caractères : autrement dit, plus tu te servais de la commande, moins elle marchait. Elle répond désormais toujours, et dit combien d'entrées ne tiennent pas. - 📋 Quatre autres listes ne peuvent plus déborder : les anniversaires, la liste des soutiens, les salons verrouillés et le tableau des jeux affichaient une liste plafonnée en nombre de lignes, jamais en longueur — un pseudo ou une raison un peu longs et l'encadré entier disparaissait. Toutes sont bornées.
- 🎯 Trois commandes visaient la mauvaise personne quand on les tapait en réponse :
+nukeadd,+noteet+reranklisaient la mention avant l'identifiant écrit — or répondre à un message ajoute son auteur aux mentions, en tête. Le plus grave était+nukeadd, qui remplit la liste autorisée à lancer+nuke:+nukeadd del <id>tapé en réponse retirait quelqu'un d'autre et laissait la personne visée autorisée. Les trois passent désormais par le résolveur commun : l'argument prime toujours, la mention n'est qu'un repli. - 📺 Les réglages « créateurs » ne sont plus écrasés par une version périmée : le suivi des chaînes YouTube lisait toute ta configuration, partait chercher le flux (jusqu'à 8 secondes d'attente réseau), puis réécrivait tout à partir de la version d'avant. Ajouter un créateur, changer le salon d'annonce ou régler la mention pendant ce laps de temps était silencieusement annulé — et le balayage ouvre cette fenêtre huit fois par cycle. Les annonces partent aussi avec le salon et la mention relus, plus ceux d'il y a huit secondes.
- 🎚️ Deux personnes peuvent enfin configurer les paliers de niveau en même temps :
+levelrole addlisait la table des récompenses au début de la commande et la réécrivait après avoir neutralisé les permissions du rôle — un vrai appel réseau. Le palier enregistré par quelqu'un d'autre pendant cet intervalle disparaissait sans un mot. - 🏆 La salle des trophées ne peut plus rester figée pour toujours : le tableau mémorise une empreinte de ce qu'il a publié pour ne pas se réécrire inutilement — mais il l'enregistrait même quand Discord avait refusé la modification. Le tableau se croyait alors à jour et ne se réparait plus jamais tant que le palmarès ne bougeait pas. L'empreinte n'est désormais gravée que si la modification est réellement passée.
- 📊
+setstats offne dit plus « supprimés » quand les salons sont toujours là : la liste de suivi était vidée même si Discord avait refusé chaque suppression — les salons compteurs restaient en place et cessaient d'être suivis, donc plus jamais mis à jour ni nettoyables. Le bot ne cesse maintenant de suivre que ce qu'il a réellement supprimé, et te dit combien il n'a pas pu retirer. - 🎯 Le défi quotidien n'efface plus les parties jouées pendant sa clôture : à minuit, le bot distribue le podium (une requête réseau par vainqueur et par participant) puis remet le tableau à zéro — à partir de l'état lu avant ces requêtes. Quelqu'un qui jouait pendant ce laps de temps voyait sa partie effacée et sa série repartir de zéro. C'était le pire moment possible : minuit est justement l'heure où l'on joue pour ne pas casser sa série.
- 🎪 Le gala hebdomadaire ne s'annonce plus deux fois : le marqueur « annonce faite » n'était posé qu'après avoir servi tous les serveurs inscrits, un par un. Le balayage repasse chaque minute et la fenêtre d'annonce dure trente minutes — un second passage pouvait entrer pendant le premier et tout renvoyer. La branche du quiz avait son verrou depuis toujours ; celle de l'annonce, aucun.
- 🧩 Les boutons des commandes personnalisées sont enfin soumis au même garde-fou que les commandes tapées : un clic déclenchait la commande enchaînée sans aucune limite de cadence, alors que taper la même commande était limité depuis toujours. Or une commande personnalisée peut poser un rôle, envoyer un message privé ou publier dans un salon — cliquer en rafale, c'était un risque de blocage de Discord sur tout le bot, tous serveurs confondus, et un moyen de harceler quelqu'un. Trois secondes entre deux clics, avec les mêmes exemptions que partout (propriétaire, administrateurs).
- 🔒
+snipene peut plus republier une commande de modération supprimée : le bot sait reconnaître une commande pour l'exclure de+snipeet du journal — mais il ne connaissait que deux des trois façons de l'invoquer. Les raccourcis (+lockwpour+lockword,+tempbpour+tempban,+purgpour+purge…) passaient pour des messages ordinaires : 1 411 raccourcis au total. Concrètement, un responsable qui déclenchait le mot de panique voyait son message effacé pour le cacher — et n'importe quel membre pouvait ensuite le relire avec+snipe, qui est une commande publique. Corrigé, et « +1 pour pizza » reste bien un message ordinaire. - 🛡️ Le niveau du bouclier de raid ne redescend plus tout seul en pleine vague : deux montées simultanées et celle qui finissait en dernier imposait son niveau, même plus bas — le serveur affichait « niveau 2 » après avoir alerté « Alerte maximale », et le retour au calme démarrait un cran trop tôt.
- 🔒 Une purge de harcèlement ne peut plus être republiée par
+snipe: quand l'automod effaçait une vague de mentions de masse, il supprimait en bloc — et le rappel des messages supprimés, qui est une commande publique, en réaffichait jusqu'à trois extraits. La purge faite pour retirer le harcèlement le remettait donc sous les yeux de tout le monde. Deux verrous désormais : l'automod marque chaque message avant de l'effacer, et le rappel refuse d'afficher un message marqué, y compris dans une purge en bloc — ce qui couvre aussi+purgeet+clearquand ils visent quelque chose de dangereux. - ↩️
+rerankne rend plus des rôles que le bot retire dans la seconde : la commande refusait déjà un membre sur la blacklist (+bl) et un membre en quarantaine, mais elle ignorait+blrank— qui interdit pourtant exactement la même chose. Les rôles partaient, la surveillance les retirait aussitôt, et la commande annonçait « 3 rôles rendus ». Elle pose maintenant la même question que tout le reste du bot, ce qui lui apprend au passage à respecter les durées : un+blrank 1harrivé à terme ne bloque plus rien. - 🔐 Le mode incident n'affaiblit plus la porte d'entrée des serveurs les plus stricts :
+panicposait la vérification sur « Élevée » sans jamais regarder où elle était. Sur un serveur réglé au cran au-dessus — celui qui exige un téléphone vérifié — il l'abaissait donc, en annonçant « vérification poussée au maximum ». Au pire moment possible, l'écran disait l'inverse de ce qui se passait. Il compare maintenant, ne redescend jamais, et sait le dire : « déjà plus stricte — laissée telle quelle ». - 🛡️
+automodaffichait « 🔴 Désactivé » en face d'un filtre anti-arnaque qui tournait : le tableau lisait le réglage brut, or une clé jamais réglée à la main ne veut pas dire « éteint » —antiscamest allumé d'office. Tout serveur n'y ayant jamais touché lisait donc que sa protection contre les liens piégés était morte, alors qu'elle travaillait. Le tableau interroge désormais la même source que le bot lui-même. - 🎫 Deux boutons du même message privé ne se contredisent plus sur la quarantaine : « contester » et « demander une révision » posent la même question — es-tu encore isolé ? — et répondaient l'inverse. Le premier s'en tenait à la liste mémorisée, qui est bornée dans le temps et en taille ; le second retombait sur le rôle. Une personne dont l'entrée avait été évincée restait donc porteuse du rôle d'isolement et privée de recours, sur un bouton qu'on venait de lui envoyer. Le rôle fait foi, pour les deux.
- 🤖 Le défi anti-bot promettait une attente qui n'existait pas : après six mauvaises réponses il annonçait « patiente un peu puis reclique sur Se vérifier ». Il n'y avait rien à attendre — le clic suivant servait un défi neuf avec le compteur d'essais remis à zéro, remis à zéro par celui-là même qu'il compte. Un bot pouvait tirer indéfiniment, et il n'avait même pas besoin d'aller jusqu'à six : cinq échecs puis un reclic suffisaient à ne jamais déclencher ni le verrou, ni l'alerte aux propriétaires, ni le signal d'apprentissage. Le verrou existe maintenant pour de bon (10 minutes, que le bouton ne peut pas lever), le compteur survit au reclic, et un humain qui revient plus tard repart proprement à zéro.
- ⚖️
+permsalondéléguait un bannissement sous le nom d'un avertissement :+warnfigurait dans la liste fermée des commandes délégables par salon, rangée avec le « suivi de modération » comme si elle ne faisait qu'écrire au dossier. Elle déclenche une échelle : 3 avertissements rendent muet, 5 expulsent, 7 bannissent. « Avertir, mais seulement dans #giveaway » revenait donc à donner le pouvoir de bannir n'importe quel membre situé plus bas, en sept commandes — et rien à l'écran ne le laissait deviner. Ce module exclut pourtant, par doctrine écrite, les sanctions qui visent une personne et tout ce qui porte plus loin que le salon.+warnest retirée, et un contrôle automatique interdit désormais d'y inscrire toute commande qui déclenche cette échelle. - 📋 L'état de
+permsalonne montre plus des délégations qui ne donnent plus rien : la liste des commandes délégables se resserre parfois, et le contrôle d'usage en tient compte immédiatement — mais l'écran, lui, relisait les anciennes lignes comme si elles valaient encore. Une délégation retirée de la liste s'affiche désormais « ne s'applique plus », avec la raison et comment la retirer. - 📝 La fenêtre d'édition des listes supprimait ce qu'elle n'affichait pas : les mots interdits et la whitelist antilink s'écrivent depuis deux endroits — la commande (
+badword,+linkwl) et le bouton « Modifier la liste » de+setup— et chacun avait son propre plafond, sans connaître celui de l'autre.+badword addacceptait 500 mots, la fenêtre en réécrivait 200 : l'ouvrir sur une liste de 300 et valider en supprimait cent, sans un mot.+linkwl addn'avait, lui, aucun plafond, tandis que la fenêtre en réécrivait cent. Une liste n'a plus qu'un seul plafond, lu par les deux portes. - 🪟 Et le bouton « Modifier la liste » ne reste plus muet sur une longue liste : le champ de saisie de Discord est borné à 1 800 caractères, et au-delà la fenêtre était refusée — un refus avalé en silence, donc un bouton qui ne faisait littéralement rien, sans erreur ni explication. Il dit maintenant pourquoi, et renvoie vers
+badword/+linkwl, qui modifient entrée par entrée sans jamais réécrire l'ensemble. - 🧱 Le panneau des permissions disparaissait quand il y avait trop à montrer : chaque champ d'un embed est borné à 1 024 caractères par Discord, et le dépassement lève une erreur avant l'envoi — impossible à rattraper. Une mention de rôle pèse 22 caractères : quarante-cinq rôles rangés sur un même palier suffisaient à ce que l'écran ne s'affiche plus du tout, sans message, sans erreur. Mesuré en rejouant le défaut : zéro champ rendu. C'est précisément le serveur qui a le plus besoin de relire ses paliers qui ne le pouvait plus. La liste est maintenant coupée proprement, et le nombre de rôles non montrés est annoncé — une coupe muette ferait lire un palier amputé comme un palier complet.
- 🧹 Du code mort qui décrivait des garanties, retiré — après avoir prouvé que les garanties tiennent : deux commandes (
+note,+nukeadd) gardaient chacune une copie du contrôle « ceci est-il un vrai identifiant Discord ? », plus relue depuis que ce contrôle a été confié au résolveur commun. Un motif mort qui décrit une garantie fait croire au lecteur suivant que c'est lui qui la tient. Retiré, et la garantie est désormais éprouvée là où elle vit vraiment :+note add 5,+nukeadd 5et<@5>ne désignent toujours personne. - 🛠️ Une coquille dans le nom d'un service n'aboutira plus à une liste éternellement vide :
+blgwet+blticpartagent un corps commun qui traduit un nom de service en clé de configuration. Sur un nom inconnu, il renonçait en silence — la liste se lisait vide, l'ajout répondait « ajouté ✅ » sur une écriture qui n'avait pas eu lieu, et rien ne l'aurait signalé jusqu'au jour où on aurait compté sur cette liste. Le bot refuse maintenant de construire une telle commande, en nommant la faute. - 🔍 Le bouton « Pourquoi ? » de Guardian ne répond plus au membre qu'il surveille : ce bouton vérifie l'identité avant de rendre le dossier d'une alerte — sauf sur la réponse *partielle*, celle servie à toute alerte rechargée après un redémarrage. Cette branche répondait avant le contrôle, donc à n'importe qui, y compris à la personne visée. Elle ne montre pas les signaux bruts, mais elle montre son pseudo, son score de dangerosité et le verdict expert — c'est-à-dire quelles règles se sont déclenchées, autrement dit la notice pour passer sous le seuil au prochain essai. Sur un serveur au salon de logs public, n'importe qui lisait aussi la fiche de n'importe qui. Le contrôle passe désormais avant les deux réponses.
- 🔒 « Plus jamais promu » tenait enfin sa promesse partout :
+blrankbloque les promotions, et un module central existe pour faire respecter cette règle sur les attributions automatiques. Son propre en-tête nommait six sources à couvrir — mesuré : les grades, le podium, le rôle de boost, l'autorole et l'autorank la consultaient bien ; la montée de niveau, l'achat en boutique et le menu de rôles, non. Ni le rattrapage rétroactif des rôles de niveau, ni les commandes personnalisées. Il suffisait donc de gagner un niveau, de cliquer un bouton de menu, de payer en aura, ou de faire taper une commande perso pour récupérer ce que le blocage venait de retirer. Les cinq chemins consultent désormais la même règle, et le refus se voit : le menu dit combien de rôles sont bloqués, et la boutique refuse avant de débiter. - 🏅 Et les rôles de STATUT automatiques suivent la même règle : roi de la colline, champion PvP et paliers de niveau posés rétroactivement par
+levelrolese donnaient sans décision humaine — et sans consulter le blocage de rang. Un membre bloqué reprenait sa couronne à la première victoire, ou son palier dès qu un responsable en configurait un. - 🚨 Un bannissement raté n’est plus annoncé comme réussi : quand un membre blacklisté (
+bl) rejoignait le serveur, le bot le bannissait — et postait « banni automatiquement » sans jamais regarder si le bannissement avait marché. Or la vérification de hiérarchie faite juste avant n’est qu’un instantané : elle peut être fausse une milliseconde plus tard, et Discord peut refuser (permission retirée, surcharge, limite de débit). L’équipe lisait donc « banni » sur quelqu’un qui venait d’entrer et qui y restait. Le résultat est maintenant lu, et l’échec est dit, avec la consigne de bannir à la main. - 🕸️ Même correction sur le réseau anti-menaces et sur l’expulsion d’un bot dangereux : le réseau annonçait « banni (confirmé réseau) » à tous tes serveurs sur un bannissement dont l’échec était avalé — un raider toujours présent, décrit partout comme parti, ce qui éteint la vigilance d’équipes qui n’ont rien vu. L’antiraid faisait de même en titrant « bot expulsé » sur une expulsion refusée, laissant un bot aux permissions dangereuses en place sous une alerte qui disait que c’était réglé.
- 🔇 Et le filtre anti-phishing n’affirme plus une mise en sourdine qu’il n’a pas posée : « message supprimé et auteur réduit au silence » s’affichait dans tous les cas — quand la sourdine échouait, et même quand le membre n’était pas modérable, donc quand rien n’avait été tenté. Le message dit désormais exactement ce qui a eu lieu.
- 🚨 Le mot de panique annonçait « vérification au maximum » sans regarder si elle avait été posée :
+lockwordverrouille tout le serveur en un mot, et son alerte affirmait la montée de vérification dans tous les cas — l'échec côté Discord était avalé. C'est le geste qu'on fait quand tout va mal : le pire moment pour lire qu'une porte d'entrée est fermée alors qu'elle ne l'est pas. L'alerte distingue maintenant trois états — montée, déjà au maximum, ou refusée par Discord, avec la consigne de la monter à la main. - 🎫 Un ticket « relâché » ne peut plus rester fermé au reste du staff en silence : relâcher une prise en charge rend les accès que les modes
lock/hideavaient retirés. Si Discord refusait l'une de ces restitutions, l'échec était avalé et les deux portes de relâchement — le bouton et+claim— annonçaient quand même « Ticket relâché ». L'état enregistré disait « libre », le salon disait le contraire, et personne ne pouvait le savoir. Le nombre d'accès non rendus est maintenant compté et annoncé, avec quoi vérifier. - 🔐
+baseprivé compte désormais les accès réellement posés : le message « N personne(s) gardent l'accès » se calculait sur la liste demandée, pas sur celle qui avait abouti. Un salon qui atteint la limite de dérogations de Discord, ou une permission retirée entre-temps, pouvait donc laisser dehors quelqu'un à qui l'on venait d'écrire qu'il était dedans — y compris celui qui venait de fermer le salon. - 👁️ Une quarantaine où la personne isolée ne pouvait pas lire son propre recours : le bot rouvre le salon de quarantaine au rôle isolé avant d'y poster l'explication. Quand cette réparation d'accès échouait, l'échec était avalé — le message partait quand même, posté avec les droits du bot, dans un salon que la personne isolée ne voyait pas. Aucun des avertissements existants ne couvrait ce cas : l'un parle du message non posté, l'autre de l'isolement non posé. Le staff est maintenant prévenu, avec quoi vérifier.
- 🔗 Et au retour d'un membre quarantainé, plus de lien mort vers son ticket : le bot lui repose l'accès à son ticket de contestation puis lui envoie un bouton « Aller au ticket ». Si la remise d'accès échouait, le bouton pointait vers un salon invisible — une voie de recours qui existe sur le papier et nulle part ailleurs. Il reçoit désormais le bouton de contestation, qui sait rouvrir l'accès.
- 🔉 On ne peut plus démuseler quelqu'un qu'on n'a pas le droit de faire taire :
+tempsmute,+ban,+kicket+warnrefusent tous d'agir sur un membre qui n'est pas strictement en dessous de l'exécutant.+unmuteétait la seule commande de sa famille à ne rien contrôler — la porte de sortie d'une sanction était donc ouverte plus large que son entrée, au même palier de permission. Un modérateur pouvait défaire la sourdine posée par un supérieur, en boucle, y compris celle que l'échelle d'avertissements (3 → muet) venait d'appliquer. Le contrôle est maintenant symétrique. - 📄 Le site de documentation allait annoncer « 👥 Tous » sur
+setupet+guardian: la pastille d'accès de chaque commande y est calculée par le générateur du site, dont la règle disait « pas de permission Discord exigée → ouvert à tous ». Le bot dit exactement l'inverse : une commande sans permission déclarée retombe au palier admin, et une centaine de commandes sont gardées par palier plutôt que par permission. Le site en ligne était juste seulement parce qu'il datait d'avant ce déplacement — mesuré, la prochaine régénération aurait déclassé 82 pastilles, dont 50 passant d'« Admin » à « Tous » et+addrole/+delroled'« Owner » à « Tous ». Le générateur suit désormais le vrai palier, et un contrôle automatique compare les deux, commande par commande. - 👑
+nuke,+addroleet+delroleannoncent enfin leur vrai niveau : ces trois commandes ont une garde à part dans le répartiteur — couronne du serveur, ou membre inscrit par un propriétaire via+nukeadd. Elles n'ont donc jamais été ouvertes au staff. Mais la table des paliers, elle, ne le disait pas : tout ce qui LIT le palier plutôt que la garde les sous-estimait, à commencer par la pastille d'accès du site public. Elles sont désormais déclarées au palier propriétaire. C'est aussi de la défense en profondeur : une garde qui n'existe qu'à un seul endroit disparaît le jour où l'on déplace une branche — le palier la double maintenant. La délégation par+nukeaddest inchangée. - 💾 Le panneau Sauvegarde de
+setupne s'ouvrait plus du tout : cliquer dessus ne produisait rien — pas d'erreur, pas de message, rien. En cause, une variable disparue : l'optimisation qui a remplacé la lecture de 4,4 Mo par un résumé de 72 octets avait retiré sa déclaration en laissant son usage sur le bouton « Restaurer ». L'exception était levée avant même l'envoi, donc invisible, et le contrôle de syntaxe ne voit pas un nom non déclaré. Le panneau s'ouvre à nouveau, et « Restaurer » n'est proposé que s'il existe vraiment une sauvegarde lisible. - 🔒
+quiditne peut plus citer un salon privé devant tout le monde : le jeu pioche un message au hasard dans le serveur, le recopie mot pour mot dans le salon où la commande est tapée, puis annonce l'auteur et le salon d'origine. Son filtre ne regardait que ce que le bot peut lire — donc, sur un serveur où il est administrateur, #staff, #logs et les tickets. La commande étant ouverte à tous, n'importe quel membre pouvait vider un salon privé, une citation à la fois. Le jeu n'échantillonne désormais que des salons déjà visibles par @everyone : volontairement plus strict que « visible par celui qui tape », puisque la citation est republiée devant tout un salon. - 🛡️ Le bouton « Rejouer » ne peut plus servir à relancer une commande de propriétaire : il ne consultait qu'un seul contrôle de permission, qui ignore trois familles traitées en amont — les commandes réservées au propriétaire, celles à garde dédiée (
+nuke,+addrole,+delrole) et celles du propriétaire racine. Ce n'était pas exploitable : ce bouton n'est posé que par des jeux publics, avec un nom de commande écrit en dur. C'est une ceinture posée avant que quelqu'un n'ajoute un « Rejouer » ailleurs. - 🎁 Le cadeau vocal tournait à 68 % de sa cadence, et personne ne pouvait le voir : le tirage « chaque heure » était un simple minuteur lancé au démarrage — sans repère en base, sans passe au démarrage. Il ne pouvait donc se produire que si le bot survivait soixante minutes d'affilée, et chaque redémarrage annulait l'heure en cours sans trace. Mesuré sur le vrai journal de production : 8,8 % seulement des vies du process atteignent l'heure, et un tirage sur trois était perdu. L'échéance vit maintenant en base : elle ne dépend plus de la durée de vie du bot. Un seul rattrapage après une longue coupure — jamais une rafale.
- 🪝 « Webhook supprimé » partait dans les trois états, et en double : quand un webhook non autorisé apparaissait, le bot annonçait « supprimé et membre sanctionné » sans jamais regarder ce qui s'était réellement passé — y compris quand il n'avait rien pu LIRE (permission retirée) ou quand Discord avait REFUSÉ la suppression. Et sa propre suppression lui revenait : Discord signale la disparition du webhook, le bot repartait en sanction et en alerte. Une alerte en double après chaque suppression réussie. Il dit maintenant lequel des quatre cas s'est produit, et ne se répond plus à lui-même.
- 🔥 Les séries quotidiennes cassaient aux deux changements d'heure :
+roue,+motuset le défi quotidien déduisaient « hier » en retirant vingt-quatre heures. Or la journée parisienne dure 23 h en mars et 25 h en octobre : le 25/10 à 23 h 30 ce calcul rend *le jour même*, le 30/03 à 00 h 30 *l'avant-veille*. Six fenêtres d'une heure sur trois ans, la prochaine le 25/10/2026 en pleine soirée. La série du défi était recalculée et enregistrée dans le même geste : elle repartait à 1 pour de bon. La veille se calcule désormais sur le calendrier. - 📊 Chaque compteur affichait la métrique du voisin après une restauration : les salons compteurs et leurs métriques sont deux listes appariées par position. La restauration écartait la première (les salons ont changé d'identifiant) et laissait passer la seconde — donc « 👥 Membres » se retrouvait sur le salon prévu pour « 🟢 En ligne ». Chaque nom restant cohérent avec lui-même, rien ne contredisait rien. Pire : redemander exactement les mêmes compteurs pour réparer faisait détruire les salons existants. Le clonage de configuration avait le même trou, et faisait voyager un identifiant de rôle vers l'autre serveur.
- 📈
+growthet+recapperdaient ou doublaient un jour après un changement d'heure : la fenêtre de jours était parcourue en millisecondes alors que les jours sont enregistrés sur un calendrier. Le 25/10 le même jour sortait deux fois et le plus ancien disparaissait de la sélection ; le 30/03 un jour était enjambé — quatorze cases étalées sur quinze jours. Le journal lui-même était juste : il n'y avait rien à réparer dans les chiffres enregistrés, seulement dans la façon de les relire. - ♻️ Restaurer une sauvegarde ne crée plus de rôle Administrateur en double : l'appariement ne se faisait que par le NOM du rôle, alors que le commentaire du code promettait un appariement par identifiant — qui n'existait nulle part. Un rôle simplement renommé depuis la sauvegarde (« Modo » → « Modération ») n'était donc plus reconnu : la restauration en créait un nouveau, avec les permissions d'origine, donc un second rôle Administrateur vide sur le serveur — et les permissions de salon se remettaient à viser le doublon pendant que le vrai rôle perdait les siennes. L'identifiant, lui, ne change pas quand on renomme : il est consulté en premier, le nom reste le repli.
- 🧹 Les captures de
+nukene gonflent plus les sauvegardes, et elles s'effacent enfin : avant de recréer un salon, le bot en capture les derniers messages (jusqu'à 120 Ko : pseudos, texte, liens de pièces jointes) pour offrir un bouton de restauration pendant 6 h. Deux défauts se composaient — ces captures échappaient au filtre qui empêche une sauvegarde d'en contenir une autre, donc elles partaient dans chaque instantané, dans les six versions d'historique et dans l'archive chiffrée envoyée en message privé ; et leur échéance de 6 h n'était appliquée qu'au clic du bouton, si bien que sans clic la clé restait en base indéfiniment. Elles sont désormais exclues des sauvegardes et balayées toutes les heures. *(Mesuré en production : aucun serveur n'en avait — la porte était ouverte, elle n'avait pas servi.)* - 📌 Un message épinglé automatique pouvait rester dans le salon sans que
+sticky offpuisse l'effacer — par deux chemins, tous deux fermés. Le premier : deux reposts du même texte partant en même temps (un membre écrit pendant que le bot re-poste) se croyaient tous deux légitimes, parce qu'ils se reconnaissaient à leur TEXTE — et deux copies du même texte sont indiscernables. Le second, plus fréquent : l'envoi était fait sans garde-fou, et quand il traînait plus de quinze secondes, Discord le recevait pendant que le bot croyait avoir échoué et recommençait — jusqu'à quatre copies pour un seul envoi. Dans les deux cas un seul message était mémorisé, les autres restaient là, hors de portée de tout le module. Le bot se reconnaît maintenant au message qu'il remplaçait, et n'envoie plus qu'une fois. - 🎭
+massrolejuge enfin ton rang sur le serveur VISÉ, et non sur celui d'où tu cliques : ce fichier pose la règle noir sur blanc — « le membre du serveur cible, pas celui d'où l'on clique » — mais elle n'avait été appliquée qu'à la porte d'entrée. Le contrôle anti-escalade, une fonction plus bas, lisait d'abord le membre de l'endroit du clic : un rang élevé sur son propre serveur pouvait servir à juger une attribution ou un retrait de rôle en masse ailleurs. Les deux contrôles lisent désormais la même source, et un membre obtenu du serveur cible n'est retenu que s'il en vient réellement. - 🔢 La page « Compteurs » de
+setuppouvait devenir inouvrable, sans issue : un compteur par rôle s'y affiche « 🏷️ nom du rôle : N membres ». Un nom de rôle va jusqu'à 100 caractères et le plafond est de vingt compteurs — neuf rôles aux noms longs suffisaient à franchir la limite d'un champ Discord, ce qui fait échouer l'affichage avant l'envoi : la page ne s'ouvrait plus du tout. Le piège était sans sortie, puisque c'est précisément cette page qui sert à retirer des compteurs. La liste est maintenant coupée par éléments entiers, et le nombre de compteurs non montrés est annoncé. - 🐌 Un salon ne peut plus rester ralenti pour toujours : quand un pic retombe, le bot retire le mode lent qu'il avait posé. Il abandonnait la revendication du salon — en mémoire et en base — *avant* de faire le retrait, dont l'échec était avalé. Si Discord refusait (permission retirée entre-temps, limite de débit), le bot avait déjà oublié qu'il avait ralenti ce salon : plus rien ne le revendiquait, donc aucun balayage ne réessayait, et le mode lent restait en place indéfiniment sans que personne sache d'où il venait. Le salon n'est désormais lâché qu'une fois le retrait réellement abouti ; sinon le passage suivant réessaie.
- 🩺 Le bot te disait comment couper son nettoyage automatique de messages — avec une consigne qui ne marchait pas. Quand un bouton ne répond plus, le bot supprime tout seul le message qui le porte, puis prévient dans le salon de logs. Ce message d'alerte se terminait par « pour couper ces alertes et le nettoyage : config
buttonhealth=off» — un réglage qu'aucune commande du bot ne permettait d'écrire. L'interrupteur existe désormais pour de bon :+setup→ ⚙️ Réglages détaillés → 🧩 Modules → Nettoyage des boutons morts. Il est coché par défaut, donc rien ne change tant que tu n'y touches pas ; le décocher coupe la suppression et les alertes. Le texte de l'alerte indique maintenant ce chemin, avec ton propre préfixe, et décrit correctement ce qui peut être supprimé (uniquement un message du bot, non éphémère, vieux de plus de 2 h). - 🏅 Au-delà de 200 porteurs, un rang automatique devenait définitif : à chaque clôture de période, le bot reconstruit la liste des membres à qui il a donné un rang — en repartant d'une liste vide, puis en remplaçant l'ancienne en entier. Comme un passage n'en traite que 200, tous les autres disparaissaient du registre : ils gardaient leur rôle, et le bot ne savait plus qu'il le leur avait donné. Or il ne retire que ce qui vient de ce système : le rôle devenait permanent, en silence. Les porteurs non traités sont désormais reportés, et ce sont eux qui passent en premier — ne rien faire ne coûte rien à un membre actif, mais empêche toute rétrogradation chez un porteur.
- 💜 Le panneau « Rôle de statut » devenait inouvrable — et c'est celui qui sert à retirer ce qu'on vient d'ajouter. Un encadré Discord plafonne chaque champ à 1 024 caractères, et dépasser ne raccourcit pas : ça fait échouer l'affichage tout entier. Dix messages de statut à la longueur maximale — donc le maximum que le bot autorise, sans rien faire d'anormal — franchissaient ce plafond : le panneau répondait « L'interaction a échoué » par ses cinq portes d'entrée, et on se retrouvait enfermé dehors avec la clé à l'intérieur. Le menu public
+soutienavait le même défaut avec cinq rôles refusés, et là aucun réglage n'était en cause : il suffisait qu'un admin donne plus tard une permission sensible à un rôle déjà accepté. Les listes gardent maintenant des entrées entières et annoncent ce qui n'a pas tenu, plutôt que de couper un message en plein milieu. - 🛡️ Un échec total était compté comme une menace neutralisée : le verdict de
+postmortemet le compteur de+digestjugeaient chaque action de défense en relisant sa phrase, à la recherche de cinq mots signalant un échec. L'anti-vanity, lui, écrivait « restauration KO · derank KO » — c'est-à-dire l'URL vanity volée et son auteur toujours en place — et aucun des cinq mots n'y figurait : l'incident était donc rangé parmi les actions menées. Un serveur qui venait de se faire voler son URL lisait « toutes les actions ont abouti ». Les défenses déclarent désormais leur échec au lieu de le laisser deviner, la phrase ne servant plus que pour les incidents déjà enregistrés, et les deux écrans jugent avec la même fonction — ils en avaient deux, écrites séparément. - 🧠 L'alarme de Guardian ne s'éteint plus toute seule au redémarrage, sur le cas le plus grave : quand le derank préventif ne peut rien retirer — un rôle dangereux placé au-dessus du rôle du bot — Guardian retient cet échec et laisse son alarme d'accumulation ouverte, en disant dans son alerte que le derank était impossible. Ce constat d'échec n'était pas sauvegardé : au redémarrage suivant il repartait à zéro, l'alarme se refermait d'elle-même et l'alerte cessait de nommer l'échec — exactement là où il fallait insister. Un simple déploiement pendant la fenêtre de surveillance suffisait.
- 🔁 Guardian ne défait plus la décision que deux propriétaires viennent de prendre : quand un « Autoriser » arrive après coup, le bot rend les rôles qu'il avait retirés. Or rendre un rôle est un évènement comme un autre, et le détecteur de Guardian ne regardait jamais qui l'avait ajouté — il se re-détectait donc lui-même, rouvrait une surveillance complète et armait un retrait préventif : les rôles tout juste rendus repartaient quelques secondes plus tard. Le bot reconnaît maintenant son propre geste, et seulement lui : la reconnaissance est bornée à trente secondes et ne couvre que les rôles effectivement restaurés — un autre rôle ajouté pendant ce laps reste surveillé, sans quoi la correction aurait créé un angle mort.
- 🔕 Le rappel de l'audit de sécurité ne repart plus à chaque va-et-vient de membre : pour ne pas te répéter la même liste de failles toutes les demi-heures, le bot en garde une signature — censée être indépendante de la langue et du décompte. Deux failles sur neuf commencent par leur chiffre (« 3 membre(s) à risque… ») : elles échappaient à cette normalisation et laissaient le nombre dans la signature. Il suffisait donc qu'un membre à risque arrive ou parte pour que le bot considère la liste comme nouvelle et te la renvoie. La signature changeait aussi selon la langue du serveur, ce que son propre commentaire interdit. Les neuf failles se ramènent maintenant à leur identifiant interne.
- 🏆 Le podium du défi quotidien ne peut plus être annoncé deux fois : la clôture de minuit distribue l'XP membre par membre, ce qui prend plusieurs secondes. Si quelqu'un ouvrait
+defipendant ce laps, le bot mettait de côté « la journée d'hier » — celle-là même qu'il était en train de fermer — et la décision de fin de clôture reposait sur un état pris avant cette mise de côté : elle n'était donc pas retirée. Au passage suivant, la journée était refermée une seconde fois : podium réannoncé, et 80/50/30 XP redistribués. Mesuré en rejouant la course : l'XP repartait bien au tick suivant. La mise de côté est désormais relue après les attentes, et retirée seulement si elle double la journée qu'on vient de fermer — une mise de côté portant une autre date garde droit à sa propre clôture. - 🎡 La relance de roue achetée 3 000 🟣 était détruite à minuit, sans un mot. Si tu l'achetais après avoir déjà tourné — c'est-à-dire dans le seul cas où elle sert — et que tu revenais le lendemain, ton
+rouepartait comme le tour gratuit du jour, et la relance payée disparaissait avec lui. Le bot répondait ensuite « tu as déjà tourné aujourd'hui » : ni message, ni remboursement, plus qu'à repayer. Une relance non utilisée est désormais reportée : elle attend ton prochain+roue, quel que soit le jour, et donne bien le tour supplémentaire acheté — série inchangée, comme prévu, et une seule fois. - ⏳ Un rôle temporaire payé ne peut plus devenir définitif : à l'expiration, le bot retire le rôle puis efface l'échéance. Il l'effaçait pour toutes les locations arrivées à terme, y compris celles dont le retrait venait d'échouer — le résultat était pourtant lu, mais seulement pour compter. Le membre gardait alors son rôle payé et son échéance disparaissait : plus rien pour réessayer, le temporaire devenait permanent en silence. Seuls les retraits réellement effectués soldent désormais l'échéance ; un échec passager la conserve et sera rejoué au balayage suivant.
- ⚓ Le verrou de
+navalene traverse plus les serveurs : le bot tourne dans un seul processus pour tous tes serveurs, et le verrou « tu as déjà une bataille en cours » n'était indexé que sur l'identifiant du joueur. Une partie lancée sur un serveur bloquait donc la commande sur tous les autres, avec un refus incompréhensible pour qui n'y avait rien lancé. Le verrou porte maintenant le serveur, et il passe par une enveloppe qui exige cette information — les vingt-quatre endroits qui l'utilisent ne peuvent plus l'oublier en silence. - 🐎 Une course de chevaux interrompue par un redémarrage ne fait plus disparaître les mises. L'aura est retirée dès que quelqu'un parie, et le bot garde de côté la liste des parieurs pour pouvoir les rembourser si la course ne va pas au bout. Mais si le bot redémarrait en pleine course et qu'un joueur relançait
+coursedans le même salon avant que le rattrapage automatique n'ait eu le temps de passer, cette liste était écrasée par la nouvelle course : plus personne ne savait à qui rendre quoi. Les mises de la course interrompue sont désormais rendues avant que la nouvelle ne prenne sa place. - 🏅 Le rôle des podiums de jeux (🥇/🥈/🥉 Top Jeux) était posé sans passer par le contrôle de rang. C'est un rôle affiché à part dans la liste des membres : posé sur un compte qu'un modérateur ne peut plus toucher, il devient une décoration intouchable. Il emprunte désormais la même porte que tous les autres rôles automatiques du bot — refusé et journalisé s'il est trop haut, au lieu d'être posé en silence. Le retrait, lui, reste toujours possible.
- 🎮
+joueurannonçait « tu as le rôle » même quand Discord avait refusé de le poser. La vérification de hauteur du rôle est un instantané : le rôle déplacé au-dessus de celui du bot une seconde plus tard, une permission retirée entre-temps, et le membre lisait la confirmation sans rien avoir. Les deux sens — prendre le rôle et le rendre — lisent maintenant la réponse de Discord avant d'annoncer, et disent clairement quand ça n'a pas marché. - 🚫 La blacklist des services protège enfin tous ceux qu'elle devait protéger.
+blacklistprive de tout à la fois (tickets, giveaways, signalements) — et ne refusait que le propriétaire du serveur, alors que ses cadettes+blticet+blgw, qui privent d'un seul service, refusaient déjà bien plus. Un owner ajouté par+owner— quelqu'un à qui on a confié des pouvoirs de sécurité — pouvait donc être coupé de ses propres tickets par un simple *Gérer le serveur*. La liste la plus large était la moins gardée. Elle applique désormais les mêmes intouchables que les deux autres, avec le même message de refus pour tous. - 👑 Une couronne seule sur son serveur ne pouvait pas nommer son premier co-propriétaire.
+owner addexige deux confirmations d'owners distincts — sauf, en principe, quand il n'y en a qu'un, pour permettre l'amorçage. Sauf que le décompte incluait les propriétaires techniques du bot, qui ne sont pas membres du serveur : le total valait toujours au moins deux, la seconde confirmation n'arrivait jamais, et la demande restait bloquée sur « 1/2 » pour toujours. Le quorum ne compte plus que les propriétaires réellement présents. Un ajout validé par une seule voix, lui, prévient maintenant tous les autres propriétaires et renforce la surveillance du serveur — comme le font déjà+unbl, Guardian et la quarantaine. - 🔔 Une décision sur une alerte ne fermait qu'un seul exemplaire. La même alerte de sécurité part dans ton salon de logs et en message privé à chaque propriétaire. Quand l'un de vous cliquait « Autoriser » ou « Refuser », seule la copie cliquée changeait : toutes les autres gardaient leurs boutons et un encadré disant encore « en attente ». On y revenait plus tard, on cliquait — et on n'apprenait qu'à ce moment-là, par « ⏹️ expirée ou déjà remplacée », que la décision était prise depuis longtemps. Désormais, une décision ferme tous les exemplaires : boutons retirés, et le message dit ce qui a été décidé. Idem quand une alerte plus récente remplace la précédente. Les boutons d'une alerte simplement expirée, eux, continuent de fonctionner — décider tard reste possible, et c'est voulu.
- 🟣 « N'a pas encore farmé son aura », juste sous un solde de 200 000.
+aura @membreregardait le nombre de tirages de+aura— et le heist, le double-ou-rien, la boutique, les boss et les événements n'en consomment aucun. Un joueur dont toute la fortune vient des jeux se voyait annoncer son solde puis, à la ligne suivante, qu'il n'avait rien farmé : rang et record cachés. Sur ce bot, 7 des 19 détenteurs d'aura étaient dans ce cas. Le classement avait le même défaut au pied de page : hors du top 10, ces joueurs-là ne voyaient pas leur propre ligne. - 🗂️ La dernière confirmation d'une restauration promettait le contraire de ce qu'un de ses boutons fait. Le panneau affirmait « rien n'est supprimé de ce qui existe aujourd'hui » — et l'exception qu'il mentionnait renvoyait à la question posée à l'écran d'avant, pas aux trois boutons juste en dessous, dont 🧹 Purge, qui supprime précisément les salons absents de la sauvegarde. Le panneau ne promet plus rien qu'il ne tienne : il dit que le sort de l'existant dépend du mode choisi, et invite à lire les trois avant de cliquer.
- ⚔️ La fin de saison PvP pouvait passer totalement inaperçue. Elle s'annonçait dans le salon *système* du serveur — celui que Discord crée à l'origine et que beaucoup de serveurs suppriment ou désactivent. Sur ces serveurs-là : MMR remis à plat, XP du podium versés, rôle de Champion déplacé… et pas un mot. Sans rattrapage, en plus : le nouveau mois est réservé juste avant l'annonce, donc la clôture ne repasse jamais. Le podium PvP part désormais là où va déjà celui des jeux, avec la même cascade de replis.
- 🚑 Une récupération post-raid qui ne répare rien ne se déclare plus « terminée ». Après la double validation des propriétaires, il arrivait que l'opération ne rende aucun bannissement ni aucun rôle — permissions manquantes, position dans la hiérarchie, refus de Discord. Le bot affichait quand même un panneau vert « terminée » avec trois zéros, écrivait « exécutée » dans le journal de sécurité, et l'incident était compté parmi les menaces neutralisées dans
+postmortemet le récapitulatif. Les trois disent maintenant la vérité, et le panneau explique quoi vérifier avant de relancer. - 📦 Le badge « Pillard » était impossible à obtenir. Il comptait les *victoires* aux caisses de ravitaillement — sauf qu'une caisse ramassée ne compte volontairement pas comme une victoire (sinon le classement des joueurs deviendrait celui des ramasseurs). Le compteur était donc figé pour toujours sous le premier palier. Il compte désormais ce que sa propre description annonce depuis le début : les caisses ramassées. Et le déblocage s'annonce enfin — la vérification des badges arrivait, elle aussi, après la porte qui écarte les événements.
- 🔊
+vcplantait sur un serveur à beaucoup de vocaux occupés. Une ligne par salon, sans plafond : au-delà d'environ quarante salons occupés, l'encadré dépassait la limite de Discord et la commande ne répondait plus du tout. Elle liste maintenant les salons les plus peuplés d'abord, s'arrête avant la limite en annonçant combien de salons ne tiennent pas — et le total continue de compter tout le monde, listé ou non. - 🧪 Quand l'antivirus n'a pas pu se prononcer, quelqu'un l'apprend enfin. Le bot ne dit jamais qu'un fichier est sain s'il n'a pas pu le vérifier — mais l'avertissement « non vérifié » n'atteignait personne dans plusieurs cas. Quatre situations sur huit ne déclenchaient pas le repli dans le salon d'origine, dont le quota d'analyse épuisé, celle qui arrive le plus vite. Une neuvième était muette même avec un salon de logs configuré : quand le téléchargement du fichier échoue — lien expiré, réseau, ou fichier qui ment sur sa taille annoncée — personne n'était prévenu, alors qu'un fichier honnêtement trop gros l'était depuis toujours. Enfin, au-delà de cinq pièces jointes par message, les suivantes n'étaient pas regardées du tout et ça ne se disait nulle part : le bot annonce désormais combien de fichiers personne n'a vérifiés. Ces avertissements publics sont limités à un par salon et par minute, pour qu'ils informent sans envahir la conversation.
- 🎁 Un giveaway pouvait écarter quelqu'un qui venait tout juste de s'inscrire. Quand plusieurs giveaways se terminent en même temps, le bot les traite l'un après l'autre — et il tirait au sort dans la liste de participants prise avant de commencer. Un clic « Participer » arrivé pendant le tirage précédent était bien enregistré, la personne lisait « inscrit », puis elle était écartée du tirage et son inscription effacée. Le tirage relit maintenant l'urne juste avant de l'ouvrir.
- 📣 Le panneau du salon de pub annonçait l'emplacement demandé, pas le vrai. Choisir une catégorie enregistrait le réglage puis tentait de déplacer le salon — et si Discord refusait (permission manquante, catégorie pleine à 50 salons), l'échec était avalé : le panneau affichait quand même « dans la catégorie X » pendant que le salon n'avait pas bougé. Il décrit désormais le salon tel qu'il est, signale le désaccord, et un déplacement refusé se dit à voix haute.
- 🌍
+ecologparlait français sur un serveur en anglais. Les libellés des sources d'aura (farm, casino, boutique…) savent se traduire, mais la commande ne leur passait jamais le serveur — et c'en était le seul appelant. Les trois affichages sont corrigés. - 🔒
+punitionannonçait « quarantine → bannissement ». C'était faux, et le réglage ne servait à rien. La quarantaine ne bannit personne : elle retire les rôles porteurs de permissions sensibles, isole la cible, et tout est réversible en un clic. Pourtant l'écran des sanctions affichait un barème pour les dix-huit modules antiraid — alors que dix seulement en lisent un. Sur les huit autres, dont la quarantaine, la ligne annonçait une sanction inexistante, et+punition quarantine banétait accepté puis sans le moindre effet : on croyait avoir armé un bannissement qui n'existait pas. L'écran ne liste plus que les modules réellement réglables, il nomme les autres en disant ce qu'ils font, et il refuse le réglage en expliquant pourquoi. La quarantaine, elle, ne change pas d'un iota : elle reste active en permanence. - 🔒
+lockdownverrouille enfin TOUS les salons. Il ne fermait que les salons texte et annonce. Pendant un verrouillage, on continuait donc à se parler en vocal, à publier dans les forums et les salons média, et — le plus gênant — à écrire dans les fils déjà ouverts des salons texte, puisque fermer un salon ne ferme pas ses fils. Sont désormais fermés : texte, annonce, forum, média, vocal (le tchat intégré et l'entrée), scène, les fils de chacun, et les catégories — pour qu'un salon créé pendant le siège naisse muet lui aussi. - 🔓 …et le déverrouillage ne rouvre plus ce qui était fermé exprès. Les quatre chemins qui verrouillent —
+lockdown,+panic, le bouton du panneau+baseet le mot de panique — rendaient la main en effaçant la restriction. Un salon d'annonces, un salon de règles, une archive : tout salon volontairement en lecture seule redevenait écrivable au premieroff, et le serveur sortait du siège plus ouvert qu'il n'y était entré. L'état d'avant est maintenant mémorisé salon par salon et rendu tel quel. Deux verrouillages coup sur coup ne se marchent plus dessus non plus — le second n'écrase pas la mémoire du premier, ce qui aurait rendu le verrou définitif. - 🧱 Un verrouillage à moitié posé le dit. S'il manque *Gérer les rôles* sur certains salons, ils restent ouverts : le compte rendu annonce désormais combien de salons sur combien n'ont pas pu être traités, au lieu de n'afficher que les réussites. Et tant qu'un salon résiste, la mémoire de son état d'origine est conservée pour la tentative suivante.
- 🚪 Quatre commandes de configuration pouvaient être ouvertes à tout le serveur. Le garde-fou qui empêche de rendre une commande publique fermait ce qui détruit et ce qui est classé sécurité — mais pas ce qui reconfigure.
+setuppassait : un seul message et n'importe quel membre ouvrait l'assistant, puis le panneau complet — préfixe, message de bienvenue, salon de logs, mots interdits, et surtout le rôle donné automatiquement à chaque arrivant.+permsalonet+permpreset, qui *délèguent des droits*, passaient aussi. Toute la catégorie Configuration est désormais fermée à l'ouverture publique. Contrepartie assumée :+menu,+helpallet+soutienne peuvent plus être rendues publiques non plus. - 🔇
+voicekicket+moveallaussi. La liste des permissions Discord « déjà réservées » — celles dont l'exigence interdit l'ouverture publique — avait oublié Déplacer des membres. Les deux commandes retombaient du bon côté de chaque critère pris séparément ; ouvertes à tous, elles laissaient déconnecter n'importe qui du vocal en boucle. - 🗂️ Effacer un casier disciplinaire demande maintenant les mêmes droits que le remplir.
+warnrefuse d'avertir quelqu'un placé au-dessus de soi, et refuse de s'avertir soi-même.+sanctions clearet+sanctions deln'exigeaient rien : un modérateur pouvait vider son propre casier la veille du 7ᵉ avertissement — celui qui bannit — ou effacer la preuve gênante du dossier d'un responsable. Les deux appliquent désormais la même hiérarchie. Et si le bot n'arrive pas à lire à qui appartient un avertissement, il refuse de le supprimer au lieu de le faire quand même. - 🔑
+sanctionsn'est plus délégable par salon.+permsalon add sanctions #animation @Animateuravait l'air d'offrir la consultation d'un casier dans un salon. En réalitéclearetdeleffacent les avertissements de tout le serveur — donc annulent l'échelle qui bannit au 7ᵉ. C'est exactement la raison pour laquelle+warnavait été retirée de cette liste, prise à l'envers.+history,+caseet+reason, qui ne font que lire, restent délégables. - 🎫 Un salon public appelé
#ticket-infopouvait être supprimé tout seul. La fermeture automatique sur inactivité choisissait ses cibles sur le nom du salon : tout salon commençant particket-était traité comme un ticket. Un#ticket-info,#ticket-archiveou#ticket-reglesinactif recevait donc un préavis, puis était archivé et supprimé — messages épinglés et historique compris, et sans salon de logs configuré, sans aucune copie. Les trois chemins qui ferment ou suppriment sans que personne l'ait demandé exigent maintenant la marque que seul le bot pose. Le geste humain, lui, continue de reconnaître un ticket à son nom : les tickets ouverts avant cette marque restent utilisables. - 🔒 Dès qu'un serveur créait un type de ticket, l'auteur ne pouvait plus fermer le sien. Le sujet du salon vaut
tkt:<auteur>outkt:<auteur>:<type>— et quatre endroits découpaient encore l'ancienne forme, récupérant<auteur>:<type>au lieu de l'identifiant. Le bot répondait « seul l'auteur ou le staff peut fermer » à l'auteur lui-même. Pire, la question « es-tu d'accord pour la fermeture ? », pourtant active par défaut, n'était jamais posée : le ticket se fermait sans elle. - 🚪 « Fermer le ticket au départ de son auteur » annonçait la fermeture et ne fermait rien. L'archive était appelée avec un argument de la mauvaise forme : le champ « Fermé par » sortait vide, Discord refusait le message, et aucune transcription n'était jamais sauvegardée. Le salon, lui, n'était ni verrouillé ni programmé en suppression : il restait ouvert indéfiniment. Au bout de quelques mois, le staff accumulait des dizaines de tickets « fermés automatiquement » toujours vivants, sans trace de ce qui s'y était dit.
- ⬆️ La toute première montée de niveau du jour pouvait passer en silence complet. Gagner de l’XP fait aussi avancer le contrat quotidien « farme X XP » — et quand ce contrat se bouclait, sa récompense en XP faisait monter le membre de niveau par un chemin détourné, qui n’avait aucun salon où parler. L’annonce principale, elle, constatait ensuite que le niveau avait déjà bougé et se taisait. Ni carte, ni message, ni trace : le membre montait de niveau sans que personne ne le voie. Le défaut se déclenchait environ un jour sur deux, selon les contrats tirés ce jour-là — c’est une porte de test devenue rouge toute seule au changement de date qui l’a révélé, sur du code que personne n’avait touché.
- 🚨 Correctif immédiat sur le déverrouillage livré plus tôt dans la journée. Un
+lockdown offou+panic offlancé sur un serveur où aucun verrouillage n'était en cours n'avait rien à rendre — et remédiait à ce vide en remettant tous les droits à « neutre » sur chaque salon. Autrement dit, la commande censée RENDRE les restrictions les EFFAÇAIT : #annonces et #règlement redevenaient écrivables par tout le monde, les salons vocaux fermés redevenaient joignables. Un simple réflexe après une fausse alerte suffisait. Le bot répond désormais qu'il n'y a rien à déverrouiller, et ne touche à aucun salon. - 🛡️ L'antiraid annonçait « sanctionné » sans jamais vérifier qu'il l'avait fait. Dix de ses alertes — ban en masse, débannissement, création et suppression de salons, modification du serveur, déconnexions vocales répétées, mass @everyone, webhook, rôle dangereux, ajout de bot non autorisé — lançaient la sanction puis affirmaient à la ligne suivante qu'elle avait eu lieu, sans attendre ni lire la réponse. Sur un auteur portant un rôle placé au-dessus de celui du bot, il ne se passait rien : l'équipe lisait « sanctionné », refermait l'incident, et l'auteur continuait avec ses permissions. Les alertes disent désormais ce qui s'est réellement produit — et quand rien n'a pu être fait, elles le disent en toutes lettres : « NON sanctionné : il est toujours là, avec ses rôles ».
- 🌊 Un flood de joins produisait environ 190 alertes identiques, chacune avec un
@here. Le compteur lu par l'alerte est la taille de la fenêtre glissante : il repartait à chaque nouvelle arrivée tant que la vague durait. Sur un raid de 200 comptes, le salon de logs — la seule surface où le staff peut lire l'incident — était noyé par l'incident lui-même, avec autant de mentions de masse. Une seule alerte part maintenant par vague, gardée par le verrou du verrouillage automatique qui, lui, se protégeait déjà. - 🔒 Le réseau anti-menaces annonçait « quarantaine complète » sans lire le résultat de la quarantaine. Quand le bot a « Gérer les rôles » mais pas « Gérer les salons » — une installation très courante — le salon d'isolement ne peut pas être créé : les rôles sont bien retirés, mais personne n'est isolé et le membre écrit toujours partout. L'alerte partait quand même, dans le salon de logs et en message privé à tous les propriétaires, en annonçant l'inverse. Elle distingue désormais les deux cas et dit quoi vérifier.
- 🏆 Trois écrans affichaient encore un emoji en double, et le correctif précédent en avait manqué la moitié. L’assistant
+setuppose lui-même l’emoji d’une option à côté de son libellé : quand le libellé commence par le même emoji, il apparaît deux fois. En anglais, « 🏆-hall-of-fame channel » était collé à son tiret — or le nettoyage exige une espace après l’emoji, il ne mordait donc jamais : le doublon survivait dans le menu déroulant et dans la note « c’est optionnel ». Le gabarit d’annonce des boss de chasse, lui, écrivait 🐲 en dur, alors qu’un boss sur quatre porte déjà ce même emoji. Trois libellés n’ont volontairement PAS été touchés :#🎮-jeuxet#🏆-salle-des-trophéessont les vrais noms des salons que le bot crée, et « Podium mensuel (rôles 🥇🥈🥉) » énumère les trois médailles — les « corriger » aurait mal nommé un salon et cassé une énumération. - ⏳ Une échéance de bannissement temporaire pouvait lever un bannissement définitif. Un modérateur pose
+tempban @x 30j; une semaine plus tard, le staff décide que c'est définitif et tape+ban. Au 30ᵉ jour, l'échéance oubliée levait ce bannissement définitif — le journal annonçait même « bannissements temporaires expirés ». Aucune commande de bannissement n'effaçait l'échéance, et le balayage ne vérifiait jamais que le bannissement en place était bien le sien. Il le vérifie désormais : si quelqu'un a rebanni depuis, l'échéance est abandonnée, la personne reste bannie, et les propriétaires en sont prévenus. - 🐢 Le ralentissement de crise du bouclier de raid pouvait rester à vie sur le salon d'accueil. En montant, le bouclier impose 15 secondes entre deux messages sur le salon système, et mémorise la valeur d'origine pour la rendre en redescendant. Mais il effaçait cette mémoire avant de savoir si la restauration avait réussi. Il suffisait que le salon système ait changé entre-temps, ou qu'une permission ait sauté : le salon gardait ses 15 secondes pour toujours, et plus rien ne savait qu'il fallait les retirer. La valeur d'origine n'est maintenant oubliée qu'une fois réellement rendue.
- 🛡️ Éteindre le bouclier de raid redevient un geste de propriétaire, par toutes les portes. Le bouton de
+setupet le sélecteur de+securéservaient déjà l'extinction à la couronne, en l'écrivant noir sur blanc : *allumer une protection ne peut pas nuire, l'éteindre si*. La commande directe+shield off— et+shield reset, qui remet le niveau à zéro — n'avait aucun contrôle : un simple administrateur pouvait désarmer le bouclier en pleine vague. L'allumer reste ouvert aux administrateurs. - 🔁 « Les deux boutons font la même chose » — ils ne le font plus. Quand une alerte Guardian était remplacée par une plus récente sur le même membre, cliquer Autoriser ou Refuser sur l’ancienne donnait exactement la même réponse : « expirée ou déjà remplacée », et rien d’autre. Or les deux ne se valent pas : refuser retire des permissions, autoriser en rend. Désormais Refuser fonctionne depuis une alerte remplacée — c’est la direction sûre, et le bouton vise toujours le même membre — tandis qu’Autoriser t’indique d’ouvrir l’alerte récente, qui porte les éléments à jour. Une alerte vraiment périmée (plus de sept jours) reste sans effet pour les deux boutons, et le dit clairement.
- ◀️
+help: on peut enfin tourner les pages. Le code l’avouait lui-même : il n’existait aucun bouton précédent/suivant. Le menu déroulant supposait qu’on sache déjà où aller, et Discord ne lui permet pas de lister plus de 24 pages. Deux flèches ◀️ ▶️ encadrent désormais un compteur « 3/12 » qui dit où tu es, et elles bouclent : avant l’accueil, la dernière page ; après la dernière, l’accueil. *(En place depuis le 30 août — cette note avait été oubliée.)* - 🔒
+setverify offsupprimait le rôle que tu avais choisi. Si la vérification avait été configurée avec un rôle existant — souvent@Membre, celui que tout le serveur porte et qui ouvre les salons —, la désactiver le supprimait : retiré d'un coup à tous ceux qui l'avaient, et ses permissions de salon effacées pour de bon. L'écran disait seulement que le rôle « n'est plus attribué », et le retour arrière recréait un rôle vide. Désormais, seul le rôle « ✅ Vérifié » que le bot a lui-même créé est supprimé ; ton rôle est conservé, ceux qui le portent le gardent, et l'écran le dit. - 🏅
+autorank: un seuil à 0 donnait le rang à tout le monde. Un palier « 2000 messages, 0 h de vocal » était atteint par tous les membres, y compris ceux qui n'avaient rien écrit — zéro heure de vocal, tout le monde l'a. La commande refusait déjà un palier à 0 et 0, mais pas un seul critère à 0, alors qu'elle l'annonçait comme une valeur valide. Un critère à 0 veut maintenant dire « ce critère ne compte pas », et la liste des paliers n'affiche plus « 0 min de vocal » comme s'il s'agissait d'un seuil. - ⬇️
+autorankperdait la trace de rangs qu'il avait lui-même donnés. En fin de période, un membre momentanément illisible — Discord qui répond mal quelques secondes — sortait du registre des porteurs : il gardait son rang pour toujours, le bot ne sachant plus qu'il devait le lui reprendre. Un retrait refusé (rôle passé au-dessus du bot) était pourtant annoncé « redescendu », et un rang qui avait reçu des permissions sensibles depuis n'était pas retiré du tout — c'est précisément celui qu'il faut reprendre. Seul un départ prouvé efface désormais un membre du registre ; un retrait qui n'a pas eu lieu n'est plus annoncé, et sera retenté à la période suivante. - 🔕 L'annonce des montées de niveau peut enfin être coupée. Le menu Niveaux & XP de
+setupréglait le salon des annonces et leur forme (carte image ou encadré), mais jamais leur arrêt : à chaque montée de niveau, le bot parlait — dans le salon des niveaux, ou à défaut dans le salon où le membre écrivait. Un bouton 🔕 Désactiver l'annonce les coupe entièrement, et l'écran affiche l'état ; l'XP, les niveaux et les rôles-récompense continuent exactement comme avant. Un second clic les rallume. - 👑 Plus de fausse alerte « indice de dangerosité » sur le propriétaire du serveur. Le bot ne peut de toute façon rien sanctionner sur la couronne : une alerte sur elle ne demandait rien à personne. Le 3 septembre, le ping et le message privé avaient été retirés, mais l'encadré « 🚨 Indice de dangerosité élevé — PROPRIÉTAIRE du serveur … vérifie si son compte est compromis » restait posté dans les logs, pour une simple modification du serveur. Il ne l'est plus, et l'ajout d'un bot par le propriétaire — qui partait encore en alerte critique avec ping — suit la même règle. Les actions elles-mêmes restent journalisées une par une avec leur auteur, un propriétaire mis sous surveillance garde ses alertes, et la détection de compte compromis veille toujours.
- 🔗 Un lien transféré passait sous tous les filtres. La fonction « Transférer » de Discord poste un message qui n'a aucun texte à lui : ce qu'il affiche au salon — texte, liens cliquables, aperçus — est rangé ailleurs dans le message, et ni l'anti-scam, ni l'antilink, ni la protection des nouveaux membres ne le lisaient. N'importe quel membre pouvait donc transférer un lien de phishing depuis un autre serveur sans qu'il soit seulement regardé. Les trois le lisent désormais.
- 🌱 Un nouveau membre qui postait un lien recevait deux messages contradictoires. « Tu es nouveau ici : les liens sont limités… ça se débloque tout seul », puis aussitôt « Les liens ne sont pas autorisés ici » — et un avertissement comptabilisé par-dessus. Sur un serveur où l'antilink interdit les liens à tout le monde, la première phrase était fausse : rien ne se débloquerait. Les deux protections parlent maintenant d'une seule voix : quand la règle du serveur interdit le lien, c'est elle qui l'explique ; sinon, c'est la protection des nouveaux membres. Dans les deux cas, le lien est retiré.
- ⚠️ « Les liens ne sont pas autorisés ici » pouvait s'afficher sous un lien resté en place. Dans un salon où le bot n'a pas la permission de supprimer les messages, l'antilink annonçait le retrait quand même, et ne prévenait personne. Il dit désormais que le message n'a pas pu être retiré, et prévient le staff — une fois par salon.
- 🚪 Le mode « tous les liens » de l'antilink laissait passer une invitation écrite sans
https://. « rejoins discord.gg/… » était arrêté par le mode « invitations seulement »… mais pas par le mode le plus strict, celui qui promet de bloquer tous les liens. C'est corrigé, en respectant la liste des domaines autorisés comme pour n'importe quel autre lien. Et en mode « invitations », un GIF posté à côté ne masque plus une invitation. - 📡 Le signal « attaque en cours » retombait aussitôt posé. Quand le bot repère une vague d'arrivées ou une vague de messages identiques, il élève le niveau de menace du serveur pour que ses autres défenses se durcissent (rapport d'incident, pause de la maintenance, audit urgent…). Mais ce niveau commençait à redescendre dès la milliseconde suivante — et comme ces signaux sont calés pile sur leur seuil, il passait aussitôt dessous : seuls, ils n'atteignaient personne. Le niveau tient désormais sa valeur deux minutes avant de redescendre.
- 🎖️ Une montée de niveau qui apporte un grade ne mentionne plus le membre deux fois. Avec les grades activés, le bot envoyait « 🎖️ Promotion ! @membre accède au grade 🗺️ Explorateur ! » puis, juste après, « 🎉 Félicitations @membre ! Tu passes au niveau 6 ! » — deux messages et deux mentions pour un seul évènement. Il n'en envoie plus qu'un : « 🎉 Félicitations @membre ! Tu passes au niveau 6 et accèdes au grade 🗺️ Explorateur ! ». Si les annonces de niveau sont coupées, la promotion est toujours annoncée seule, et une promotion n'est jamais annoncée si le rôle n'a pas pu être donné.
- 🎂
+birthdaypeut enregistrer l'anniversaire de quelqu'un d'autre. Un admin du bot — palier admin de+perms, ou Administrateur — peut écrire+birthday @membre JJ/MM, ou le retirer avec+birthday remove @membre. Chacun enregistre toujours le sien, et tout le monde peut lire celui des autres. - ℹ️
+infoest plus complet — et plus juste. Les salons d'annonces, les scènes et les forums n'étaient comptés nulle part, et @everyone était compté comme un rôle.+infoaffiche aussi la sécurité du serveur (A2F exigée des modérateurs, filtre de contenu explicite) et ce qu'il manque de boosts pour le niveau suivant.+infoest désormais un vrai raccourci de+infos. - 🎣 L'anti-phishing annonçait « supprimé » même quand le lien était resté. Dans un salon où le bot n'a pas la permission de supprimer les messages, un lien de phishing restait affiché — cliquable — sous un message qui disait l'avoir retiré, et personne n'était prévenu. Le bot dit maintenant clairement « ne cliquez pas, je n'ai pas pu le retirer » et prévient le staff (une fois par salon). Même correction pour les webhooks : l'alerte aux propriétaires dit si le message est parti ou toujours visible.
- 📨 Les messages transférés passaient aussi sous les mots interdits et la détection de vagues. Après l'antilink et l'anti-phishing, les deux derniers filtres de contenu lisent désormais le texte d'un message transféré : un mot interdit transféré est retiré, et plusieurs comptes qui transfèrent le même message forment bien une vague coordonnée.
- 🤫 Une surveillance renforcée ne s'annonce plus. Quand une action sensible est validée par un seul owner, ou après un
+reset, le bot surveille le serveur de plus près pendant dix minutes — et il l'écrivait dans le salon de logs, que l'auteur de l'action voit. Un compte volé apprenait donc qu'il était surveillé, et pour combien de temps. La surveillance est toujours posée ; elle ne se dit plus. - 🧪 L'auto-contrôle (
+diag full) ne crie plus « test en échec » quand il a simplement manqué de temps. La batterie de tests prend aujourd'hui une centaine de secondes et l'auto-contrôle l'arrêtait à 90 : il affichait alors « ❌ test en échec » avec une ligne de journal au hasard. Chaque harnais a maintenant un délai à sa mesure ; s'il est quand même interrompu, le bilan le dit (« ⏱️ interrompu, aucun test en échec ») ; et un vrai échec affiche enfin le nom du test qui a échoué. - 🔤 L'aide d'une commande affichait sa syntaxe avec un
!qui ne marche nulle part. Quand une commande est mal tapée, le bot montre sa syntaxe et des exemples. Sur une trentaine de commandes, la syntaxe s'écrivait!commande …— le préfixe de convention du catalogue, jamais celui du serveur — et les exemples gardaient+même sur un serveur passé à un autre préfixe. Les deux suivent maintenant le vrai préfixe. Et+ticketai #salonsuffit désormais pour choisir le salon d'apprentissage. - 🔔 Une quarantaine posée par l'antiraid ne prévenait aucun propriétaire. Quand
+punitionréglait un module surquarantaine, le membre était bien isolé — mais le message privé aux propriétaires ne partait jamais, sans la moindre erreur visible. Le bot fournit désormais lui-même ce qui manquait, quel que soit le module qui déclenche la quarantaine : prévenir les propriétaires n'est plus un détail que chaque protection pouvait oublier. - 🎫 Le journal des tickets comptait faux, et parlait français aux serveurs anglais. Après 30 minutes de calme, un nouveau message du journal annonçait « 12 événements » en n'en montrant qu'un : il repart désormais à 1, comme le journal général. Et sur un serveur réglé en anglais, le titre du panneau d'ouverture, les valeurs par défaut du journal (« Aucune », « personne ») et trois mots des transcriptions restaient en français : tout est traduit, et le français ne change pas d'une lettre.
- 📖 L'aide garde ses boutons, et s'ouvre à la page voulue. Les flèches et le menu de
+helpdisparaissaient au bout de deux minutes — et un redémarrage du bot les laissait visibles mais morts. Ils marchent maintenant sans limite de temps, redémarrages compris. Et+help page 8(ou+help 8) ouvre directement la page 8 ; une page qui n'existe pas le dit, avec le nombre de pages. - 📦 Drops : un vrai message d'arrêt, et un interrupteur dans le menu.
+drops offrépondait « Drops désactivés. » et rien d'autre. Il dit maintenant ce qui s'arrête (plus aucune caisse ne tombe ; une caisse déjà tombée reste à prendre), ce qui est gardé (salons autorisés, plafond du jour) et comment revenir — et il dit aussi quand les drops étaient déjà coupés. Nouveau : un bouton 📦 dans+setup→ 📈 Niveaux & XP les active ou les coupe, comme l'annonce des niveaux. - 🏆 Retirer la salle des trophées retire aussi son salon. Couper la salle depuis l'assistant laissait le salon en place, avec un palmarès figé que plus rien ne mettait à jour. Le salon est maintenant supprimé — uniquement s'il a été créé par le bot et ne sert à rien d'autre (niveaux, starboard, logs…) ; sinon il est gardé, et la réponse dit pourquoi. Les records restent comptés :
+sdtles affiche toujours. Réservé au propriétaire du serveur. - 🛰️
+diagdisait le badge du site « actif » pendant que ses envois échouaient. La ligne « Heartbeat » vérifiait seulement qu'un jeton existait : le badge public est resté figé plus de deux semaines sans que rien ne le signale, et son dernier battement annonçait « 0 serveur », parti avant que le bot ne connaisse les siens.+diagdit désormais si les envois réussissent vraiment (code d'erreur et nombre d'échecs à l'appui), et plus rien n'est publié avant que le bot soit prêt. - 🔑
+custompermet+changerefusaient les alias.+customperm settings adminrépondait « commande inconnue » alors que+settingsmarche partout ailleurs. Un alias règle maintenant sa commande, sous son vrai nom — et avec les mêmes règles : un alias ne permet pas d'ouvrir au public une commande qui ne peut pas l'être. - 🎂 L'annonce d'anniversaire parle la langue du serveur. Son titre et son message par défaut étaient écrits en dur en français : un serveur réglé en anglais fêtait ses membres d'un « Joyeux anniversaire ! ». Ils suivent maintenant la langue du serveur ; un message personnalisé (
+birthday message) reste, lui, exactement celui de l'admin. - 🔒 Deux portes resserrées : quatre commandes ne peuvent plus être ouvertes à tout le serveur, et
+panicpasse aux propriétaires.+logs,+blgw,+blticet+nickpouvaient être mises au palier public — n'importe qui aurait alors pu déplacer le salon de logs, bannir quelqu'un des giveaways ou des tickets, et renommer n'importe quel membre. Et+panic, qui verrouille TOUS les salons, monte la vérification au maximum et passe l'antiraid en MAX, était ouverte aux administrateurs alors que+lockdown, qui en fait moins, est réservée aux propriétaires : les deux suivent désormais la même règle. Les paliers par défaut ne changent pas — personne ne perd un accès qu'il avait déjà. - 🛡️ Une commande ne peut plus agir sur un salon d’un autre serveur. Discord reconnaît la mention d’un salon (
#salon) sur tous les serveurs où le bot est présent, pas seulement sur celui où l’on tape. Un administrateur d’un serveur pouvait donc mentionner un salon d’un autre serveur, et le bot y agissait avec ses propres droits là-bas : le verrouiller, le déverrouiller ou le cacher (+autolock,+autounlock,+autohide,+autounhide), y ajouter des étiquettes de forum (+setsuggest), ou y poster un classement ou un panneau. Une trentaine de commandes lisaient la mention sans vérifier son serveur. Désormais, toute commande qui mentionne un salon d’un autre serveur est refusée, avec un message qui le dit — et elle ne retombe jamais en silence sur le salon où l’on tape, ce qui aurait par exemple déverrouillé le mauvais salon en plein raid. - 🎮
+steam: suivre les avis Steam d'un jeu dans un salon. Donne l'identifiant du jeu, le lien de sa page ou simplement son nom : chaque nouvel avis est publié au fil de l'eau, avec le verdict, le temps de jeu et le lien vers l'avis complet. Au plus 3 avis par jeu et par passage (toutes les 10 minutes), les suivants résumés en une ligne — un jeu très suivi ne transforme pas le salon en mur. Les liens contenus dans les avis sont retirés : un avis est écrit par un inconnu, et le bot le republie sous son nom. Jusqu'à 5 jeux par serveur, filtrage par langue, et l'ajout d'un jeu ne republie jamais ses avis déjà en ligne. - 🎫 …et
+closesuit lui aussi la langue du serveur. Le correctif précédent avait traduit « Aucune » partout dans les tickets sauf à un endroit : la commande+closesans raison passait encore le mot français à l'archive et à l'encart de fermeture d'un serveur anglais. - 📦
+backup load <identifiant>: une sauvegarde peut enfin partir vers un AUTRE serveur. Chaque version de sauvegarde porte désormais un identifiant, affiché par+backup list; tapé sur le serveur d'arrivée, il y recrée les rôles, les salons et les émojis qui manquent — sans rien modifier ni supprimer de ce qui existe déjà — et y copie les réglages transférables. Ce qui désigne le serveur d'origine reste sur place : salons, rôles, owners ajoutés, listes blanches, secrets, état en cours. Et ce qui donnait un accès ou un palier à un MEMBRE du serveur d'origine est écarté puis compté dans le compte rendu : ces gens-là n'ont rien demandé sur le serveur d'arrivée. Les protections de base ne peuvent pas être éteintes par un chargement. Réservé aux owners du bot, avec un aperçu avant confirmation. - 🔒
+stickerpouvait être amené à aller chercher une image sur la machine du bot. La commande accepte une adresse Internet, et une garde refuse depuis toujours les adresses internes (celles de la machine ou du réseau privé). Mais cette garde reconnaissait une seule écriture de ces adresses : une même adresse interne écrite autrement passait pour publique — et c’est précisément l’écriture que produit le lecteur d’adresses de Node. La garde décode maintenant l’adresse au lieu de reconnaître sa forme : toutes les façons d’écrire la même adresse sont traitées pareil. Aucune image publique n’est concernée — les liens habituels fonctionnent comme avant. - 🖼️ Les captures d'arnaque connues sont retirées partout. Les fausses « réussites de retrait » et autres captures que les comptes compromis recopient de serveur en serveur sont maintenant reconnues à l'empreinte — même recompressées, redimensionnées ou transférées — puis retirées par l'anti-scam, avec un avis qui dit de quoi il s'agit. La liste est tenue par le propriétaire du bot, elle vaut pour tous les serveurs, et tant qu'elle est vide rien n'est téléchargé.
- 📰
+newsmontrait un « quoi de neuf » amputé par les déploiements. La commande lisait un fichier d'historique suivi par git : chaque mise en ligne du bot (git archive | tar -x) le rendait à la copie du dépôt, et tout ce qui avait été publié depuis disparaissait — sans que rien ne le signale, puisque la commande affichait toujours quelque chose. Mesuré avant correction : sur les dix dernières versions publiées, neuf manquaient à+news, qui sautait du 2 septembre au 21 août. Elle lit désormais le registre durable, gardé en base (donc à l'abri des déploiements), fusionné avec l'archive pour les versions anciennes. Au passage : un serveur en anglais lit enfin ses nouveautés en anglais. - 🛡️ L’assistant
+setupétait la porte la plus large pour éteindre deux protections. Couper le bouclier anti-raid ou la sauvegarde automatique est réservé au propriétaire du serveur : c’est le cas pour la commande+shield offcomme pour le panneau de configuration. L’assistant, lui, est ouvert à tout administrateur — et il laissait couper ces deux-là. Un administrateur (ou un compte administrateur pris par quelqu’un d’autre, juste avant une attaque) pouvait donc désactiver le bouclier, ou ramener la sauvegarde automatique à zéro — ce qui ne se remarque que le jour où l’on en a besoin. Les trois portes disent maintenant la même chose : les ALLUMER reste ouvert à qui pilote l’assistant, seule la coupure demande la couronne, et le refus l’explique. - 🎁 « J'ai coupé les drops et des cadeaux tombent encore » : voilà pourquoi. Trois choses distribuent des cadeaux — les caisses surprise (
+drops), les événements automatiques (+autoevents) et le cadeau vocal (+vcgift) — et les deux premières se ressemblent exprès (mêmes raretés, mêmes emojis, mêmes couleurs). L'événement automatique porte désormais son nom et la commande qui l'arrête, et+drops offdit lesquels des autres restent allumés sur ce serveur. - ↩️ Des écrans dont on ne pouvait plus revenir — et un retour qui annonçait autre chose. Dans
+ticket, trois écrans (Formulaire, Règles d'ouverture, Panneau) portaient bien un bouton de retour… libellé « Boutons » avec l'emoji des couleurs : on lisait « aller aux couleurs » et on atterrissait à l'accueil. Ils disent maintenant « Retour » ↩️. Choisir une couleur de bouton éjectait en plus vers l'accueil à chaque fois — il y a trois couleurs à régler, donc trois allers-retours pour rien : on reste désormais sur l'écran des couleurs. Dans+setlogs, l'écran d'une action se terminait sans rien à cliquer : le retour vers la liste des aiguillages existait dans le code mais aucun bouton ne le proposait ; il est là, et il reconstruit la liste (donc à jour). Enfin,+massroleeffaçait tout son panneau quand le rôle choisi n'avait aucun membre — alors que rien n'avait été fait : le panneau reste, et l'information part en message privé. - ⏱️
+backupn'a plus de délai d'attente entre deux appels. Inspecter ses versions puis en restaurer une était freiné par trente secondes de pause ; la commande reste réservée au propriétaire et le frein anti-flood général s'applique toujours. Au passage, la règle des cooldowns est corrigée : un délai réglé à zéro veut dire « aucun » (il retombait sur le délai par défaut), et un réglage illisible ne supprime plus la limite d'une commande. - 📌 Un panneau de tickets, plusieurs salons, un seul geste. L'écran « Panneau » de
+ticketne savait poser le panneau que dans le salon où on l'avait ouvert : pour l'avoir dans trois salons, il fallait rouvrir+ticket settingsdans chacun d'eux. Un sélecteur de salons est arrivé à côté du bouton — jusqu'à dix salons d'un coup, et « Poser le panneau ici » reste pour le cas d'un seul. Le compte rendu dit ce qui a eu lieu au lieu de le supposer : les salons servis sont nommés ; un salon où le bot n'a pas le droit d'écrire est compté en échec et les autres sont servis quand même ; un salon qui avait déjà un panneau en reçoit un quand même, parce que le registre ignore les panneaux effacés à la main et que refuser aurait rendu impossible d'en reposer un — mais on vous le dit ; et on vous dit aussi quand les plus anciens sortent du registre, parce que « Supprimer les panneaux » ne les retrouvera plus. - 🔒 Deux restaurations ne peuvent plus tourner en même temps sur un serveur.
+backup restore, la reprise après raid et le chargement d'une sauvegarde venue d'un autre serveur passent tous par la même porte : tant qu'une restauration reconstruit salons et rôles — ça dure plusieurs minutes — la suivante est refusée en disant depuis quand, au lieu de recréer chaque salon et chaque rôle EN DOUBLE. Le verrou survit à un redémarrage et se libère tout seul si la restauration s'est interrompue. Au passage : une restauration qui échoue ne s'annonce plus comme « terminée ». - 🕳️ Le bot ne va plus chercher une adresse qui pointe vers l'intérieur de sa propre machine. Quand une commande ou une protection télécharge une image dont l'adresse a été choisie par quelqu'un d'autre (
+sticker, les créateurs suivis, l'antiscam par image, l'analyse des pièces jointes), cette adresse passe désormais par un seul garde — et le garde tient au moment de la CONNEXION, donc il refuse aussi une redirection ou un nom de domaine qui change de réponse après coup. Le contrôle existait déjà pour+sticker; il ne protégeait que+sticker. - ↩️ Trois écrans dont on ne pouvait plus sortir. La restauration après raid s'ouvrait sur une question — que faire des salons du bot ? — avec trois réponses et aucun moyen de renoncer : il fallait en choisir une, puis annuler à l'écran suivant. Le bouton Annuler est maintenant là, tout de suite. Dans
+bug, le choix de la catégorie ne laissait pas revenir à la question précédente : se tromper obligeait à tout relancer, et un rapport abandonné est un bug qu'on n'apprend jamais. Et l'écran qui confirme l'envoi de configuration vers un autre serveur ne portait qu'un seul bouton, rouge : il a désormais son Annuler l'envoi. - 🧪 Une configuration abîmée ne fait plus taire une commande. Quand une valeur enregistrée n'a pas la forme attendue — parce qu'elle vient d'une importation, d'une sauvegarde prise par une autre version, ou d'une modification manuelle —
+bl,+custompermet les compteurs de statistiques s'arrêtaient net, sans un mot. Ils lisent désormais la configuration par le même contrat que le reste du bot : une valeur illisible se lit « rien de configuré », jamais « panne ». Et le préfixe du serveur est validé par la MÊME règle à toutes les portes qui l'écrivent, y compris l'importation d'une configuration et la restauration d'une sauvegarde. - 📬 Un message transféré sans un mot n'entrait pas dans la file des demandes. Transférer au bot un de ses propres messages — « regarde ça » — est la façon la plus simple de signaler quelque chose : tout est dans l'encadré, il n'y a ni texte ni pièce jointe. Ces messages-là repartaient sans être enregistrés et sans accusé de réception. Ils sont désormais archivés avec un résumé de ce que l'encadré montrait ; tes propres mots, quand tu en écris, restent ceux qui font foi.
- 🩹
+bl <membre>ne fonctionnait plus depuis ce matin — corrigé. Un correctif déployé il y a une heure et demie avait rendu la commande incapable d'écrire : elle répondait par une erreur et aucun blacklist-rang n'était enregistré (ni retrait de rôles, ni dossier, ni journal).+blsans argument, lui, affichait toujours la liste — c'est ce qui l'a rendue invisible. Le contrôle automatique qui aurait dû l'attraper ne testait la commande qu'avec une cible DÉJÀ dans la liste : il n'atteignait jamais la partie qui écrit. Il exerce désormais aussi une cible neuve. - 🛡️ Un lien d'arnaque passait s'il était écrit sans
https://. La liste de blocage du bot compte plus de 36 000 domaines malveillants — mais elle n'était consultée que pour les adresses écrites en entier. Un domaine posté nu, ou maquillé comme le font ceux qui savent qu'un filtre existe (crochets ou parenthèses autour du point, un espace avant le point, le mot « dot » à la place, unhremplacé), n'était jamais comparé à la liste : il suffisait de retirer sept caractères. C'est corrigé, et ces formes sont reconnues. Un domaine écrit nu n'est confronté qu'à la liste des domaines déjà connus, jamais aux détecteurs d'imitation de marque : un message qui citeyoutube.comou un nom de fichier ne déclenche rien. Mesuré sur 59 193 textes réels du bot : aucun faux positif ajouté. - 🔐 Répondre à quelqu’un ne le rend plus propriétaire du serveur. Quand on tape
+owner addsans cible — le geste naturel pour en relire la syntaxe — le bot prenait la personne à qui l’on répondait : Discord place l’auteur du message cité parmi les mentions. Et là où un seul propriétaire peut confirmer, aucune seconde validation n’était demandée : le co-propriétaire était créé en un message, avec tous les pouvoirs de sécurité qui vont avec. Le même piège valait pour+antiraid whitelist add, qui exempte de toute la protection anti-raid. Désormais, une cible prise uniquement dans une réponse est refusée : le bot nomme la personne et redonne la commande exacte à taper. Écrire la cible (mention ou identifiant) fonctionne comme avant, et lire la liste blanche depuis une réponse reste possible. - 🔑 Les commandes qui règlent « qui peut quoi » montrent enfin des exemples.
+help cmdperm,+help change,+help changeall,+help permpresetet+help permsalonn'affichaient qu'une syntaxe — exacte, et illisible :!permsalon add <commande> #salon @rôledécrit la grammaire, pas l'usage. Chaque fiche porte désormais des exemples à recopier, écrits au préfixe de ton serveur, plus une phrase qui dit ce que la commande fait vraiment (une exception nominative, un remplacement complet, un ajout…). - 🔐 Répondre à quelqu’un ne lève plus son bannissement, et ne lui donne plus un rôle. Deux commandes prenaient pour cible la personne à qui l’on répondait, faute de cible écrite — Discord place l’auteur du message cité parmi les mentions.
+unbltapé en réponse sans cible levait la blacklist de cette personne, son bannissement sur le serveur, et le même bannissement sur tous les serveurs où celui qui tape est propriétaire ; avec un seul propriétaire éligible, aucun second accord n’était demandé.+temprole addfaisait pire : la mention de réponse passait devant un identifiant pourtant tapé, donc le rôle allait à la personne citée pendant que la cible écrite était ignorée, sans un mot. Désormais une cible prise uniquement dans une réponse est refusée — le bot nomme la personne et redonne la commande exacte à taper — et une cible écrite l’emporte toujours. Hors réponse, rien ne change. - 📋
+antiraid whitelist listmontre enfin la même chose que+wl. Les deux lisaient déjà la même liste, mais chacun avec sa mise en forme — désormais il n'y en a qu'une. Pour le propriétaire, la sous-commande donne exactement+wl, panneau d'ajout et de retrait compris. Pour un administrateur, la même liste, sans le panneau : modifier la liste qui exempte de toute la sécurité reste réservé à la couronne 👑. Au passage, un vrai défaut :+wln'avait aucune limite d'affichage et, au-delà d'environ 186 membres whitelistés, l'encadré ne s'affichait plus du tout — la commande ne répondait plus rien. La liste est bornée, et le pied de page continue d'annoncer le compte réel. - 🛡️ Le rapport d'attaque ne voyait qu'un cinquième des défenses.
+postmortemet le compteur « menaces neutralisées » de+digestne lisent qu'un seul journal — et douze des quinze chemins de sanction du bot n'y écrivaient rien. Une quarantaine posée par le réseau anti-menaces, par la détection de compte compromis ou par le bouclier de raid n'apparaissait nulle part. Les deux points de passage (quarantaine et sanction antiraid) y inscrivent désormais chaque acte, avec le module qui l'a décidé — et une défense qui ÉCHOUE est enregistrée comme telle, au lieu d'être comptée parmi les menaces neutralisées. - 🔐 Répondre à quelqu’un ne le destitue plus, et ne lui donne plus une commande. Deux dernières commandes prenaient pour cible la personne à qui l’on répondait, faute de cible écrite.
+unownertapé en réponse sans cible retirait la propriété du serveur au co-propriétaire cité, sans confirmation : c’était la porte de sortie de+owner add, protégé le même jour — défaire restait plus facile que faire.+cmdperm <commande> addtapé en réponse accordait cette commande à la personne citée,+bancomprise. Une cible prise uniquement dans une réponse est maintenant refusée : le bot nomme la personne et redonne la commande exacte à taper. Écrire la cible fonctionne comme avant, et un rôle mentionné reste une cible valide. - ↩️ On venait du guide, et on ne pouvait plus y retourner. Le bouton « Assistant » de
+guideremplace la check-list par l'assistant — et aucun écran de l'assistant ne ramenait ensuite au guide : il fallait retaper la commande. Le récapitulatif de fin (celui qu'on atteint aussi en cliquant « Fermer » à n'importe quelle étape) porte maintenant un Revenir au guide ↩️, et il rend la check-list à jour. Il n'apparaît que dans le serveur configuré : l'assistant pilote aussi un serveur à distance depuis un message privé, et là le guide ne saurait pas lequel afficher — un bouton qui ne fait rien est exactement ce qu'on est en train de corriger partout. - 🇬🇧 L'aide anglaise était à moitié en français, et rien ne pouvait le dire. Le bot vérifiait déjà que les deux langues gardent les mêmes mots à taper — c'est indispensable, sinon l'aide décrirait une commande qui n'existe pas. Mais ce contrôle efface les parties variables (
<durée>,<#salon>,<émoji>…) avant de comparer : elles pouvaient donc rester en français indéfiniment. 24 syntaxes de commandes sont traduites (<duration>,<#channel>,<emoji>,<new prefix>,<source server ID>…), et l'une d'elles était même à moitié traduite dans le même chevron. Ce qui reste en français y reste pour une raison écrite : un nom de langue, un titre d'œuvre, un nom propre, ou un mot que vous devez taper tel quel. - 🔐 Répondre à quelqu’un ne le vise plus : cinq commandes sensibles corrigées d’un coup. Discord place l’auteur du message auquel on répond parmi les mentions ; faute de cible écrite, cinq commandes le prenaient donc pour cible.
+perm <palier> addaccordait le palier admin à la personne citée — et écrire la cible ne sauvait pas, la commande ne lisant jamais ce qui était tapé : elle le lit désormais.+purgeseul supprimait 100 messages de la personne citée (tous les salons avecall),+unbanlevait son bannissement,+unwlretirait son exemption antiraid et+sanctions clearvidait son casier entier. Une cible prise uniquement dans une réponse est maintenant refusée, en nommant la personne et en redonnant la commande à taper. Les commandes d’affichage (+avatar,+history…) ne changent pas : y répondre pour désigner quelqu’un reste le geste attendu. - 🚪 Les expulsions à la porte et les bannissements du réseau entrent au rapport d'attaque. Le filtre d'âge des comptes, l'écran d'arrivée (indice de risque élevé) et le réseau anti-menaces agissaient sans laisser de trace dans
+postmortemni dans le compteur « menaces neutralisées » de+digest: un serveur qui avait refusé trente comptes jetables pendant une vague lisait « aucun incident ». C'est corrigé, et une action qui ÉCHOUE (permission manquante, membre plus haut que le bot) est enregistrée comme un échec, jamais comme une menace neutralisée. - 🛡️
+bantapé seul en réponse à quelqu’un le bannissait. C’est corrigé, avec quatre autres commandes de la même famille. Discord place l’auteur du message auquel on répond parmi les mentions, et une commande sans cible écrite le prenait donc pour cible. Le piège s’apprenait à l’envers : hors réponse,+banseul ne fait rien (« il me faut une cible »), donc on retient que la commande est sans effet sans argument — et les mêmes touches, tapées en réponse, bannissaient, avec 24 h de messages supprimés et le motif « aucune raison ». Même correction pour+unmute(qui levait l’exclusion de la personne citée),+nukeadd del,+blrank, et+note, où+note listen réponse cessait d’être la vue du serveur pour publier le dossier d’un membre devant lui. Désormais une cible prise uniquement dans une réponse est refusée : le bot nomme la personne et redonne la commande exacte. Écrire la cible fonctionne comme avant, et les commandes d’affichage ne changent pas. - 👢 Trois commandes de sanction de plus ne visent plus la personne à qui l'on répond. Suite directe du correctif précédent, sur les trois qui EXPULSENT, BANNISSENT et EXCLUENT. Discord ajoute l'auteur du message cité aux mentions :
+kicktapé seul en réponse expulsait cette personne, embed de confirmation compris, et+tempsmutela rendait muette dix minutes — sans qu'un seul argument ait été écrit, la durée ayant une valeur par défaut. Et la commande enseignait l'inverse de ce qu'elle faisait : hors réponse,+kickseul répond « mentionne un membre ».+tempbanrefusait déjà, mais par accident — sur « durée invalide », faute de durée par défaut — il est gardé aussi. Les trois nomment désormais la personne qu'elles auraient visée et demandent de l'écrire ; répondre en écrivant la cible reste permis. - 🛡️ Le rapport d'attaque montre enfin la défense, pas seulement les sanctions. Le bouclier de raid monte de niveau tout seul pendant une vague — ralentissement du salon d'accueil, surveillance renforcée, mise en quarantaine automatique des arrivées — puis redescend quand le calme revient. Rien de tout ça n'apparaissait dans
+postmortem: on y lisait trois quarantaines sans jamais voir la ligne qui les explique. Les montées et les retours au calme y sont désormais, et un passage sans changement de niveau n'écrit rien (un journal noyé ne se lit plus). - 🎯 Un salon supprimé pendant un quiz ne le condamnait plus à « une partie est déjà en cours ». Une partie dure plusieurs minutes. Si le salon était supprimé entre-temps, le bot ne parvenait plus à libérer le verrou posé au démarrage — et ce salon restait marqué « partie en cours » jusqu’au redémarrage du bot. Rien ne le signalait : aucune erreur affichée, seulement
+quizzqui refusait de démarrer sans qu’on comprenne pourquoi. Le verrou se prend et se rend désormais sur le même identifiant, relevé une seule fois au départ. - 💸 Une course dans un salon supprimé en pleine partie gardait les mises. Le remboursement de fin de
+coursepassait par une lecture du salon — qui n’existe plus — et échouait en silence : personne n’était remboursé, et le salon restait marqué « course en cours » jusqu’au prochain redémarrage. Même correction pour+lotoet+sondagefun, qui posent le même verrou, et pour le message épinglé, dont la même lecture — faite cinq secondes plus tard, dans une minuterie — pouvait faire redémarrer le bot.+quizz, où le problème a été repéré, était corrigé juste avant. - 🎮 Le suivi des avis Steam ne se tait plus en silence quand il ne peut plus publier. Le bot mémorise les avis qu'il vient d'annoncer AVANT de les envoyer, pour ne jamais republier deux fois le même lot. Mais mémoriser, c'est brûler : si le droit d'écrire dans le salon lui avait été retiré depuis (permission changée, salon verrouillé), ou si le salon disparaissait pendant la lecture des avis, le lot était quand même marqué « vu » — les avis ne paraissaient jamais, et rien ne le disait. Toutes les raisons de ne pas pouvoir publier sont désormais vérifiées AVANT la mémoire : plus rien n'est perdu, et tout ressort au tour suivant dès que le salon est rendu.
+steamaffiche enfin « je n'ai plus le droit d'y publier » au lieu d'un salon d'apparence saine. - 🎯 Écrire la cible de
+unflaget+heistne servait à rien si on répondait à quelqu’un. Ces deux commandes lisaient la mention avant l’argument — et comme Discord place l’auteur du message auquel on répond parmi les mentions, c’est lui qui était visé, l’identifiant tapé étant ignoré sans un mot.+unflaga la conséquence inversée du reste : il ne sanctionne pas sa cible, il l’innocente — dossier de dangerosité effacé sur tous les serveurs, définitivement. On perdait donc le dossier de quelqu’un qu’on n’avait jamais visé, sans que rien ne le signale.+heistbraquait la personne citée, qui perdait jusqu’à un quart de son aura. Les deux lisent désormais la cible écrite en priorité, et refusent une cible prise uniquement dans une réponse en nommant la personne concernée. - 🛡️ Le chemin qu'emprunte chaque ARRIVÉE est désormais éprouvé avant chaque mise à jour. C'est celui qu'un raid frappe en premier, et c'est le plus peuplé du bot : 25 protections s'y déclenchent (anti-bot, anti-raid, flot d'arrivées, quarantaine, bouclier, écran d'arrivée, autorôle, anti-usurpation, réseau de menaces…), soit plus du double de celles qui lisent un message. Aucune n'avait jamais été lancée ailleurs qu'en production, parce qu'il faudrait pour cela faire entrer de vrais comptes sur de vrais serveurs. Un banc les exécute maintenant toutes, sur 16 arrivées hostiles (comptes créés à la seconde, pseudos en caractères invisibles, homoglyphes du propriétaire, inversion du sens d'écriture…) plus une vague de 25 comptes neufs — un raid, en somme. Verdict : aucune exception, aucune sanction sur une arrivée ordinaire.
- 🔬 Et la barrière qui garde les mises à jour écrivait dans la vraie base de données. Elle affirmait le contraire. Son verdict pouvait donc dépendre de ce que cette base contenait, c'est-à-dire virer au vert ou au rouge pour des raisons étrangères au code — une barrière dans cet état, on finit par ne plus la croire. Réparée, et les deux bancs partagent désormais une seule et même isolation. Effet visible au passage : la vérification la plus coûteuse passe de 361 ms à 7 ms.
- 🔑 Le préfixe du serveur ne peut plus entrer par une porte de service. Ce qu'un préfixe a le droit d'être — trois caractères au plus, pas de backtick, jamais une simple lettre — est une règle tenue à UN seul endroit. Mais six endroits du bot écrivent ce réglage, et deux ne la consultaient pas : la restauration automatique quand on ré-invite le bot, et les boutons du guide envoyé au propriétaire à l'arrivée. Un préfixe hérité d'un vieil instantané pouvait donc revenir s'installer — or un préfixe démesuré rend muettes huit commandes, dont
+configet+menu, celles-là mêmes qui serviraient à le corriger. Les six portes appliquent désormais la même règle,+prefixl'APPELLE au lieu d'en garder une copie, et le compte des portes est tenu par un balayage du code : une septième qui oublierait la règle fait rougir les tests le jour où elle est écrite. - 🧯 Retirer une image d'arnaque de la liste ne peut plus en emporter d'autres. La commande accepte un numéro de ligne ou un début d'empreinte. Quand le numéro ne désignait aucune ligne — une faute de frappe, une liste plus courte qu'on croyait — il était relu comme un début d'empreinte :
del 99effaçait alors TOUTE règle dont l'empreinte commence par « 99 », et l'annonce n'en nommait qu'une. Même chose pour un début d'empreinte d'un seul caractère, qui emportait environ un seizième de la liste. Cette liste étant GLOBALE — elle protège tous les serveurs —, un retrait de trop se paie partout. Un numéro qui n'existe pas est désormais refusé en le disant, et un début d'empreinte doit faire au moins quatre caractères. - 💣 La destruction du serveur par un administrateur est désormais répétée avant chaque mise à jour. Un raid fait ENTRER des comptes ; un nuke DÉTRUIT ce qui existe, et il vient de quelqu'un qui a déjà les droits — un administrateur compromis, un staff qui part mal, un bot à qui on a trop donné. 23 protections veillent sur ce chemin (8 sur la suppression de salons, 5 sur celle des rôles, 4 sur les webhooks, 6 sur les réglages du serveur), et aucune n'avait jamais été lancée ailleurs qu'en production — l'éprouver pour de vrai voudrait dire supprimer dix salons et dix rôles sur un vrai serveur. Un banc les exécute maintenant toutes : rafale de suppressions, rafale de rôles, webhook créé puis serveur renommé. Verdict : la rafale est sanctionnée, et le propriétaire est épargné — c'est l'invariante la plus importante du lot, parce que si le bot lui retirait ses rôles par erreur, plus personne n'aurait les droits pour réparer quoi que ce soit.
- 🎁 Le « cadeau surprise » du tirage vocal donne enfin quelque chose. Quand aucun lot n’était configuré, le gagnant recevait un message privé le félicitant pour un cadeau surprise 🎁 et l’invitant à contacter le staff pour le réclamer — sauf que le staff n’avait rien à remettre : le lot était un texte, pas une récompense. Le tirage verse désormais 25 à 75 XP, plus le bonus d’aura que le bot accorde déjà à tout gain de jeu, et le message annonce le montant exact au lieu de renvoyer vers le staff. Si un lot a été configuré (
+vcgift reward), rien ne change : c’est l’équipe qui le remet, comme avant. - 🎯 Répondre à quelqu'un ne peut plus le désigner comme cible — et le contrôle qui le garantit ne se recopie plus. Discord place l'auteur d'un message cité parmi les mentions : une commande de modération tapée SANS cible, en réponse, visait donc cette personne-là. Trois lots avaient fermé la porte commande par commande. Il manquait l'essentiel : la liste des commandes protégées était recopiée à la main dans les tests, donc une commande ajoutée demain pouvait arriver sans garde sans que rien ne le signale. Le compte se fait désormais sur le code lui-même — les 29 commandes qui désignent quelqu'un sont soit gardées, soit inscrites avec la RAISON qui les en dispense et la forme de code qui rend cette raison vraie. Et la règle, qui existait en SIX exemplaires recopiés (deux avaient déjà divergé), n'a plus qu'une seule écriture.
- 🗄️ Une capture de salon supprimé ne peut plus ressortir d'une vieille sauvegarde. Avant de vider un salon, le bot en garde une capture pendant six heures pour pouvoir le remonter — pseudos et texte des messages compris. Cette capture était déjà exclue des sauvegardes de serveur, mais la RESTAURATION, elle, la laissait revenir : une sauvegarde faite par une version précédente du bot réécrivait jusqu'à 120 Ko de messages de membres par salon, sous des clés désignant des salons qui n'existent plus, des heures après la fin du délai de six heures. L'intention était pourtant écrite dans le code — « ni à en sortir lors d'une restauration » —, mais la règle existait en deux exemplaires et un seul avait appris à reconnaître ces captures. Il n'y en a plus qu'un.
- 🛡️ Un salon supprimé ne désarme plus le frein de la quarantaine. Un membre en quarantaine ne peut écrire qu’à intervalle : au-delà, son message est supprimé et il reçoit un rappel. Ce rappel était posté dans le salon — et si le salon venait d’être supprimé, l’envoi échouait, l’erreur était avalée, et le frein rendait « message non freiné ». Le compte en quarantaine repassait donc au travers, sans la moindre trace dans les journaux. Le rappel est un confort, le freinage est la règle : si le salon n’est plus là, le bot se tait et freine quand même.
- 📍 Un salon supprimé ne peut plus faire trébucher le traitement d'un message. Pour le bot, « le salon d'un message » n'est pas une donnée figée : c'est une recherche dans sa mémoire, refaite à chaque lecture — et elle ne rend plus rien dès que le salon a été supprimé. Un jeu en a déjà fait les frais : le verrou du salon n'était pas rendu, et la commande répondait « une partie est déjà en cours » jusqu'au redémarrage. Les six derniers endroits qui lisaient le salon de cette façon pour n'en tirer qu'un identifiant lisent désormais l'identifiant porté par le message lui-même, qui ne peut pas disparaître.
- 🪜 « Je me donne les pleins pouvoirs, puis je vide le serveur » est désormais répété avant chaque mise à jour. C'est l'autre moitié du sabotage : le contrôle précédent détruit des salons et des rôles, celui-ci s'en prend aux gens. 29 protections veillent sur ce chemin — quand quelqu'un reçoit un rôle, quand un membre est banni, quand un membre part — et aucune n'avait jamais tourné ailleurs qu'en production. Le banc pousse maintenant : un rôle d'administrateur donné à un compte de trois jours, un rôle donné à quelqu'un que vous avez bloqué par
+blrank, le bot qu'on tente de neutraliser en lui retirant ses droits, puis huit bannissements et huit expulsions d'affilée. Verdict : la personne bloquée ne garde pas son rôle, le propriétaire n'est jamais sanctionné, rien ne plante. - 🛡️ Un salon supprimé pendant le traitement d’un message ne coupe plus l’automodération. Le bot relisait le salon à chaque étape — et un salon effacé (ou simplement sorti de son cache, ce qui arrive aux fils toutes les heures) faisait échouer l’étape en cours et toutes les suivantes : l’avertissement ne partait pas, et le reste des filtres du message était abandonné en silence. Le salon est désormais retenu une seule fois, à l’arrivée du message, si bien que les protections déjà écrites contre les envois ratés fonctionnent enfin.
- 📉
+derank @member— strips what gives someone power, while leaving their member role and decorative roles. The bot could already demote on its own in five situations, never on request — and a+massrole delwould also have taken their colour and their membership, turning them into a stranger who cannot write. Undoable with+rerank, like the other five. - 🎭
+blrank— “this person will never be promoted again”, without banning them. It is its own command, not another name for+bl:+blstrips roles and bans on return,+blrankstrips roles and sanctions whoever grants one, full stop. For a permanently demoted ex-staffer, the only available tool was a ban — four notches too high, chosen for lack of anything better. - 🔍 The log could credit a role addition to whoever made a removal — the author was looked up once for both, with added and removed roles mixed together: the first audit entry touching any of them signed both lines. Two actions crossing on the same member within fifteen seconds — a grade granted by the bot while a moderator strips a role — was enough to read “@Mod added the Staff role”. A false accusation in the very record you re-read after an incident. Each line now carries its own author.
- 🔒 Quarantine required “Ban Members”, although it bans nobody — it strips roles and applies an isolation role, which is exactly what “Manage Roles” already allows by hand. The moderator it was built for could not use it, and fell back on something harsher for lack of access to the gentler option. The gate now matches the power actually exercised.
- 🏆 The two rewards for first of the month are now one. “🏆 Games champion” and “🥇 Top 1 activity” were two gold hoisted roles side by side, same cadence, usually the same person: the reward showed up twice at the top of the member list. It is now 🏆 Champion of the month, a single role, earned either way — and kept as long as you deserve one of the two. Servers that had both see the duplicate disappear, whoever wore it receives the single role, and the log explains the merge. A role an administrator had since given permissions to is never deleted: it is no longer a decoration, so it stays, and we say so.
- 🔑 The names from the documentation finally exist.
+set perm,+del perm,+clear perms,+change,+changeall: five forms written in the permissions docs, and nowhere in the bot. The functions were there, under other names — anyone following the documentation typed an unknown command. The new names reimplement nothing: they hand over to the existing commands, which keep their own gates.+del perm modo @Staffrefuses when the target sits at another tier, and says which one: removing blindly would have taken their real tier away. - 📚 The documentation site catches up with the bot. 22 commands had no card at all — so they did not exist for anyone discovering the bot through the docs. 47 descriptions and 35 usage lines described behaviour the bot no longer has; an outdated syntax means the page itself makes you type a command that fails. 11 cards ignored an alias added since. The counters follow.
- 🆕 Seven features had no door in
+menu. File filter, attachment burst, forbidden emojis, automatic reactions, booster role and XP, rerank window: twelve settings reachable only through their own command, and only if you knew its name. They now have a page —+menu→ 🆕 Recent modules — with each one's state in plain sight. The screen reads and writes through the modules' own functions, so it cannot accept what the command refuses, nor the reverse. And it promises no more than it does: an automatic reaction pairs an emoji with a CHANNEL, so that stays+autoreact— the screen shows the state and says so, rather than offering a degraded setting that would look complete. - 🏆 The end-of-season podium was posted four times, and not in the games channel. Reported this morning with a screenshot: four identical podiums in the same minute. It was not four calculations — it was ONE message the network layer replayed three times, having assumed each send was lost when it had gone through. Monthly announcements now take the path that never insists: one lost message beats four copies. And the games podium now goes to the games channel — until now it landed in the server's system channel, for lack of knowing the one the wizard creates for it.
- 🔑 Stripping sensitive permissions is a server-owner action again. The button offered under the “sensitive role modified” alert accepted any administrator — that is, precisely the person whose action the alert is reporting. Someone who had just granted themselves “Administrator” could then work the removal menu themselves. The check moves up to where the alert is addressed, and the refusal message finally states the real gate.
- 🌍
publicbecomes a tier — and stays impossible on anything harmful.+change <command> publicopens a command to everyone. The mechanism already allowed it silently:canUsecompares the member's tier to the command's, so a 0 in the database opened everything — only the WORD was missing, which is the worst kind of safeguard: the one that protects until someone finds the door. The word arrives with its lock: banning, kicking, purging, mass promotion, everything the bot ranks as “critical security”, and everything Discord already reserves behind a sensitive permission — the refusal is plain, and nothing is written.+changeallobeys the same rule and states how many commands it left out. - 🚩
+reportexplains instead of reporting. Reporting happens on the message itself: long-press (or right-click) → Apps → “Signaler ce message”. It is the safer path, and it already existed: the command duplicated it, less reliably — it had to guess who was targeted from a reply and a mention, so much so that a safeguard had been added against+report @Someonewritten in reply to somebody else's message.+reportis now the screen that shows both gestures, states what the staff receives, and says whether anonymity is on for that server. When the module is off, it says so instead of describing a menu that will not appear. - 🎨 The changelog takes the logo's colour. It used to be gold — the MINORITY colour of the icon. Measured pixel by pixel, transparency and greys excluded: 82.4% of the logo is blue
#5865F2, 16.8% gold. A configured theme still wins: this is a default, not an imposed colour. - 🔗 New shortcuts are announced. A brand-new command ships with its aliases — they are in its help entry. But an alias added to a command that already existed was announced nowhere: the shortcut existed, worked, and nobody learned it. The data was already there — the bot memorised aliases to tell a removal from a rename; it was the question that was never asked. The field is capped like the others: past a thousand characters Discord rejects the whole message, not just the field.
- 🎫 Three limits on tickets, and two missing commands.
+ticket max <1-10>: how many cases one person may keep open — the limit was already 1, hard-coded; the rule existed without being adjustable, so nothing changes for anyone who leaves it alone.+ticket interdit @role: the mirror of required roles, and the refusal names the blocking role — a bare “access denied” sends the member to DM the staff, exactly what tickets exist to prevent.+ticket depart oncloses the ticket when its author leaves the server; off by default, because members leave by accident and their ticket often holds the only written record of a dispute. - ✋
+claimand+rename. The “Take charge” button scrolls away: in a fifty-message ticket you have to go back to the first message to find it — so two people answer at once.+claimdoes the same from the keyboard, with the same rules (called, not copied), and+claim librereleases it.+rename remb-commande-4412makes a ticket list readable. Discord caps renames at 2 per 10 minutes and queues the call instead of failing: the command hands back saying so, rather than staying silent for minutes. - 🧩
+custom <keyword>finally opens its menu. The full editor already existed — eleven fields, ten options: response, destination, roles granted and removed, roles allowed and denied, log channel, target, auto-delete, pause, delete. You simply had to know the+setup → Custom commands → (pick)path. The natural gesture — typing the keyword you had just created — answered “unknown action”, the one reply that teaches nothing. It is the same screen that opens, not a copy: two editors for one command would end up offering different options, and nobody would know which one is authoritative. - 🎲 A custom command can hold several responses, one drawn at random on each call.
+custom set salut reponse+ Hey there!adds one; up to eight. The original response stays the main one — a command already set up answers exactly the same until you add something, and every screen that displays it keeps working without migration. - ⏳ A cooldown that applies to the whole server, not just per member. Both now exist, and they answer different questions:
cooldownsays “once a day each”,cdglobalsays “once a day, for the entire server”. The second is what a command that posts in a public channel — or hands something out — actually needs. The refusal is distinct: “come back in 5 min” on a global cooldown would make the member think they are the one being limited, when the command is closed for everybody. - 🎟️ Several kinds of tickets, each with its own settings.
+ticket type add 💰 Refund, then its category, the roles pinged, the roles granted access, its opening message, its log channel and its channel name — all optional, and whatever is missing falls back to the server's configuration. The panel adapts: one button per type, a dropdown past five (a Discord row holds only five, and the dropdown also shows the descriptions). A server that defines none keeps exactly the panel it had, down to the button and its colour — and a corrupted configuration falls back there too, rather than breaking ticket opening. - ✋ Four ways to claim a ticket —
+ticket claim <mode>. It used to be a plain switch: claimed, or not.simplemarks the ticket as before ·locklets only the holder write while the rest of the staff can still read (so a colleague can take over knowing what happened) ·hidemakes it disappear for everyone else, for sensitive cases ·autohands it to the first staffer who writes in it — nobody thinks to click before replying, and an unclaimed ticket is one two people handle at once. The person who opened the ticket always keeps access: it is their request. - ➕ The settings screen now says WHICH of the four is on. It only said “enabled” — which suggested plain marking on a server that may be hiding tickets from its whole staff. And its on/off button no longer loses the mode: switching off then on restores the previous one instead of quietly resetting everything to “simple”.
- 🧾 The ticket panel can carry YOUR text —
+ticket source <bot|dernier|link>. The bot always wrote its own card, so a server that had already written its welcome announcement had to choose between keeping its text and having the button. The panel can now copy the latest message of the target channel, or any message whose link you paste — the open button is still posted by the bot either way. The original message is not moved (its reactions and replies stay), and its mentions do not ping a second time. If the source becomes unreadable, the bot says so instead of quietly posting its own card. - ⚙️ Ticket settings become a SCREEN, not a list of commands you have to know.
+ticket settings→ Opening rules: simultaneous tickets, roles barred from opening, claim mode, panel text source and close-on-leave — all set by clicking, and the screen SAYS what is set. The sub-commands do not go away: a server that wrote+ticket max 3in its internal docs keeps its sentence. - 🔗 Custom-command buttons learn three new things.
+custom lien <keyword> <https://…> <label>adds a link button (it opens the address; https only, because an invalid URL would make Discord reject the WHOLE message and the command would stop answering).+custom composants <keyword> off 2greys out a button without deleting it — and it runs nothing, even if a click still arrives.+custom composants <keyword> mode 2 public|prive|remplacerpicks how it answers: in the channel (as today), to the clicker only, or by replacing the message — the last one is what finally makes a real multi-step menu instead of a pile of replies. The listing shows each component's state. - 🖼️ A custom command's embed stopped at four settings — title, colour, image, footer. It gains the thumbnail (
embedthumb), the author and its icon (embedauthor,embedauthoricon), the footer icon, the title link (embedurl— and the bot warns it will not show without a title, since Discord only renders it there), the timestamp (embedtime) and above all up to five fields:+custom set tarifs champ 1 Monthly | €5 !— the pipe separates name from value, a trailing!makes the field inline. That is the difference between a readable price list and a wall of text. - 🌐 The bot is fully bilingual. The last screens still written in French — Make It Meme stats and end-of-game screen, the OffBackup cleanup and its report, the AutoMod labels in the logs — now speak the language chosen on the server. No hard-coded French text remains: the counter reads zero, and the counter itself is tested (it is fed French to find, to prove it has not simply gone blind).
- 🛡️ Security alerts can no longer get lost on the way. The three alert families — security-config change, owner alert, anti-raid alert — were fired best-effort from dozens of places, with nobody awaiting the result. They now carry that contract themselves: a delivery failure is logged instead of vanishing into a global safety net, and it can no longer take down the action that triggered it.
- 🔎 Seven commands served a “status” view nobody could guess.
+lockword status,+autoslowmode status,+creation status,+oncall status,+pinlog status,+drops statusand+createur listalready worked — no help line mentioned them. That is the defect you flagged on+blrank: the feature exists, nobody can find it. All seven are now announced, in both languages. - 🧹 When the bot leaves a server, it finally stops refreshing its panels. Live panels (
+base,+alertesnipe) stayed tracked forever: the bot kept fetching their messages in channels it can no longer see, every cycle. Nothing visible to you — but it was pointless work that never stopped. The record is kept: if the server re-invites the bot, its panels re-arm as before. - 👁️ Three features existed with no way to find them.
+custompermon its own lists your permission overrides;+digest journal apercushows today's summary without consuming it;+birthday message <text>customises the birthday message. All three already worked — no help line mentioned them, and+digest journal's own error listed everything EXCEPT the preview. Of the 29 unannounced sub-commands reviewed, these were the only real ones: the rest were convenience shortcuts. - 🔒 Two security locks tightened. The bot can no longer mention
@everyoneor@herewhen replying to a mistyped message — its reply echoed the text it received, and only a send-time guard was missing for that text to become a real mention again. And+massrolenow re-checks the role when applying it, not only when picking it: the selection can change in between, and it is the applied role that counts. Found in adversarial review, reproduced, then locked down by tests that replay the attack. - ⚖️ Report buttons now respect rank. “Quarantine” and “Ban” checked the permission but never the hierarchy: a moderator could sanction an administrator placed above them — something neither
+bannor Discord would have allowed. The bot's shared check is now called there too, with the same exemption as everywhere else. - ⏱️ A custom command's mute lasted sixty times too long. The duration was written in seconds and read back as minutes:
10mmuted for 10 hours,2hfor five days — and1j, which then exceeded the cap, fell back to 10 minutes, so the longest sanction became the shortest. The applied duration is now the one you set. - 🛑
+custom set <keyword> cdglobalblocked nothing. The server-wide cooldown was accepted, announced and saved — then discarded on every read, so it had no effect at all. A command set to “once a day for everyone” could still be re-run endlessly. It works now. - 🖼️ The level-up announcement is finally configurable.
+setup→ Levels: a button picks between the image card (as today) and a plain embed, lighter. The code already tested this setting on every level-up — nothing could write it, so the card was forced on everyone. - ⚖️
+punition <module> <sanction>finally acts. The PER-MODULE scale was written, displayed… and never reached the code that sanctions: the thirteen places applying an antiraid sanction all forgot to say WHICH module they were about. So setting+punition antichannel derankchanged nothing — only+punition allworked, which is what hid the problem. The default is unchanged: with no setting, it is still a ban. - 📋
+config Pushno longer copies one server's lived history onto another. Four families of keys slipped past the filter: report archives (dated, so invisible to the other rules), histories written_histinstead of_history, milestones_done— cloneonboarding_doneand the target server never shows its welcome screen, believing it already did — and publication locks, which made it skip a report it never received. Real settings still copy as before. - 🔑 The permissions screen hid six tiers out of nine.
+setup→ Permissions lets you pick all nine tiers, but only displayed the first three: a role placed at tier 4 to 9 was saved and active — and completely invisible on the very screen meant to show who has access. You came back, read “none” everywhere, and assumed your setting was lost. Tiers beyond the third now appear as soon as they are used. - 🛡️ A colour role no longer makes anyone untouchable. The custom role bought in the shop, the level-50 one and the podium roles were placed just below the bot's role — that is, above your whole staff. They carry no permission, but Discord forbids sanctioning someone whose highest role outranks yours: a member could effectively buy immunity. They now sit just below your lowest moderation role: the colour still beats ordinary roles, and nobody loses their authority.
- 🔒 Anyone could kill an admin's confirmation.
+xpdecayand+claimtop resetask for a button confirmation. The first click ENDED the prompt, whoever made it: the bot did answer “this isn't yours”, but the administrator could no longer confirm — and could retry as many times as a bystander felt like clicking. Both prompts now listen only to the person who opened them. - 🎟️ A ticket transcript can finally reach the person who opened it. On close it only went to the logs channel: the member lost everything — including the staff's answers and whatever was agreed. A new button in
+ticket→ Opening rules also sends it to them by DM. Off by default, deliberately: a transcript leaves the server and contains everything staff wrote; that is not the bot's call to make for you. If their DMs are closed, closing the ticket proceeds normally. - 🎲 A custom command's stickers can now rotate. You could only set three, and all three went out every time. You can now keep up to ten: the bot draws three at random for each reply (Discord accepts no more). Nothing changes for anyone with three or fewer — they all go out, in your order.
- 👍 You choose where a custom command's reactions land. They always went on the bot's reply.
+custom set <keyword> reactou reponse|auteur|deuxputs them on the message that triggered the command instead, or on both. The default is unchanged. - 🆘 A menu option can carry its own emoji.
+custom menu <keyword> <label> 🆘:aide faqgives the 🆘 emoji to the “aide” option and leaves “faq” without one. A bare keyword still works exactly as before. - 🔇 A malformed emoji made a custom command go silent. A button or option with an invalid emoji (
hello,:tada:, a truncated id) made Discord reject the entire message — not just the offending button. The rejection was swallowed: the command simply stopped answering, with no error, no log, and nothing pointing back to the emoji typed the day before. The bot now refuses the emoji frankly as you write it, and drops already-stored bad ones rather than losing the message. - ⏱️ A custom command's two cooldowns cancelled each other out. The per-member and global cooldowns share one table, and each erased the other's row: set together on the same keyword, they destroyed one another silently. Measured:
cooldown 1m+cdglobal 1h, and the first member passing two minutes later dropped the global from 58 minutes remaining to zero; the other way round, posting the global wiped a one-day member cooldown. Both settings still showed up in the options list. Second point, on busy servers: the global counter's row was evicted by 200 more recent members — exactly where a global cooldown is useful. Both are fixed, and pruning still bounds the table. - 🎫
+claimtook the ticket without locking anything. The « ✋ Claim » button applies the configured mode:lockremoves others' ability to speak,hideremoves their view. The command took the ticket, announced « claimed »… and restricted nobody. Two paths for one action, two outcomes — and the silent path won, since it announced all the same. A server onlockbelieved its ticket closed to others when it stayed wide open. The command left no trace in the logs either: claiming from the keyboard was invisible, impossible to settle three days later. Both paths now do exactly the same thing. - 📁 The per-type ticket logs channel did nothing.
+ticket type set <id> logs #channelwas accepted, validated and stored — and no code ever read it back. Everything kept landing in the global logs channel. An admin separating unban-ticket logs from help-ticket logs had no reason to suspect the bot rather than their own input. It is now wired: opening, claiming, transferring and the closing transcript follow the type's channel. A type without its own channel keeps writing where it always did, and+ticket type listfinally shows the configured channel. - 🧩 The editor opened by
+custom <keyword>did nothing. The screen showed up fine — eleven fields, ten options, three buttons — and none of the ten dropdown options responded: each one bounced back to the generic list of custom commands. Only the three buttons worked. The reason: the dropdown did not carry the keyword you had just opened, and looked it up in a memory only+setupever filled. It carries it now, exactly as the buttons already did — and the carried keyword is re-checked against the server's configuration before any write. - 💬 A menu prompt could only be one word.
+custom menu m Choisis ton rôle aideset « Choisis » as the prompt then looked for a command named « ton » — answering « unknown target », an error that said nothing about the real problem. Wrap the prompt in quotes to give it several words:+custom menu m "Pick your role" aide faq. French « » and curly quotes work too. Without quotes nothing changes: one word, exactly as before. - 🗑️ The delay before a ticket channel is deleted is finally configurable. It was 5 seconds hard-coded forever: too short to re-read the channel before it vanishes, and too much for a server that would rather archive its closed tickets.
+ticket suppression <1-3600>sets the delay,+ticket suppression offkeeps the channel — closing still removes access and sends the transcript as before, only the deletion is cancelled. The default is unchanged: a server that touches nothing keeps its five seconds. And the announcement no longer promises a deletion that will not happen. - 🎨 The changelog arrived in two different colours depending on the announcement path. Updates go out through two announcers; one used the logo's blue, the other gold — the minority colour of the logo (16.8% of its coloured pixels, against 82.4% for blue). Both now use the same one.
- 📌 Post a ticket panel without leaving the menus. The
+ticket settingsscreen gains a « Post the panel here » button. It does exactly what+ticket paneldoes, with the same guards — with no staff role configured it refuses rather than posting a panel nobody could handle. - 🛡️ A file the bot could NOT analyse was reported as « 🟢 Clean ». When the analysis quota runs out at the wrong moment, VirusTotal returns no verdict. That case was triaged nowhere: the attachment fell through to the last branch and landed in your logs in green, with « 0 detections / 0 engines ». Staff read « checked and clean » where nothing had been checked — the worst possible message, because it lowers the guard instead of raising it. The very same case was already handled for links. It is now reported in yellow, « analysis deferred », like every other unverified file, and the scan counter no longer counts what was never scanned.
- 💾 Attachment scanning could restart the bot. It downloaded each file in one block in memory, up to 50 MB, without counting how many downloads were running at once. A dozen files posted simultaneously across the servers was enough to exceed the bot's memory allowance and force a restart. Files are now read in chunks, cut off the moment they exceed the bound, and at most three downloads run at a time — beyond that the analysis is deferred and announced as such, never presented as a clean file.
- 🔐 Turning a security module off is a server-owner action again. The
+secupanel accepted any administrator — while the same modules are reserved to the server owner everywhere else (+setup, the wizard). It was the only open door for switching off configuration-drift watching, self-bot detection and webhook watching — all three on by default, none covered by the two-step confirmation. Turning them on stays open to administrators: hardening your server should not wait on anyone. - 👑 A role with the right name could become a back door. The King of the Hill crown and the three game podium roles are handed out automatically — to the winner, to the top 3, every ten minutes, with nobody clicking anything. When a role with the right name already existed, the bot adopted it on its name alone: a moderator with « Manage Roles » could create a « 👑 Roi de la Colline » loaded with their own permissions and let the bot hand it out for them. Both modules now apply the same filter as every other bot role — sensitive permissions, application-managed role, role above the bot: refused. And a refusal does not create a second role of the same name, or the bot would pick one at random next time.
- 🌐 One server could erase, for the whole network, a report raised by another server. The « Clear » button in
+setuphad always asked who the record belonged to. The « 🔓 Release » button on the quarantine panel erased without asking: one server's owner could revoke another's accusation, and every later server stopped being wary. The rule now lives in one place, called by both buttons — clearing your OWN report stays the intended use, and the bot owner keeps the global pardon. A record whose origin has been lost can no longer be cleared by anyone else. Local release is unchanged. - 🕶️
+auditno longer posts a named list in an open channel. The audit shows up in the channel where you run it — that is deliberate, so the whole team can use the fix buttons. But it also showed the names of at-risk members and their exact score, whatever the channel. The bot can render a counts-only version (« 3 members at risk »); that version existed, fully written, and was never asked for. Now: staff-only channel → full detail and buttons; channel anyone can read → counts only. When in doubt, the bot treats the channel as public. - 🐛
+bughad no throttle of its own. The command is open to everyone and every report writes to disk, DMs the owner and posts to the logs — yet it fell back on the generic 2-second delay, about thirty reports a minute per server. It moves to 60 seconds, like+reportwhich does exactly the same work. - 🧱 A damaged antiraid whitelist crashed the commands that read it. Eleven places in the bot read the whitelist; only two checked its shape. If the stored value was not a list — after restoring a backup from another version, say —
+unwl,+antiraid,+bland three Guardian checks threw instead of answering. And+unwlwas one of the few commands able to repair the list. Worse for+bl: the throw happened after the blacklist entry was written, leaving the sanction half-applied — no derank, no reply, no trace — and re-running answered « already blacklisted ». Everything now goes through a single read that bounds the list and its contents; an unreadable whitelist simply exempts nobody. - 🎨 The colour of a refusal was lost. The bot has a rule: ❌ red, ⚠️ orange, ✅ green. But any plain-text reply was re-wrapped in the server's theme colour before that rule applied — so a refusal came out the same colour as a confirmation. On an error message, colour is the first thing you read. It is restored; the server theme now only applies to neutral messages, never to an error. Fixed along the way: from a command's second reply onward, the bot also lost its brand header.
- 🧪 A development copy can no longer broadcast to your servers. A bot accidentally started from a dev machine connects with the same token, sees every server, and starts its automatic tasks a minute later — using its database, which is out of date. That is what sent the season podium out a second time, 24 hours after the real one. Nothing in the bot could prevent it: the anti-duplicate lock lives in memory (so per process) and the season marker lives in the database (so per database copy). A marker file at the repository root now disables all automatic tasks on a local copy — commands still answer. Production does not have that file and is unchanged.
- 📌 The bot left its own pin notice under its panels. When it pins one of its panels — the trophy room, the configuration screen — Discord slips « Hasu Protect pinned a message to this channel » right underneath. That notice says neither what was pinned nor where to go, and it litters a channel the bot has just tidied. The cleanup did exist… but it sat after the filter that ignores bot messages, and the author of a pin notice is whoever pinned. So it only ever saw human pins — and only with the pin module enabled, which no server had. The bot now clears its own noise without being asked, and writes a trace to your log instead: who pinned, an excerpt of the message, and a direct link. A member's notice stays untouched until you enable
+pinlog. - 📦 Surprise crates were landing in the rules channel. On a server that has just added the bot, it picks a channel for crates on its own. When no channel looked like a « general » one, it took the first in the list — which, on a fresh server, is almost always the rules or welcome channel. That was not random, it was systematic: measured across the servers, four had their crates in
#règles,#rules,#〢🚀・bienvenueor#server. The bot now rules out rules, announcement, log, welcome and staff channels, along with the ones it manages itself — and if it finds none it convincingly recognises, it enables nothing at all. Choosing is the owner's call, with+drops setup #channel. - The presentation channels have been tidied up. The command count is no longer written twice on the same screen, each catalogue now uses its own channel's emoji instead of showing a different one, follow-up pages announce themselves as such, and the syntax moved below the command name instead of cutting the sentence in half.
- The check that proofreads the presentation channels could not read accented command names:
+défiwas verified under the named,+trophéesundertroph. A typo in an accented name could therefore go unnoticed. It now reads the whole name. - The antivirus scan quota was read before downloading the attachment and only debited afterwards. In between, several files arriving at once all read "there is room left" and all downloaded — up to 50 MB each — for a single genuinely free slot. The slot is now reserved before the download and released afterwards, so nothing is downloaded for nothing.
- Removing someone from the anti-raid whitelist crashed.
+unwl @memberand+antiraid whitelist remove @memberthrew an error instead of acting — but only when the person was genuinely on the list, that is, in the only case that matters. A member who was not on the list still got their error message, which made the command look like it worked. Fixed. - The
+basehardening kept its own hand-written copy of the seventeen anti-raid modules, next to a reference list that already existed. It now derives from that list, keeping the deliberate exclusion of the anti mass-join module. A module added later will be hardened without anyone having to remember. +imagesis the bot's most expensive read command: up to twelve channels scanned across thirty pages of history, roughly 360 requests. Yet it only had the default two-second cooldown, and nothing stopped several people launching it at once. It now has its own thirty-second cooldown, and only one scan runs at a time per server — while it worked, sanctions and alerts were queued behind it.- From their second message onwards, a command's replies lost the bot header and their colour: a refusal showed in information blue instead of red. Three layers stack on a reply, and the one adding the ⚙️ Menu button erased its neighbour as it removed itself. It no longer removes itself — it never needed to.
- Resetting a server preserves the base protections and the quarantine anchors — that was already true, but nothing genuinely verified it: the check replayed the sequence on its own instead of running it. It now runs it, and reversing the order of the wipe makes it fail.
- The audit buttons that grant a member trust could fail if the server's whitelist had been damaged by a configuration import. Three places still read the list without the guard the commands already use. They now use it.
- The bot disagreed with itself about durations:
+tempban 1dworked,+announce 1dwas rejected. Eight places read durations their own way, and the English help for+announceadvertised1d— an English speaker copied the example they were shown and got refused.dandjare now accepted everywhere, for every command that takes a duration. - If the antibot value had been damaged — for instance by copying
3/5m, a form the command itself offered as an example — the bot's screens no longer agreed: the protection score called it missing, the dashboard called it active, the wizard offered to enable it. Worse: Guardian believed it was alone and sanctioned a second time the bot the anti-raid had just handled. Everyone now reads the same value. - When automatic database compaction failed, nobody was told: the message went to a log file, and the next attempt was six days away. A compaction that fails usually fails again the next day — so the database could grow silently for weeks. The owner now gets an alert, with the number of consecutive failures.
- Automod's numeric settings (anti-spam sensitivity, mention threshold) were checked on write but not on read. An out-of-range value — from a configuration restore, or written before the check existed — came back into memory unchanged. Both now apply the same limits, and an out-of-range value falls back to the default.
- Removing an auto-pinned message (
+sticky off) at the exact moment the bot was reposting it could bring it back, and leave an orphan message in the channel on top of that. Removal and repost were stepping on each other. They now re-read after each other, and the extra message is deleted. - A ranked duel played during the monthly season rollover could be lost — and a player fighting their very first duel just after midnight vanished from the ladder. The rollover was rebuilding from a state read several seconds earlier.
- Two members claiming their custom colour role at the same moment: the second erased the first from the configuration. Their role still existed on Discord, but the bot believed they had none — and created a second one on their next click, never cleaning up the first. The same safeguard now covers podium roles and grade roles.
- A 📌 Panel screen joins the ticket settings. It says which channels your panels are posted in, lists your ticket types, and finally lets you remove one or delete the panels — two things that existed nowhere else. The "Post the panel here" button moved there too: the colours screen was full.
- The bot now remembers where it posts its ticket panels — it used to throw that away, which made finding one impossible. Before deleting anything it demands three proofs: that the message came from it, that it carries the open button, and that it is in the right server. A message that is not one of the bot's panels is left untouched.
- Removing a ticket type now says what it does to already open tickets: they stay open and keep their access, but their logs and closing transcript go to the general log channel instead of the type's own. That already happened, silently.
- If one of your ticket types carried an emoji Discord does not accept, the panel screen would have refused to open — the button would simply have looked dead, when that screen is exactly what you need to remove the offending type. It now reopens without emoji rather than not opening at all.
- The report shown after deleting a panel displayed code instead of a sentence — a plural syntax the bot cannot render. Fixed the same day it shipped.
+temproleshowed English-speaking servers durations the bot refused: it suggested7dand2w, they typed them, and the refusal asked for exactly what they had just written. Both spellings now work, with no change to the French ones.- The message refusing a mention threshold announced "between 1 and 50" hardcoded: changing the limit would have left it announcing the old one. It now states the limit actually applied.
- Automatic events (aura rain, quick draw) could land anywhere. When the designated channel had since been deleted, the setting stayed in the database — it looked configured — and the bot fell back to "the first writable channel available", meaning the first in internal order: often the rules or welcome channel. This is the same defect as the surprise crates, fixed for those only. Events now go through the same careful picker: rules, announcements, logs, staff and tickets are ruled out, and without a real general channel the bot stays quiet instead of picking at random.
- The server's system channel keeps priority for these events — it is Discord's implicit "general", whatever its name — except when it is clearly a welcome or rules channel.
- When a channel set in the configuration was deleted, its identifier stayed in the database — and a non-empty string passes for a valid setting. The fallbacks meant for exactly this case therefore never ran: promotion and demotion announcements went NOWHERE while the log channel, the second link, was alive. Same for voice gifts. The cascade now checks whether the channel actually exists, not whether the setting is filled in.
+birthdayhid its "no announcement channel" warning when the chosen channel had been deleted: the setting was still there, so everything looked fine. Members saved their date believing it would be announced. The warning now shows as soon as nothing can actually be announced.- When the antivirus cannot reach a verdict on an attachment — quota exhausted, error, file too large — the bot deletes nothing and never says the file is clean. But that warning only went to the log channel: with no log channel configured it existed for nobody, and the bot's silence read as "nothing to report". The warning is now posted in the channel where the file was shared when no log destination answers — once per message, even with five attachments. Servers that have a log channel see no change.
- 95 command descriptions rewritten to be understood by someone discovering the bot. Internal vocabulary was removed wherever it stood in for an explanation: "derank" became "stripping their power roles", "quarantine" became "set aside, without a ban", "self-bots" became "automated accounts". 146 other descriptions were already clear and were left untouched.
- Three factual errors fixed along the way, published until now on the presentation server:
+secuannounced eight protections including "progressive trust", which was removed from that panel — there are seven.+antiraiddescribed its sixteen protections as "switched on or off one by one", when three of them never switch off. And+raidignoresuggested a free zone, when the exception covers ONLY channel creation and deletion. - Two descriptions still showed examples with the old
!prefix instead of+. - Targeting someone by their ID rather than a mention already worked on
+blrank,+derank,+warn,+ownerand+antiraid whitelist— but none of their usage lines said so, so nobody could guess it. It is now written everywhere:@member/ID. Especially useful when the person has left the server and no mention is possible. - ⛔ The rank blacklist now applies AT THE MOMENT OF THE ACTION.
+blrankset the rule "this person will never be promoted again", but no command consulted it: the role was granted, THEN removed by anti-raid, and the moderator sanctioned for something nothing stopped or warned them about. Worse, automatic grants — level-ups, grades, podium, shop, booster role — do not go through anti-raid and silently gave back what+blrankhad just taken away.+addrolenow refuses before acting, with a message saying why and how to lift the rule. - 🔴 Fixed: being on the anti-raid whitelist silently cancelled the rank blacklist. Reported in production ("blrank does not work if a blranked member is given a role by hand") and reproduced: the guard confused structural untouchables — the server owner, the bot — with the whitelist, which is only a general trust list. A decision made person by person was therefore cancelled by a setting made months earlier, with no alert and no trace. A named decision now takes precedence over a general list.
- 🗂️ "Recent modules" is gone from the menu, and that is an improvement. "Recent" is a date, not a category: that shelf aged on its own, and in three months nobody would have looked there for a file filter. Its six settings moved to the categories where you would look for them — file extensions, burst and banned emoji in Automod lists, auto-reactions and boosters in Modules, rerank window in Advanced settings, next to warning expiry. No setting lost, and panels already posted keep working.
- 🔓 Being whitelisted grants no power, and that is now guaranteed. The whitelist says one thing: automod and anti-raid look the other way. It grants no tier — permission checks never read it, and no command is gated on it. That was already true; it is now tested every run, because a property that is true by accident gets lost silently.
- 🚨 During a lockdown, the whitelist no longer protects. MAX mode already suspended it; lockdown did not — even though it is the more serious of the two: the server is closed because an attack is under way, exactly when a compromised trusted account does the most damage. The server owner and the bot stay untouchable, and the exemption returns as soon as the lockdown lifts.
- 📝 The description of
+blcalled itself "Rank blacklist" — the name of+blrank. Routing was correct, but reading+helpyou could not tell the two commands apart.+blnow states what really sets it apart: it BANS on (re)join, where+blranknever bans. - 🔴 Fixed: a whitelisted then blacklisted member came back freely. The ban-on-return also deferred to the whitelist, like the role stripping fixed earlier. A decision made person by person now takes precedence everywhere over a general trust list.
- 🎟️
+ticketnow opens a screen, not a help page. Typing+ticketused to show six numbered steps explaining what to type —+ticket role @Staff,+ticket category <id>… The staff role and the category are now set with a picker, right on the screen, with the form, rules, claim and panels one button away. Button colours, which you set once and never again, moved to their own sub-screen — that is what freed the space. All subcommands still work: this adds a path, it does not remove one. - 🤖
+ticketaiis now configured from a screen. The panel already said everything — on or off, learning channel, size of its knowledge base — but you had to leave and type a subcommand to change anything: a dashboard that commands nothing is a report. The channel is now picked from a menu, and four buttons turn the assistant on, teach it an answer, show what it knows, and try it out. The power button stays greyed out until a channel is chosen — without one, an unanswered question goes nowhere. - 🔒 Fixed: leaving the server erased a quarantine. Discord gives no role back to a member who returns — but the state of the sanction survives in the database. Leaving and coming back was therefore an exit door: ten seconds to cancel a sidelining the staff had not lifted, while the bot kept listing the person as quarantined. On return, the role is reapplied, access to the appeal ticket is restored, and the person gets a private message with the link. A quarantine the staff HAS lifted does not come back.
- ⚖️ The appeal ticket now carries two decision buttons, owner-only. It said "the staff will answer you" without giving the staff any way to decide: you had to leave the ticket and type a command, copying an ID. "Give roles back" leads to the release screen — which keeps its two-distinct-owners vote, a protection against a compromised owner account that a new button has no business piercing. "Never promote again" acts directly: it is a single owner decision, and it gives power back to nobody.
- 🎫 The appeal ticket can now be found again. It only existed in the moment it was created: neither the member on their return nor the staff could get back to it. Its location is stored with the quarantine state — the one that survives restarts and departures.
- ⏳ A quarantined member is now throttled: one message every 3 seconds. The quarantine role already stopped them from writing anywhere except their isolation channel and their appeal ticket — but nothing throttled them in those two places, precisely where the person is angry and where the staff needs to be able to read. The extra message is deleted, with no warning and no added sanction: writing too fast while appealing a sanction is not a raid, and punishing the same act twice would be unfair. The reminder appears only once a minute — otherwise the throttle would become the spam.
- 🎫 Appealing when you are no longer on the server finally works. The "you have been deranked" private message offers an appeal by ticket — but the escalation had sometimes ALSO kicked or banned the person: we created a channel they could not open, and handed them a dead link. The appeal route existed on paper and nowhere else. Three honest answers now: still a member, nothing changes; gone or kicked, the ticket is created and a single-use invite comes with it; banned, an invite would be useless — we say so plainly and point to the review request, which reaches the owners by private message. And if the bot cannot verify the ban, it promises no ticket rather than promising a dead one.
- 🔕 The owner account no longer triggers pointless wake-ups. Three critical alerts arrived back to back about the crown — danger index, permission escalation, configuration drift — while the bot had already decided to revert nothing: the owner is entitled to it, and no automatic sanction can target them. An alert whose answer is known in advance burns the attention owed to the others. The full trace stays in the log — an owner granting themselves permissions must remain reviewable afterwards — but the ping and the private message are gone. Strictly the crown: a whitelisted account that escalates is still alerted, because the whitelist says "do not sanction them", never "do not tell me".
- 🧠 The "Why?" button no longer goes silent after a restart. It answered "detailed explanation unavailable" on alerts that were still live and still actionable — so after every deployment. The cause: the watch saved everything (score, status, removed roles, decision token) except precisely the two things the explanation reads — the measured signals and the rules verdict. Both are now kept. And when an older alert still lacks its signals, the bot no longer goes quiet: it returns the expert verdict and the score, instead of throwing away the answer along with its footnote. An AI that refuses to justify itself stops being verifiable.
- 🕵️ The self-bot detector no longer confuses "fast" with "automated". It alerted from 6 messages in under 2 seconds — which describes someone pasting six lines or hammering Enter, not an account driven by code. A self-bot is not recognised by its speed but by its regularity: a script posts every N seconds within a few milliseconds, and it keeps it up; a human has erratic gaps and stops. The signature now requires all three at once — at least 8 messages, spread over 20 seconds or more, with gaps regular to better than 12%. A pasted burst, even a perfectly regular one, is no longer flagged: it is too short. Multi-channel detection (3 distinct channels in 3 seconds) is unchanged — a human cannot type in three channels at once.
- ⏳
+blrankfinally takes a duration and a reason — and a short form.+blrank @memberis now enough (the wordaddbecomes optional), and+blrank @member 7d they resold their rankblocks for seven days, logging the reason and who decided. With no duration, the block stays permanent as before. The block lifts on its own at the deadline: a regular sweep, plus an immediate lift on first read — so a deadline that passed while the bot was down blocks nobody at restart. A reason starting with a digit stays intact: the bot reads a duration only when the word really is one. - ↩️ New command
+unban @member/ID [reason]. The bot could already unban in five situations — an accepted appeal, a Guardian decision, a restore, the end of a+tempban, the ↩️ button — but no command let you do it on demand: you had to wait for one of those five paths, or unban by hand in Discord, leaving no trace in the member's record. The command opens a record in their name, and the reason written to the Discord audit log names the person who decided. It also separates two failures everyone conflates: "this person is not banned" and "I could not check" — the second unbans nothing blindly. - 🔑
+unbansits at owner level, and+updateis now reserved for the root owner. Unbanning reverses a security decision — to the point that a whole module exists to sanction those who do it outside the bot: leaving it at Admin would have put it on a par with setting a welcome channel. As for+update, it updates the whole process, so all twenty-one servers at once: "owner" was not enough, since every server has its own. - 🔐
+lockdownand+punishwere labelled "Owner" without being it. The tier alone does not close the door: access is granted outright to anyone holding Discord's Administrator permission — a deliberate fallback for servers that never set their tiers. But these two commands had no internal guard: any administrator could lock down the whole server or rewrite the automatic sanctions scale. They are now genuinely owner-only. - 🎫 Moderators can finally handle a ticket end to end.
+closewas open to them, but+claim,+rename,+addand+removewere not: a moderator could CLOSE a ticket without ever being able to take it on — half the feature on one side, half on the other. All five actions are now at the same level, and their internal checks (ticket staff, or author) still apply. The+ticketconfiguration screen stays above: configuring the system is not handling a ticket. - 📋 The
+helpalltable was wrong, in both directions. It sorted commands by tier without ever readingownerOnly— a marker that overrides the tier and closes the command to administrators. Commands no admin can run were shown as "Admin", and two commands open to admins were shown as "Owner". That is precisely the screen you rely on to judge how your rights are distributed: a permissions table that is wrong gives a confidence it has not earned. - 🔔 The "Allow / Deny" alert offered a choice that had already been made. When Guardian opens a watch, it sends the owners a private message with two buttons — then removes the roles 3 to 30 seconds later if nobody answered. No human receives a notification, reads it and decides in six seconds: the owner therefore found a message inviting them to choose while the roles were already gone, with nothing saying so. The message is now corrected the moment the removal happens: it states what occurred, reminds that "Allow" gives the roles back exactly as they were, and explains why the delay is deliberately short — if this were a raid, waiting would cost the server.
- 🔹 Fixed: "🔹 🔹 Tier 4". In the permissions screen, the six tiers above owner showed their emoji twice — Discord places an option's emoji next to its label, and the label already started with the same one. The cleanup helper existed in the repo and was missing at exactly that spot.
- 🔒 The
+basedashboard can now close its own channel. When the panel sits in a channel visible to @everyone, it said so — and left the owner to fix it by hand in Discord's permissions, that is elsewhere, at the exact moment they had just opened their security dashboard. A Make this channel private button is now offered, owner-only, and it appears only where it is useful: on an already-private channel it would be a button that does nothing. The bot grants access to itself — and to you — before closing, so the panel keeps refreshing and nobody is locked out. - 💡
+help <command>finally gives examples. A usage line like+perm <1-9 or modo|admin|owner> add <@role or @member>is exact and unreadable: it describes the grammar, not the use. An Examples field now appears on commands that have one —+perm,+customperm,+blrank,+unbanto start — with lines to copy as they are, and the command's pitfall explained in one sentence. The field only shows where it exists: nobody needs examples for+ping. - 🔑 A command's card now states the tier it requires. It used to say "Depending on your permissions", which tells nobody anything: the only way to find out was to run the command and see whether it refused. The card knows the server — so it gives the tier actually required here, overrides included, and points to
+permto see who holds it. - 🎁
+blgwexcludes from giveaways,+blticfrom tickets — no longer both at once. A single list took away EVERYTHING: someone who cheated in a giveaway also lost the right to open a ticket, which is the only way to appeal. The two reasons have nothing in common, so they now have two lists. The old general list is untouched and still covers everything: nothing changes for anyone who already filled it in. - 🛡️ A service exclusion is not a ban, and the bot says so. The confirmation message points out that the person stays a member, keeps their roles and keeps chatting — so
+blgw/+blticare no longer mistaken for+blrankwhen choosing. The server owner cannot be excluded from their own server. - ✍️
+blgw 123456789012345678works just like+blgw @member. The ID is accepted everywhere the mention was, including once the person has already left the server — which is precisely when you can no longer mention them. - 🧹 Anti-spam now deletes the WHOLE burst, not just the last message. It removed exactly the message that crossed the threshold: with the default setting, four messages out of five stayed on screen, and no other module caught them. This was structural — memory only kept timestamps, so the bot had no message ID to delete. It now keeps references to the latest messages and clears them all.
- 🔇 One burst no longer counts as several offences. Messages arriving during the deletion read a counter that was still full and went through the whole punishment again: several bot warnings in the channel, several timeouts, several strikes for a single burst — enough to turn spam into a mute, or even a kick on a server that configured
+punish. The counter is now reset before any waiting; for the following seconds, whatever keeps arriving is deleted without being punished again. - 👁️ Deleted spam no longer comes back through
+snipe. Every message removed by anti-spam is now marked as a security removal —+snipeis a public command, and the automatic net does not recognise repetitive spam. - 🚨 An anti-spam silenced by a missing permission now says so. In a channel where the bot lacks Manage Messages, it deleted nothing and wrote nowhere: the owner believed they were protected. They now get an alert, one per channel every ten minutes. The punishment itself already applied, and still does.
- 🛡️ Being whitelisted finally does what the command promises: automod steps aside.
+wlannounced “full security exemption”, and only antiraid honoured it. The message filter looked at nothing but the administrator status: a whitelisted member without that role was deleted, muted, then kicked or banned by the strike escalation — even though the owner had explicitly declared them trusted. - ⚠️ Except while an attack is under way. The whitelist does not apply in
maxmode, nor during a lockdown: that is exactly when a compromised trusted account does the most damage. As soon as the lockdown ends, the exemption comes back on its own. - 👁️ And an exemption no longer creates a silent blind spot. If a whitelisted member posts — or edits a message into — something resembling phishing, the owner is warned while nothing is deleted or punished. The same trace already existed for administrators.
- 🔗 Message creation and editing now share ONE exemption rule. They carried two copies of it, which is how editing had drifted away from creation without anyone noticing.
- 🔨
+blactually bans. It announced “will be banned automatically if they (re)join the server” — true for someone coming back, false for the most common target: the one already here. They lost their roles, the list held their name, and they stayed on the server writing. They are now banned right away — and if I cannot, I say so rather than announcing a closed door that is not closed. - 🌐 And the reach spans your servers.
+blnow bans here AND on every server you own — as its owner, or having been added there with+owner. Never on a server where you are only an owner through your global status: a power never granted server by server must not be able to empty a community. Each server's owner stays untouchable everywhere. - 🔓
+unblhas exactly the same reach. Lifting the blacklist unbans, on the same servers. A lift valid only here left the person locked out elsewhere, with a record saying they were forgiven. - 🏷️ Nine messages called this list the “rank blacklist” — that is another command's name.
+blrankstrips roles without banning;+blbans. Both wore the same name on screen, including in the message refusing to grant someone a role and in the moderation traces. Each now states its own. - 🔑 The “Make this channel private” button no longer locks the other owners out. It reopened access to the bot, the server owner and whoever clicked — and closed the security dashboard to every other owner of the server, that is, exactly the people the button is reserved for.
- 🔓 Freeing someone from quarantine no longer returns a role the bot takes back a second later. The report announced “1 role returned”, then antiraid removed it right away because the person was on
+blor+blrank: two owner decisions contradicted each other, and the screen showed the losing one. The question is now asked BEFORE, no role is granted for nothing, and the report names the ones held back — with the exact command that unblocks them. - 🧹 The channel de-duplicator no longer asks your opinion about work already done. It was already removing, on its own, the empty duplicates it can prove it created — but the report said the opposite (“it never deletes a channel by itself”) and offered a button, even when all that remained were channels no click may legitimately remove. The text now says what actually happens, and the button appears only in the one case where the question means something: a duplicate spared because it holds human messages.
- 🚨 A moderator could ban someone ranked above them by adding a full stop.
+banand+tempbancleaned the target by stripping every non-digit character:<@ID>.,IDxor"ID"escaped the resolver — and therefore the hierarchy check — then became a valid ID again. The ID must now be written exactly, and the target's presence is re-checked before acting. - 🔐
+importconfigno longer reset your command tiers to the defaults. Of the four permission tables, only one was copied between servers: a server that had hardenedban/kick/tempbansaw them fall back to the defaults, without a word. - ⭐ A message the starboard failed to publish is no longer lost in silence. The failure is logged, and the reservation is released only on a definite refusal — never on a timeout, which would publish it twice.
- ⏱️ Seven outbound calls without a timeout are now bounded. File analysis and monitoring: a remote service that never answers can no longer hold the task indefinitely.
- 📖 The showcase server is up to date. All 242 public commands are there — including
+blgwand+bltic— and the explanations state what is new: the spam burst that goes in full, the whitelist that really does make automod step aside,+blbanning across all your servers, and the quarantine release that no longer promises a role it takes straight back. - 🎭
+makeitmemewas announced to everyone and refused to everyone. The games catalogue listed it under its aliasmemegame; the bot resolves aliases to the real name BEFORE judging access — and that real name was in no table, so it fell back to administrators only. The check meant to prevent exactly this was blind for the same reason: it measured the alias. - 🎫 Moderators can finally handle a ticket end to end, for real. The previous batch announced it without doing it: Manage Messages opened
+closeand nothing else, because the other four gestures were not in the table a Discord permission opens. Measured before and after:+claim,+rename,+addand+removenow pass just like+close. - 📚 The showcase server has a complete REFERENCE. One card per command — all 242 — with its description, every way to write it, every parameter (required or not, accepted values), its sub-commands, its other names and the tier required. Plus an alphabetical A→Z index: you no longer have to guess a command's family to find it. Everything is derived from the real registry, nothing is written by hand.
- 🔇 And the backstage no longer shows to visitors. The showcase server's service channels are closed to
@everyone— except the trophy room, the games and the suggestions, which show the bot at work. - 🚨 Replying to a message could make four commands target the wrong person. Discord puts the author of the replied-to message first in the mention list.
+undo,+purge,+cmdpermand+del permread that mention BEFORE the ID you typed, so the command acted on whoever you replied to. Worst case:+undo <attacker>typed as a reply to my alert mass-unbanned the accounts the antiraid had just removed. The typed ID now wins everywhere, and a new barrier stops any command that ACTS from falling into this trap again. - 🔐
+temprolecould be used to climb. It only checked the BOT's role hierarchy, never that of the person typing: a member placed at the admin tier, with no Discord permission at all, could grant themselves a role sitting at the very top of the server. It now uses the same check as+addrole. The server owner is still unrestricted. - 🛡️ And
+undonow refuses to target the defence. Undoing my own bans, or a server owner's, was never a raid rollback — it undoes the work that was just done. - ⚡ The bot reads its configuration twelve times faster. The cache stored entries under a key built on the fly (
server:setting): every read had to build that string and then hash it — eighteen times per message. It is now stored two levels deep, with no intermediate string at all. Measured on the bench, six interleaved runs: 39.4 → 33.7 µs per message. - 🔒 Under a raid, the quarantine area is no longer created several times over. Each arrival triggered its own creation: three simultaneous arrivals made three roles and three channels, only one of which was recorded. Members isolated by the others became invisible to the bot — not throttled, and above all with no way to appeal, since the release button told them they were not in quarantine.
- 🔍 The “the AI disagreed” alert finally says WHY — and stops blaming your staff. It gave a percentage, signed with your server's name, while the counter aggregates decisions from every server I protect: you were reading, in front of your staff, a rate produced elsewhere. The text now says so plainly, and points out that half the counted decisions come from my automatic modules, not from humans. Five fields explain the gap: the direction of the errors, my learning state (if it is frozen, waiting will fix nothing), the health of my reference model, the usual agreement to compare against, and the decisions I was not allowed to learn from.
- 🇬🇧 Two Guardian screens stayed in French on an English server. The alert's “model signals” block and the “Why?” screen forgot to pass the server's language.
- 🎫 One bad emoji no longer makes your ticket panel disappear. A ticket type's emoji is whatever your staff types: if it was not in a shape Discord accepts, the opening panel simply failed to build — without a word. The button now loses its emoji, never the panel its existence.
- 🧹 The real cause of duplicate log channels. When I see my log channel deleted, I recreate one — but that was the only one of my six creation paths that forgot to record “I made this”. And my duplicate cleaner refuses, on principle, to delete a channel whose origin it cannot prove: so I was creating a duplicate I then forbade myself from cleaning up, forever. Measured: four servers affected. Fixed at the source, and a barrier now checks that every channel I create declares its origin — except the ones I merely restore, which belong to the server and which I should not be able to delete.
- 📖 The showcase server now states each command's PARAMETERS. Under each command, the syntax — and under the syntax, every parameter on its own: what it accepts, and whether it is required. All 242 public commands are there, in the twelve topic channels and nowhere else: the separate category I had added duplicated them, so it is gone.
- 🔗 My defences finally talk to each other. I keep a shared threat level: a module that spots an attack raises it, and the others harden on their own. Ten modules READ it, only four raised it — and none of the six detectors added over the past two weeks. Six new detections, six silos. They are wired now, each at the right tier: a wave of identical messages says “attack under way” at once, while a slow arrival cohort only says “something is off” — it tightens thresholds without ever triggering a punishment. And for too-young accounts it is the accumulation that speaks: one refusal says nothing, three in eight minutes say a wave.
- ⚙️
+fichiers spamand+antispamcan no longer drift apart. Both are set asn/t— “n within t seconds” — and each checked that shape on its own, with its own hand-copied bounds. Measured: the two agreed exactly on twelve edge cases, which is the state of a copy that has not diverged YET. One definition now — and if you change a bound, both commands follow. - 🎭 A rank-blocked member no longer gets their rewards through the back door.
+blranksays “this person will never be promoted again” — yet AUTOMATIC grants (level-ups, grades, monthly podium, booster role, join role, champion) silently handed back what the command had just taken away. Nine modules, twenty-two grants, zero checks. They now ask permission, and a refusal shows up in the logs instead of vanishing. The quarantine role stays always grantable — otherwise you could no longer isolate someone precisely because they are already sanctioned. - 🔒 The “never promote again” button then made it impossible to quarantine the person. My antiraid strips any role given to a blocked member — including, unintentionally, the isolation role itself. So the person was recorded as “in quarantine”, the panel showed them locked away, and they were not locked away at all: they kept seeing and writing everywhere. The harshest step of the appeal flow disabled the ability to isolate. Fixed — and privilege roles are still stripped.
- 🤖 Ticking “Bot added” no longer bans your verified bots. The checkbox wrote STRICT mode — which kicks every non-whitelisted bot, even Discord-verified ones — while
+antibot onwrote smart mode, and the text under the checkbox promises that “verified bots pass”. Same intent, opposite outcomes. Worse: auto-escalation rewrote strict mode over your setting, on its own, at the first arrival wave. All five doors now write the same value as the command. - ⚖️ Removing a role from everyone finally follows the same rules as removing it from one person.
+massrolerefused to ADD a role placed above yours — and let you STRIP it from the whole server, with no check and no alert, where+delrolerefuses it on a single member. The most destructive of the three actions was the only one checking nothing. - 🏆
+levelrolecan no longer be used to climb. A reward role gets its dangerous permissions stripped — but a zero-permission role placed at the top of the server still puts its holder above your staff. The command only looked at MY hierarchy, never at that of the person typing it: a delegate could grant themselves such a role, retroactively, and become untouchable by your moderators. Same check as+addrolenow. - 💸
+importconfigno longer carries debts from one server to another. One letter apart, two keys were swapped: the debt system's SETTING did not copy, while the per-member debt REGISTER did. Someone owed 5,500 aura on a server where they had never borrowed — and every gain there was absorbed at 100%. It is the other way round now, as the file already promised. - 🤖 Smart antibot — big-bot impersonators: a bot carrying the name of a well-known bot (MEE6, Dyno, Carl-bot, Wick, Ticket Tool…) but joining under a different ID is banned at the door, even if it spells its name in Cyrillic letters to fool the eye. The real bot still joins normally.
- 🤖 Declare your own official bots — *server owner only*:
+antibot officiel <name> <id>records the legitimate ID of a less famous bot. From then on, any bot with that name joining under a different ID is refused.+antibot officiel listeshows the registry,+antibot officiel del <name>removes an entry. Reading is closed too: this list tells an attacker exactly which IDs they would need to impersonate. - 🤖 A lookalike does not get in, Discord-verified or not: a bot carrying a known bot's name under a different ID is banned at the door, official badge or not. An attacker who gets verification for a bot named "MEE6" is only more dangerous — the rule has no exception, and that is what makes it impossible to work around.
- 🛡️ Fix —
+antiraid all onwas putting the antibot in strict mode: the global switch wroteoninto every module, which for the antibot means strict (ban every non-whitelisted bot at the door) whereas+antibot onmeans smart. Two wordings of the same action produced opposite modes.+antiraid all onnow turns each module on in ITS own on-mode. - 🎚️ The level-up card no longer arrives several times: when the image took too long to upload, Discord received it anyway but the bot thought it had failed — it re-sent the card up to four times, and added the fallback announcement on top. An announcement can now be lost, but never repeated.
- 🎮 The games board no longer leaves orphan leaderboards: the automatic refresh could post several copies of the board, only one of which kept updating — the others stayed there forever. The bot now looks for its own board in the channel before posting a new one, and adopts it if found.
- 🎫 Ticket transfer: the target is judged by the same rule as you: "is this ticket staff?" was answered in two places by two separately written rules. The one judging the person you transfer to was the more fragile — it could make the transfer fail without a message instead of refusing cleanly.
- 🧩
+customno longer creates a stillborn command: if your keyword was already a shortcut to a bot command — an alias (duelleads to+bang,eventsto+autoevents) or a unique name prefix (levelrleads to+levelrole) — the custom command was accepted, announced as "created", listed in+custom list… and never answered, because the bot resolved the shortcut before ever looking at it. It is now refused, telling you which command owns the word. Same check when importing from another server. - 🧪 The antivirus no longer says "file deleted" when it could not delete it: VirusTotal sometimes takes two minutes to return a verdict. On that path, the alert announced the deletion before attempting it — if it failed (permission removed, read-only channel), staff read "🔴 DANGEROUS — file deleted" while the executable was still downloadable, and nobody went looking for it. The bot now deletes first, reports what actually happened, and urgently alerts the owners when the file is still there.
- 🧪 The antivirus verdict is no longer lost on the way: when VirusTotal took more than two minutes, or when the antivirus quota was momentarily full, the alert stayed on "🟡 Analysis in progress" forever — with no way to tell whether the bot was still waiting or had given up. It now waits up to twelve minutes, no longer wastes attempts when it could not reach VirusTotal at all, and says plainly when no verdict came back — with the report link and a reminder that the file was not deleted.
- 🛡️ A role restored after a nuke no longer comes back with @everyone's rights: when an attacker deletes an Administrator role, Discord forbids the bot from recreating it identically. The bot then fell back to a simplified creation — and the API grants a role created without explicit permissions those of
@everyoneat creation time. The day@everyonegets restricted (+lockdown, raid mode), its holders kept the old rights, under a name everyone thinks they know. The role is now recreated with no rights at all, and the alert tells you plainly that its permissions must be restored by hand. - 🧹 The duplicate-channel report no longer vanished the longer it got: Discord refuses a message whose embeds exceed 6,000 characters in total — and it refuses the entire message, silently. On a server with many duplicates and long channel names, the report reached 6,181 characters and therefore never arrived: the more there was to report, the less you saw. It is now shortened cleanly, and it says how many sections could not be shown.
- 🧩 An over-filled custom command is no longer mute: an embed filled to the brim (title, description, footer and five fields) could reach nearly twice the maximum size of a Discord message. The command then answered nothing at all, with no error message — and it was unguessable, since each field on its own was accepted by the settings screen. It now answers, dropping the last fields if needed.
- 🛡️ An antiraid lockdown could stop lifting altogether: the automatic lockdown fires on every join once the threshold is crossed — so in bursts during a raid. Two simultaneous triggers and the second recorded as "original state" the one the first had just set: when the timer expired, the server stayed on high verification with invites disabled permanently, when the lockdown was meant to last a few minutes.
- 🛡️ The raid shield no longer leaves the welcome channel slowed forever: when rising to level 2 it applies a slowmode to the system channel and remembers the previous value to restore it. Two simultaneous rises and the remembered "previous" value became the crisis one — so the slowmode never went away.
- 🚨 Lifting the lockdown (
+panic) can no longer erase a just-re-engaged one: the lift reopens channels one by one, which takes a while on a large server. If someone re-engaged the lockdown meanwhile, the lift wiped the new lockdown's state on its way out — leaving the server locked with nothing knowing how to reopen it. Only one lift now runs at a time, and it only clears the state it read itself. - ⛔ An expired rank block no longer punishes the moderator who restores the role:
+blrank @member 1hdoes record a duration, but the added-role watcher read the list without ever looking at expiry times. During the window between actual expiry and the sweep (up to 10 minutes), giving the role back still triggered an alert and a sanction against the moderator — punished for doing exactly what the end of the block had just allowed. - 🔎 A security finding is no longer lost to a closed DM: Guardian's rule audit reports what it finds inconsistent, and the direct message is its only way to speak. Yet it marked the finding "reported" before sending, and the send swallowed its failures: a single refused DM (DMs closed, bot blocked, account unreachable) and the finding was filed as seen — forever, without anyone reading it. It is now marked only once the message actually went out, and retried otherwise.
- 📖 Six of the bot's messages pointed to commands that do not exist: "quarantaine" (the real one is
+quarantine), "casier" (they are+caseand+history), "unwarn" (it is+sanctions del <id>), "harden" (it is the 🛡️ Harden button on the+basepanel), "bye", and "doublons" — that last one non-existent by design, the duplicate sweep being automatic. A help message that points nowhere is worse than no help: you conclude the bot is broken, not the sentence. All fixed, and a check now stops a new one from slipping in. - 🔑
+permsalon listbroke outright on a well-filled configuration: past 4,096 characters the display throws before the message is even built — the command stopped answering at all, with no warning. Since each entry can carry ten roles, a full configuration reached 7,474 characters: in other words, the more you used the command, the less it worked. It now always answers, and says how many entries did not fit. - 📋 Four other lists can no longer overflow: birthdays, the supporters list, locked channels and the games board displayed a list capped by line count, never by length — one long nickname or reason and the whole embed vanished. All are now bounded.
- 🎯 Three commands targeted the wrong person when typed as a reply:
+nukeadd,+noteand+rerankread the mention before the written ID — and replying to a message adds its author to the mentions, first in line. The worst was+nukeadd, which fills the list allowed to run+nuke:+nukeadd del <id>typed as a reply removed someone else and left the intended person authorized. All three now go through the shared resolver: the argument always wins, the mention is only a fallback. - 📺 Creator settings are no longer overwritten by a stale copy: YouTube channel tracking read your whole configuration, went off to fetch the feed (up to 8 seconds of network wait), then rewrote everything from the older version. Adding a creator, changing the announcement channel or setting the mention during that window was silently undone — and the sweep opens that window eight times per cycle. Announcements now also use the re-read channel and mention, not the ones from eight seconds ago.
- 🎚️ Two people can finally configure level rewards at the same time:
+levelrole addread the rewards table at the start of the command and wrote it back after stripping the role's permissions — a real network call. A tier saved by someone else during that interval vanished without a word. - 🏆 The trophy board can no longer stay frozen forever: the board records a fingerprint of what it published so it does not rewrite itself needlessly — but it recorded it even when Discord had refused the edit. The board then believed itself up to date and never repaired itself as long as the standings did not move. The fingerprint is now only written when the edit actually went through.
- 📊
+setstats offno longer says “deleted” when the channels are still there: the tracking list was cleared even if Discord had refused every deletion — the counter channels stayed in place and stopped being tracked, so they were never updated or cleanable again. The bot now only stops tracking what it actually deleted, and tells you how many it could not remove. - 🎯 The daily challenge no longer erases games played during its rollover: at midnight the bot hands out the podium (one network request per winner and per participant) then resets the board — from the state read before those requests. Anyone playing during that window had their game erased and their streak reset. It was the worst possible moment: midnight is exactly when people play to keep their streak alive.
- 🎪 The weekly gala no longer announces itself twice: the "announced" marker was only set after serving every subscribed server, one by one. The sweep runs every minute and the announcement window lasts thirty minutes — a second pass could enter during the first and send everything again. The quiz branch had always had its lock; the announcement branch had none.
- 🧩 Buttons on custom commands are finally subject to the same guard as typed commands: a click triggered the chained command with no rate limit at all, while typing the same command had always been limited. Yet a custom command can assign a role, send a DM or post in a channel — spam-clicking risked Discord throttling the entire bot, across every server, and gave a way to harass someone. Three seconds between clicks, with the same exemptions as everywhere else (owner, administrators).
- 🔒
+snipecan no longer republish a deleted moderation command: the bot knows how to recognise a command so it can exclude it from+snipeand from the log — but it only knew two of the three ways to invoke one. Shortcuts (+lockwfor+lockword,+tempbfor+tempban,+purgfor+purge…) counted as ordinary messages: 1,411 shortcuts in all. In practice, a manager triggering the panic word saw their message deleted to hide it — and any member could then read it back with+snipe, which is a public command. Fixed, and "+1 for pizza" is still an ordinary message. - 🛡️ The raid shield's level no longer drops by itself mid-wave: two simultaneous escalations and whichever finished last imposed its level, even a lower one — the server displayed "level 2" after alerting "Maximum alert", and the wind-down started one notch too early.
- 🔒 A harassment purge can no longer be republished by
+snipe: when automod wiped a mass-mention wave it deleted in bulk — and the deleted-message recall, a public command, showed up to three excerpts of it. The purge meant to remove the harassment put it back in front of everyone. Two locks now: automod marks each message before deleting it, and the recall refuses to display a marked message, including inside a bulk purge — which also covers+purgeand+clearwhen they target something dangerous. - ↩️
+rerankno longer restores roles the bot strips a second later: the command already refused a blacklisted member (+bl) and a quarantined one, but it ignored+blrank— which forbids exactly the same thing. The roles went out, the watcher took them straight back, and the command announced "3 roles restored". It now asks the same question as the rest of the bot, which also teaches it to respect durations: a+blrank 1hthat has run out no longer blocks anything. - 🔐 Incident mode no longer weakens the front door of the strictest servers:
+panicset verification to "High" without ever looking at where it already was. On a server set one notch above — the one that requires a verified phone — it therefore lowered it, while announcing "verification raised to maximum". At the worst possible moment, the screen said the opposite of what was happening. It now compares, never steps down, and says so: "already stricter — left as is". - 🛡️
+automoddisplayed "🔴 Disabled" next to a scam filter that was running: the table read the raw setting, but a key never set by hand does not mean "off" —antiscamis on by default. Every server that had never touched it was told its protection against trap links was dead, while it was working. The table now asks the same source the bot itself asks. - 🎫 Two buttons in the same DM no longer contradict each other about quarantine: "appeal" and "request a review" ask the same question — are you still isolated? — and answered the opposite. The first went by the remembered list, which is bounded in both age and size; the second fell back on the role. Someone whose entry had been evicted therefore still carried the isolation role and was denied any recourse, on a button we had just sent them. The role decides, for both.
- 🤖 The anti-bot challenge promised a wait that did not exist: after six wrong answers it announced "wait a bit then click Verify again". There was nothing to wait for — the next click served a fresh challenge with the attempt counter back to zero, reset by the very person it was counting. A bot could keep firing forever, and it did not even need to reach six: five failures then one re-click was enough to never trigger the lockout, the owner alert, or the learning signal. The lockout is now real (10 minutes, which the button cannot lift), the counter survives a re-click, and a human coming back later still starts cleanly from zero.
- ⚖️
+permsalonwas delegating a ban under the name of a warning:+warnsat in the closed list of per-channel delegable commands, filed under "moderation follow-up" as if it only wrote to a record. It triggers a ladder: 3 warnings mute, 5 kick, 7 ban. "Warn, but only in #giveaway" therefore handed out the power to ban any member below you, in seven commands — and nothing on screen hinted at it. Yet this module excludes, by written doctrine, sanctions aimed at a person and anything reaching beyond the channel.+warnis removed, and an automatic check now forbids listing any command that triggers that ladder. - 📋 The
+permsalonstate no longer shows delegations that grant nothing: the list of delegable commands sometimes tightens, and the usage check honours that immediately — but the screen kept reading old lines as if they still applied. A delegation dropped from the list now shows "no longer applies", with the reason and how to remove it. - 📝 The list edit window was deleting what it did not display: banned words and the link whitelist are written from two places — the command (
+badword,+linkwl) and the "Edit the list" button in+setup— and each had its own ceiling, unaware of the other's.+badword addaccepted 500 words, the window rewrote 200: opening it on a list of 300 and submitting deleted a hundred of them, without a word.+linkwl addhad no ceiling at all, while the window rewrote a hundred. A list now has a single ceiling, read by both doors. - 🪟 And the "Edit the list" button is no longer mute on a long list: Discord's text field is capped at 1,800 characters, and beyond that the window was rejected — a rejection swallowed in silence, so a button that did literally nothing, with no error and no explanation. It now says why, and points to
+badword/+linkwl, which edit one entry at a time without ever rewriting the whole set. - 🧱 The permissions panel vanished when there was too much to show: each embed field is capped at 1,024 characters by Discord, and going over throws before the message is sent — impossible to recover from. A role mention weighs 22 characters: forty-five roles filed under a single tier were enough for the screen to stop rendering entirely, with no message and no error. Measured by replaying the defect: zero fields rendered. It was precisely the server that most needed to review its tiers that could no longer do so. The list is now cut cleanly, and the number of hidden roles is stated — a silent cut would make a truncated tier read as a complete one.
- 🧹 Dead code that described guarantees, removed — after proving the guarantees still hold: two commands (
+note,+nukeadd) each kept their own copy of the "is this a real Discord id?" check, unread ever since that check moved to the shared resolver. A dead pattern that describes a guarantee makes the next reader believe it is the one holding it. Removed, and the guarantee is now tested where it actually lives:+note add 5,+nukeadd 5and<@5>still point at nobody. - 🛠️ A typo in a service name can no longer produce a permanently empty list:
+blgwand+blticshare a common body that turns a service name into a config key. On an unknown name it gave up silently — the list read as empty, adding replied "added ✅" over a write that never happened, and nothing would have flagged it until the day someone relied on that list. The bot now refuses to build such a command, naming the fault. - 🔍 Guardian's "Why?" button no longer answers the member it is watching: this button checks identity before revealing an alert's file — except on the *partial* answer, the one served for any alert reloaded after a restart. That branch answered before the check, so to anyone, including the person targeted. It does not show the raw signals, but it does show their name, their danger score and the expert verdict — that is, which rules fired, which is the manual for staying under the threshold next time. On a server with a public log channel, anyone could also read anyone's file. The check now comes before both answers.
- 🔒 "Never promoted again" finally holds everywhere:
+blrankblocks promotions, and a central module exists to enforce that rule on automatic role grants. Its own header named six sources to cover — measured: ranks, podium, boost role, autorole and autorank did consult it; levelling up, shop purchases and the role menu did not. Neither did the retroactive level-role backfill, nor custom commands. So gaining a level, clicking a menu button, paying in aura, or having a custom command run was enough to get back what the block had just removed. All five paths now ask the same question, and the refusal is visible: the menu says how many roles were blocked, and the shop refuses before charging. - 🏅 And automatic STATUS roles follow the same rule: king of the hill, PvP champion and the level tiers applied retroactively by
+levelrolewere granted with no human decision — and without consulting the rank block. A blocked member got their crown back on their next win, or their tier as soon as a manager configured one. - 🚨 A failed ban is no longer announced as a success: when a blacklisted member (
+bl) joined the server, the bot banned them — and posted "automatically banned" without ever checking whether the ban worked. The hierarchy check made a moment earlier is only a snapshot: it can be wrong a millisecond later, and Discord can refuse (permission removed, overload, rate limit). So the team read "banned" about someone who had just walked in and stayed. The result is now read, and the failure is stated, with instructions to ban by hand. - 🕸️ Same fix on the threat network and on kicking a dangerous bot: the network announced "banned (network-confirmed)" to all your servers for a ban whose failure was swallowed — a raider still present, described everywhere as gone, which switches off the vigilance of teams that saw nothing. The anti-raid did the same, titling "bot kicked" on a refused kick, leaving a bot with dangerous permissions in place under an alert saying it was handled.
- 🔇 And the anti-phishing filter no longer claims a timeout it did not apply: "message deleted and author timed out" was shown in every case — when the timeout failed, and even when the member was not moderatable, meaning nothing was even attempted. The message now says exactly what happened.
- 🚨 The panic word announced "verification at maximum" without checking it had been applied:
+lockwordlocks the whole server in one word, and its alert claimed the verification raise in every case — a Discord-side failure was swallowed. This is the gesture you make when everything is going wrong: the worst moment to read that a front door is shut when it is not. The alert now distinguishes three states — raised, already at maximum, or refused by Discord, with instructions to raise it by hand. - 🎫 A "released" ticket can no longer stay closed to the rest of the staff in silence: releasing a claim restores the access that
lock/hidemodes had removed. If Discord refused one of those restorations, the failure was swallowed and both release paths — the button and+claim— still announced "Ticket released". The stored state said "free", the channel said otherwise, and nobody could tell. The number of unrestored access grants is now counted and stated, with what to check. - 🔐
+baseprivate now counts the access grants that actually landed: the "N people keep access" message was computed from the requested list, not from the one that succeeded. A channel hitting Discord's overwrite limit, or a permission removed in between, could therefore lock out someone who had just been told they were in — including the person who had just closed the channel. - 👁️ A quarantine where the isolated person could not read their own appeal: the bot reopens the quarantine channel to the isolation role before posting the explanation there. When that access repair failed, the failure was swallowed — the message still went out, posted with the bot's own permissions, into a channel the isolated person could not see. None of the existing warnings covered this case: one is about the message not being posted, the other about the isolation not being applied. The staff is now told, with what to check.
- 🔗 And when a quarantined member returns, no more dead link to their ticket: the bot restores their access to their appeal ticket, then sends them a "Go to ticket" button. If restoring access failed, the button pointed at an invisible channel — an appeal route that exists on paper and nowhere else. They now get the appeal button instead, which knows how to reopen access.
- 🔉 You can no longer un-mute someone you are not allowed to mute:
+tempsmute,+ban,+kickand+warnall refuse to act on a member who is not strictly below the executor.+unmutewas the only command in its family checking nothing — so a sanction's exit door was wider than its entrance, at the same permission tier. A moderator could undo a timeout placed by someone above them, over and over, including the one the warning ladder (3 → muted) had just applied. The check is now symmetric. - 📄 The documentation site was about to label
+setupand+guardianas "👥 Everyone": each command's access badge is computed by the site generator, whose rule said "no Discord permission required → open to all". The bot says the exact opposite: a command with no declared permission falls back to the admin tier, and about a hundred commands are gated by tier rather than by permission. The live site was correct only because it predated that shift — measured, the next regeneration would have downgraded 82 badges, 50 of them from "Admin" to "Everyone", and+addrole/+delrolefrom "Owner" to "Everyone". The generator now follows the real tier, and an automatic check compares the two, command by command. - 👑
+nuke,+addroleand+delrolefinally state their real level: these three commands have their own gate in the dispatcher — the server crown, or a member registered by an owner through+nukeadd. They were therefore never open to staff. But the tier table did not say so: anything READING the tier rather than the gate underrated them, starting with the public site's access badge. They are now declared at the owner tier. It is also defence in depth: a guard that exists in only one place vanishes the day a branch is moved — the tier now doubles it. Delegation through+nukeaddis unchanged. - 💾 The Backup panel in
+setupno longer opened at all: clicking it produced nothing — no error, no message, nothing. The cause was a vanished variable: the optimisation that replaced a 4.4 MB read with a 72-byte summary removed its declaration but left its use on the "Restore" button. The exception was thrown before the message was even sent, so it stayed invisible, and a syntax check does not catch an undeclared name. The panel opens again, and "Restore" is only offered when a readable backup actually exists. - 🔒
+quiditcan no longer quote a private channel in front of everyone: the game picks a random message from the server, reproduces it word for word in the channel where the command was typed, then announces the author and the source channel. Its filter only looked at what the bot can read — so, on a server where it is an administrator, #staff, #logs and ticket channels. Since the command is open to everyone, any member could drain a private channel, one quote at a time. The game now only samples channels already visible to @everyone: deliberately stricter than "visible to whoever typed it", because the quote is republished to a whole channel. - 🛡️ The "Play again" button can no longer relaunch an owner command: it consulted a single permission check, which ignores three families handled earlier — owner-reserved commands, those with a dedicated gate (
+nuke,+addrole,+delrole), and root-owner ones. This was not exploitable: the button is only ever attached by public games, with a hard-coded command name. It is a belt fastened before someone adds a "Play again" elsewhere. - 🎁 The voice gift was running at 68% of its promised rate, invisibly: the "every hour" draw was a plain timer started at boot — no marker in the database, no pass on startup. It could only fire if the bot survived sixty uninterrupted minutes, and every restart silently cancelled the hour in progress. Measured against the real production log: only 8.8% of process lifetimes reach the hour, and one draw in three was lost. The deadline now lives in the database, so it no longer depends on how long the bot stays up. One catch-up after a long outage — never a burst.
- 🪝 "Webhook deleted" was announced in all three outcomes, and twice: when an unauthorised webhook appeared, the bot announced "deleted and member sanctioned" without ever checking what actually happened — including when it could not READ anything (permission removed) or when Discord REFUSED the deletion. And its own deletion came back to it: Discord reports the webhook disappearing, so the bot sanctioned and alerted a second time. A duplicate alert after every successful deletion. It now says which of the four cases occurred, and no longer answers itself.
- 🔥 Daily streaks broke at both clock changes:
+roue,+motusand the daily challenge worked out "yesterday" by subtracting twenty-four hours. But a Paris day lasts 23 h in March and 25 h in October: on 25/10 at 23:30 that calculation returns *the same day*, and on 30/03 at 00:30 *the day before yesterday*. Six one-hour windows over three years, the next on 25/10/2026 in prime evening hours. The challenge streak was recomputed and saved in the same call: it restarted at 1 for good. "Yesterday" is now derived from the calendar. - 📊 Every counter showed its neighbour's metric after a restore: counter channels and their metrics are two lists paired by position. A restore skipped the first one (channel IDs have changed) but let the second through — so "👥 Members" landed on the channel meant for "🟢 Online". Since each name stayed consistent with itself, nothing looked wrong. Worse: asking for exactly the same counters again in order to repair them destroyed the existing channels. Config cloning had the same hole, and carried a role ID across to the other server.
- 📈
+growthand+recaplost or duplicated a day after a clock change: the day window was walked in milliseconds while the days themselves are recorded against a calendar. On 25/10 the same day appeared twice and the oldest one dropped out of the selection; on 30/03 a day was skipped — fourteen slots spread over fifteen days. The log itself was correct: nothing needed repairing in the recorded figures, only in the way they were read back. - ♻️ Restoring a backup no longer creates a duplicate Administrator role: matching was done by role NAME only, even though the code's own comment promised matching by id — which existed nowhere. A role merely renamed since the backup ("Modo" → "Moderation") was therefore no longer recognised: the restore created a new one, with the original permissions, i.e. a second empty Administrator role on the server — and channel permissions were remapped onto the duplicate while the real role lost its own. An id does not change on rename: it is now checked first, with the name as fallback.
- 🧹
+nukecaptures no longer bloat backups, and they finally expire: before recreating a channel, the bot captures its last messages (up to 120 KB: names, text, attachment links) to offer a restore button for 6 hours. Two defects compounded — those captures escaped the filter that stops a backup from containing another backup, so they went into every snapshot, into the six history versions and into the encrypted archive sent by DM; and their 6-hour deadline was only enforced when the button was clicked, so without a click the key stayed in the database indefinitely. They are now excluded from backups and swept hourly. *(Measured in production: no server had any — the door was open, it had not been used.)* - 📌 An auto-pinned message could stay in the channel with
+sticky offunable to remove it — by two routes, both now closed. The first: two reposts of the same text going out at once (someone writes while the bot is re-posting) each believed it was the legitimate one, because they identified themselves by their TEXT — and two copies of the same text are indistinguishable. The second, and more frequent: the send had no safeguard, so when it took more than fifteen seconds, Discord received it while the bot thought it had failed and started over — up to four copies for a single send. Either way only one message was remembered; the others stayed behind, out of reach of the whole module. The bot now identifies itself by the message it was replacing, and only sends once. - 🎭
+massrolenow judges your rank on the TARGET server, not on the one you click from: this file states the rule in plain words — "the member of the target server, not of where you click from" — but it had only been applied to the entry gate. The anti-escalation check, one function below, read the member from the click location first: a high rank on your own server could be used to judge a mass role grant or removal elsewhere. Both checks now read the same source, and a member obtained from the target server is only accepted if it genuinely comes from it. - 🔢 The "Counters" page in
+setupcould become impossible to open, with no way out: a per-role counter is shown there as "🏷️ role name: N members". A role name can reach 100 characters and the cap is twenty counters — nine long-named roles were enough to cross a Discord field limit, which makes rendering fail before the message is sent: the page stopped opening entirely. The trap had no exit, since that page is exactly where counters are removed. The list is now cut on whole entries, and the number of hidden counters is stated. - 🐌 A channel can no longer stay slowed forever: when a burst dies down, the bot removes the slowmode it had set. It released its claim on the channel — in memory and in the database — *before* performing the removal, whose failure was swallowed. If Discord refused (permission removed in the meantime, rate limit), the bot had already forgotten it had slowed that channel: nothing claimed it any more, so no sweep retried, and the slowmode stayed in place indefinitely with nobody knowing where it came from. The channel is now only released once the removal has actually succeeded; otherwise the next pass retries.
- 🩺 The bot was telling you how to switch off its automatic message cleanup — with an instruction that did not work. When a button stops responding, the bot deletes the message carrying it and reports in the log channel. That alert ended with "to turn these alerts and the cleanup off: config
buttonhealth=off" — a setting no command in the bot could actually write. The switch now genuinely exists:+setup→ ⚙️ Detailed settings → 🧩 Modules → Dead-button cleanup. It is ticked by default, so nothing changes unless you touch it; unticking stops the deletion and the alerts. The alert text now points at that path, using your own prefix, and correctly describes what can be deleted (only a message from the bot, non-ephemeral, older than 2 h). - 🏅 Beyond 200 holders, an automatic rank became permanent: at each period close, the bot rebuilds the list of members it has granted a rank to — starting from an empty list, then replacing the old one wholesale. Since one pass only handles 200, all the others vanished from the registry: they kept their role, and the bot no longer knew it had granted it. Yet it only removes what comes from this system: the role became permanent, silently. Unprocessed holders are now carried over, and they go first — doing nothing costs an active member nothing, but it prevents any demotion for a holder.
- 💜 The "Status role" panel became impossible to open — and it is the very panel used to remove what you just added. A Discord embed caps each field at 1,024 characters, and going over does not shorten anything: it makes the whole display fail. Ten status messages at maximum length — that is, the maximum the bot itself allows, with nothing unusual done — crossed that cap: the panel answered "This interaction failed" through all five of its entry points, leaving you locked out with the key inside. The public
+soutienmenu had the same flaw with five refused roles, and there no setting was at fault: an admin merely had to give a sensitive permission, later, to an already-accepted role. Lists now keep whole entries and announce what did not fit, instead of cutting a message in half. - 🛡️ A total failure was counted as a neutralised threat: the
+postmortemverdict and the+digestcounter judged each defensive action by re-reading its sentence, looking for five words that signal failure. The anti-vanity wrote "restoration KO · derank KO" — meaning the vanity URL stolen and its author still in place — and none of the five words appeared: the incident was therefore filed among the actions carried out. A server that had just had its URL stolen was told "all actions succeeded". Defences now declare their failure instead of leaving it to be guessed, the sentence serving only for incidents already recorded, and both screens judge with the same function — they had two, written separately. - 🧠 Guardian's alarm no longer switches itself off on restart, in the most serious case: when the preventive derank can remove nothing — a dangerous role placed above the bot's own role — Guardian remembers that failure and leaves its accumulation alarm open, stating in its alert that the derank was impossible. That record of failure was not saved: on the next restart it reset, the alarm closed by itself and the alert stopped naming the failure — precisely where insisting mattered. A single deployment during the watch window was enough.
- 🔁 Guardian no longer undoes the decision two owners just made: when a late "Authorise" comes in, the bot restores the roles it had removed. But restoring a role is an event like any other, and Guardian's detector never looked at who had added it — so it re-detected itself, reopened a full watch and armed a preventive removal: the roles just restored were taken away again seconds later. The bot now recognises its own action, and only its own: recognition lasts thirty seconds and covers only the roles actually restored — any other role added during that window stays watched, otherwise the fix would have created a blind spot.
- 🔕 The security audit reminder no longer fires on every member coming and going: to avoid repeating the same list of weaknesses every half hour, the bot keeps a signature of it — meant to be independent of language and of counts. Two weaknesses out of nine start with their number ("3 at-risk member(s)…"): they escaped that normalisation and left the number inside the signature. So one at-risk member arriving or leaving was enough for the bot to treat the list as new and send it again. The signature also changed with the server's language, which its own comment forbids. All nine now resolve to their internal identifier.
- 🏆 The daily challenge podium can no longer be announced twice: the midnight close hands out XP member by member, which takes several seconds. If someone opened
+defiduring that window, the bot set aside "yesterday" — the very day it was closing — and the end-of-close decision was based on a state captured before that set-aside: so it was never cleared. On the next pass, the day was closed a second time: podium re-announced, and 80/50/30 XP handed out again. Measured by replaying the race: the XP did go out again on the following tick. The set-aside is now re-read after the waits, and cleared only if it duplicates the day just closed — one carrying another date keeps its right to its own close. - 🎡 The 3,000 🟣 wheel re-spin was destroyed at midnight, without a word. If you bought it after already spinning — the only situation where it is any use — and came back the next day, your
+rouewent out as that day's free spin and the paid re-spin vanished with it. The bot then answered "you have already spun today": no message, no refund, nothing to do but pay again. An unused re-spin is now carried over: it waits for your next+roue, whatever the day, and gives the extra spin you paid for — streak unchanged, as intended, and once only. - ⏳ A paid temporary role can no longer become permanent: on expiry, the bot removes the role then clears the deadline. It cleared it for all expired rentals, including those whose removal had just failed — the result was read, but only to count. The member then kept their paid role and the deadline vanished: nothing left to retry, and the temporary quietly became permanent. Only removals that actually happened now clear the deadline; a transient failure keeps it and is retried on the next sweep.
- ⚓ The
+navalelock no longer crosses servers: the bot runs in a single process for all your servers, and the "you already have a battle running" lock was keyed on the player's id alone. A game started on one server therefore blocked the command on every other one, with a refusal that made no sense to someone who had started nothing there. The lock now carries the server, and goes through a wrapper that requires it — the twenty-four places that use it can no longer forget it silently. - 🐎 A horse race interrupted by a restart no longer makes the bets vanish. Aura is taken as soon as someone bets, and the bot keeps the list of bettors aside so it can refund them if the race never finishes. But if the bot restarted mid-race and a player relaunched
+coursein the same channel before the automatic recovery pass had run, that list was overwritten by the new race: nobody knew who to pay back any more. The interrupted race's bets are now refunded before the new one takes its place. - 🏅 The games podium role (🥇/🥈/🥉 Top Games) was applied without going through the rank check. It is a role displayed separately in the member list: put on an account a moderator can no longer touch, it becomes an untouchable decoration. It now takes the same door as every other automatic role the bot grants — refused and logged when it sits too high, instead of being applied silently. Removal always remains possible.
- 🎮
+joueurannounced "you have the role" even when Discord had refused to apply it. The role-height check is a snapshot: the role moved above the bot's one second later, a permission revoked in between, and the member read the confirmation while having nothing. Both directions — taking the role and giving it back — now read Discord's answer before announcing, and say clearly when it did not work. - 🚫 The service blacklist now protects everyone it was meant to.
+blacklistcuts off everything at once (tickets, giveaways, reports) — yet it only refused the server owner, while its younger siblings+blticand+blgw, which cut off a single service, already refused far more. An owner added through+owner— someone trusted with security powers — could therefore be locked out of their own tickets by anyone with *Manage Server*. The broadest list was the least guarded. It now applies the same untouchables as the other two, with the same refusal message for all of them. - 👑 A lone server owner could not appoint their first co-owner.
+owner addrequires two confirmations from distinct owners — except, in principle, when there is only one, so the first delegation is possible. But the count included the bot's technical owners, who are not members of the server: the total was always at least two, the second confirmation never came, and the request stayed stuck on "1/2" forever. The quorum now counts only the owners actually present. An addition approved by a single voice now alerts every other owner and raises the server's monitoring — exactly as+unbl, Guardian and quarantine already do. - 🔔 A decision on an alert only closed one copy of it. The same security alert goes to your log channel and to every owner by direct message. When one of you clicked "Allow" or "Deny", only the clicked copy changed: all the others kept their buttons and a box still saying "pending". You would come back to one later, click — and only then learn, via "⏹️ expired or already replaced", that the decision had long been made. A decision now closes every copy: buttons removed, and the message states what was decided. Same when a newer alert replaces an older one. The buttons of a merely expired alert still work — deciding late remains possible, and that is deliberate.
- 🟣 "Hasn't farmed their aura yet", right under a 200,000 balance.
+aura @memberlooked at the number of+aurarolls — and the heist, double-or-nothing, the shop, bosses and events consume none of them. A player whose whole fortune came from the games was shown their balance and then, on the next line, told they had farmed nothing: rank and record hidden. On this bot, 7 of the 19 aura holders were in that situation. The leaderboard had the same flaw in its footer: outside the top 10, those players could not see their own line. - 🗂️ A restore's final confirmation promised the opposite of what one of its own buttons does. The panel stated that "nothing existing today is deleted" — and the exception it mentioned pointed back at the question asked on the previous screen, not at the three buttons right below it, one of which is 🧹 Purge, which deletes exactly those channels missing from the backup. The panel no longer promises what it cannot keep: it says the fate of what already exists depends on the mode you pick, and asks you to read all three before clicking.
- ⚔️ The end of a PvP season could go completely unnoticed. It was announced in the server's *system* channel — the one Discord creates at the start, which many servers delete or disable. On those servers: MMR reset, podium XP granted, Champion role moved… and not a word. With no catch-up either: the new month is claimed just before the announcement, so the season close never runs again. The PvP podium now goes where the games podium already goes, through the same fallback chain.
- 🚑 A post-raid recovery that repairs nothing no longer reports itself as "completed". After the owners' double approval, the operation could restore no ban and no role — missing permissions, role hierarchy position, a refusal from Discord. The bot still showed a green "completed" panel with three zeros, wrote "executed" in the security log, and the incident was counted among neutralised threats in
+postmortemand the digest. All three now tell the truth, and the panel says what to check before running it again. - 📦 The "Looter" badge was impossible to earn. It counted *wins* on supply crates — except a collected crate deliberately does not count as a win (otherwise the player leaderboard would become a crate-collector leaderboard). The counter was therefore frozen below the first tier forever. It now counts what its own description has always promised: crates collected. And unlocking it is finally announced — the badge check also sat behind the gate that skips events.
- 🔊
+vccrashed on a server with many busy voice channels. One line per channel, with no cap: past roughly forty busy channels the embed went over Discord's limit and the command stopped answering at all. It now lists the busiest channels first, stops before the limit while saying how many channels did not fit — and the total still counts everyone, listed or not. - 🧪 When the antivirus could not reach a verdict, someone finally hears about it. The bot never claims a file is clean when it could not check it — but the "unverified" warning was reaching nobody in several cases. Four situations out of eight did not trigger the fallback into the original channel, including the scanning quota running out, the one that happens soonest. A ninth was silent even with a log channel configured: when the file download fails — expired link, network, or a file lying about its stated size — nobody was told, whereas an honestly oversized file has always been reported. Finally, beyond five attachments per message the rest were never looked at, and nothing said so: the bot now states how many files nobody checked. These public warnings are capped at one per channel per minute, so they inform without taking over the conversation.
- 🎁 A giveaway could drop someone who had just entered. When several giveaways end at the same time the bot handles them one after another — and it drew from the participant list captured before it started. A "Join" click that arrived during the previous draw was properly recorded, the person read "entered", and was then dropped from the draw with their entry erased. The draw now re-reads the pot right before opening it.
- 📣 The promo-channel panel announced the requested location, not the real one. Picking a category saved the setting and then tried to move the channel — and if Discord refused (missing permission, category full at 50 channels), the failure was swallowed: the panel still said "in category X" while the channel had not moved. It now describes the channel as it actually is, flags the mismatch, and a refused move is said out loud.
- 🌍
+ecologspoke French on an English server. The aura source labels (farm, casino, shop…) can be translated, but the command never passed them the server — and it was their only caller. All three displays are fixed. - 🔒
+punitionannounced "quarantine → ban". It was false, and the setting did nothing. Quarantine bans nobody: it strips the roles carrying sensitive permissions, isolates the target, and everything is reversible in one click. Yet the sanctions screen showed a scale for all eighteen antiraid modules — while only ten read one. For the other eight, quarantine included, the line announced a sanction that does not exist, and+punition quarantine banwas accepted and then had no effect whatsoever: you believed you had armed a ban that was never there. The screen now lists only the genuinely adjustable modules, names the others and says what they do, and refuses the setting with the reason. Quarantine itself does not change one bit: it stays permanently active. - 🔒
+lockdownnow really locks EVERY channel. It only closed text and announcement channels. During a lockdown people could still talk in voice, post in forums and media channels, and — worst of all — keep writing in threads already open under text channels, since closing a channel does not close its threads. Now closed: text, announcement, forum, media, voice (both its built-in chat and the door), stage, the threads of each, and categories — so a channel created mid-siege is born silent too. - 🔓 …and unlocking no longer reopens what was closed on purpose. All four paths that lock —
+lockdown,+panic, the+basepanel button and the panic word — handed control back by erasing the restriction. An announcements channel, a rules channel, an archive: any channel deliberately read-only became writable at the firstoff, and the server left the siege more open than it entered it. The previous state is now remembered channel by channel and restored exactly. Two locks back to back no longer collide either — the second does not overwrite the first one's memory, which would have made the lock permanent. - 🧱 A half-applied lockdown says so. When *Manage Roles* is missing on some channels they stay open: the report now states how many channels out of how many could not be handled, instead of showing successes only. And as long as one channel resists, the memory of its original state is kept for the next attempt.
- 🚪 Four configuration commands could be opened to the whole server. The guard that prevents making a command public closed what destroys and what is filed under security — but not what reconfigures.
+setupslipped through: one message and any member could open the wizard, then the full panel — prefix, welcome message, log channel, banned words, and above all the role handed to every new arrival.+permsalonand+permpreset, which *delegate permissions*, slipped through too. The whole Configuration category is now closed to public opening. Accepted trade-off:+menu,+helpalland+soutiencan no longer be made public either. - 🔇
+voicekickand+movealltoo. The list of Discord permissions already considered reserved — the ones whose requirement blocks public opening — had left out Move Members. Both commands fell on the safe side of every criterion taken separately; opened to everyone, they let anyone disconnect anyone from voice on repeat. - 🗂️ Erasing a disciplinary record now takes the same rights as filling it.
+warnrefuses to warn someone ranked above you, and refuses to warn yourself.+sanctions clearand+sanctions delrequired nothing: a moderator could wipe their own record the day before the 7th warning — the one that bans — or delete the inconvenient entry from a senior's file. Both now apply the same hierarchy. And if the bot cannot read who a warning belongs to, it refuses to delete it instead of going ahead. - 🔑
+sanctionscan no longer be delegated per channel.+permsalon add sanctions #events @Hostlooked like granting a look at a record inside one channel. In realityclearanddelerase warnings server-wide — cancelling the ladder that bans on the 7th. That is exactly why+warnwas removed from this list, taken backwards.+history,+caseand+reason, which only read, stay delegable. - 🎫 A public channel named
#ticket-infocould be deleted on its own. Auto-close on inactivity picked its targets by channel name: anything starting withticket-was treated as a ticket. An inactive#ticket-info,#ticket-archiveor#ticket-rulestherefore got a warning, was then archived and deleted — pinned messages and history included, and with no log channel configured, with no copy at all. The three paths that close or delete without anyone asking now require the mark only the bot sets. The human gesture still recognises a ticket by its name, so tickets opened before that mark keep working. - 🔒 As soon as a server created a ticket type, the author could no longer close their own. The channel topic is
tkt:<author>ortkt:<author>:<type>— and four places still split the old shape, ending up with<author>:<type>instead of the id. The bot told the author "only the author or staff can close this". Worse, the "do you agree to close?" question, on by default, was never asked: the ticket closed without it. - 🚪 "Close the ticket when its author leaves" announced the closure and closed nothing. The archive was called with an argument of the wrong shape: the "Closed by" field came out empty, Discord rejected the message, and no transcript was ever saved. The channel itself was neither locked nor scheduled for deletion: it stayed open indefinitely. After a few months staff piled up dozens of "automatically closed" tickets still alive, with no record of what was said in them.
- ⬆️ The very first level-up of the day could pass in complete silence. Earning XP also advances the daily "farm X XP" contract — and when that contract completed, its XP reward levelled the member up through a side path that had no channel to speak in. The main announcement then saw the level had already moved and stayed quiet. No card, no message, no trace: the member levelled up with nobody seeing it. The flaw triggered roughly every other day, depending on which contracts were drawn — a test gate turning red on its own at the date rollover is what revealed it, on code nobody had touched.
- 🚨 Immediate fix to the unlock shipped earlier today. A
+lockdown offor+panic offrun on a server where no lockdown was in progress had nothing to restore — and made up for that emptiness by setting every permission back to "neutral" on every channel. In other words, the command meant to RESTORE restrictions was ERASING them: #announcements and #rules became writable by everyone, closed voice channels became joinable again. A reflex after a false alarm was enough. The bot now says there is nothing to unlock, and touches no channel. - 🛡️ The antiraid announced "sanctioned" without ever checking that it had been. Ten of its alerts — mass ban, unban, mass channel creation and deletion, server settings change, repeated voice disconnects, mass @everyone, webhook, dangerous role, unauthorised bot addition — fired the sanction and then, on the very next line, asserted it had happened, without awaiting or reading the answer. Against an author holding a role above the bot's, nothing happened: the team read "sanctioned", closed the incident, and the author carried on with their permissions. The alerts now report what actually happened — and when nothing could be done they say so plainly: "NOT sanctioned: they are still here, with their roles".
- 🌊 A join flood produced roughly 190 identical alerts, each with an
@here. The counter the alert reads is the size of the sliding window: it fired again on every new arrival for as long as the wave lasted. On a 200-account raid the log channel — the only surface where staff can read the incident — was drowned by the incident itself, with as many mass pings. One alert per wave now goes out, gated by the automatic lockdown's own lock, which was already protecting itself. - 🔒 The threat network announced "quarantine complete" without reading the quarantine's result. When the bot has "Manage Roles" but not "Manage Channels" — a very common setup — the isolation channel cannot be created: roles are indeed removed, but nobody is isolated and the member still writes everywhere. The alert went out anyway, in the log channel and by DM to every owner, claiming the opposite. It now tells the two cases apart and says what to check.
- 🏆 Three screens still showed an emoji twice, and the previous fix had missed half of them. The
+setupwizard places an option’s emoji next to its label itself: when the label starts with the same emoji, it shows up twice. In English, “🏆-hall-of-fame channel” was glued to its hyphen — and the cleanup requires a space after the emoji, so it never bit: the duplicate survived in the dropdown and in the “this is optional” note. The hunt boss announcement template, for its part, hard-coded 🐲, while one boss in four already carries that very emoji. Three labels were deliberately left alone:#🎮-jeuxand#🏆-salle-des-trophéesare the real names of the channels the bot creates, and “Monthly podium (🥇🥈🥉 roles)” lists the three medals — “fixing” them would have misnamed a channel and broken a list. - ⏳ A temporary ban deadline could lift a permanent ban. A moderator sets
+tempban @x 30d; a week later staff decides it is permanent and types+ban. On day 30 the forgotten deadline lifted that permanent ban — the log even announced "temporary bans expired". No ban command cleared the deadline, and the sweep never checked that the ban in place was its own. It does now: if someone re-banned since, the deadline is abandoned, the person stays banned, and the owners are told. - 🐢 The raid shield's crisis slowmode could stay on the welcome channel forever. When it escalates, the shield imposes 15 seconds between messages on the system channel and remembers the original value to restore it on the way down. But it erased that memory before knowing whether the restore had worked. If the system channel had changed in the meantime, or a permission had dropped, the channel kept its 15 seconds forever, and nothing knew it needed removing any more. The original value is now forgotten only once it has really been restored.
- 🛡️ Turning the raid shield off is an owner's gesture again, through every door. The
+setupbutton and the+secuselector already reserved turning it off to the server owner, spelling it out: *turning a protection on cannot hurt, turning it off can*. The direct command+shield off— and+shield reset, which drops the level to zero — had no check: any administrator could disarm the shield mid-wave. Turning it on stays open to administrators. - 🔁 “Both buttons do the same thing” — they no longer do. When a Guardian alert was replaced by a more recent one about the same member, clicking Allow or Deny on the old one gave exactly the same answer: “expired or already replaced”, nothing more. Yet the two are not equivalent: denying removes permissions, allowing gives them back. Deny now works from a replaced alert — it is the safe direction, and the button still targets the same member — while Allow tells you to open the recent alert, which carries the up-to-date evidence. A truly outdated alert (over seven days old) stays inert for both buttons, and now says so plainly.
- ◀️
+help: you can finally turn the pages. The code admitted it itself: there was no previous/next button. The dropdown assumed you already knew where to go, and Discord won’t let it list more than 24 pages. Two arrows ◀️ ▶️ now frame a “3/12” counter that tells you where you are, and they loop: before the home page, the last one; after the last, home. *(Live since August 30 — this note had been forgotten.)* - 🔒
+setverify offdeleted the role you had chosen. If verification had been set up with an existing role — often@Member, the one the whole server has and that opens the channels — turning it off deleted it: taken away at once from everyone who had it, and its channel permissions wiped for good. The screen only said the role "is no longer given", and the undo button recreated an empty role. From now on, only the "✅ Verified" role the bot created itself is deleted; your role is kept, whoever has it keeps it, and the screen says so. - 🏅
+autorank: a threshold of 0 gave the rank to everyone. A "2000 messages, 0 h of voice" tier was reached by every member, including people who had never written anything — zero hours of voice, everybody has that. The command already refused a tier at 0 and 0, but not a single criterion at 0, even though it advertised 0 as a valid value. A criterion at 0 now means "this criterion does not count", and the tier list no longer shows "0 min of voice" as if it were a threshold. - ⬇️
+autoranklost track of ranks it had handed out itself. At the end of a period, a member who was briefly unreadable — Discord answering badly for a few seconds — dropped out of the holders registry: they kept their rank forever, since the bot no longer knew it had to take it back. A refused removal (role moved above the bot) was still announced as "demoted", and a rank that had gained sensitive permissions since was not removed at all — precisely the one that must be taken back. Only a proven departure now erases a member from the registry; a removal that did not happen is no longer announced, and is retried the next period. - 🔕 Level-up announcements can finally be turned off. The Levels & XP menu of
+setupset the announcement channel and style (image card or plain embed), but never let you stop them: on every level-up the bot spoke — in the levels channel, or otherwise in the channel where the member was typing. A 🔕 Turn off announcements button now silences them entirely, and the screen shows the state; XP, levels and reward roles keep working exactly as before. A second click turns them back on. - 👑 No more false "danger score" alert on the server owner. The bot cannot sanction the crown anyway, so an alert about it asked nothing of anyone. On September 3 the ping and the DM had been removed, but the "🚨 High danger score — server OWNER … check whether their account is compromised" embed was still posted in the logs, for a mere server edit. It no longer is, and a bot added by the owner — which still went out as a critical alert with a ping — follows the same rule. The actions themselves are still logged one by one with their author, an owner placed under watch keeps their alerts, and compromised-account detection still keeps watch.
- 🔗 A forwarded link slipped past every filter. Discord's "Forward" feature posts a message with no text of its own: what it shows in the channel — text, clickable links, previews — is stored elsewhere in the message, and neither the anti-scam, nor the antilink, nor the new-member protection read it. Any member could therefore forward a phishing link from another server without it even being looked at. All three read it now.
- 🌱 A new member posting a link got two contradictory messages. "You're new here: links are limited… it unlocks by itself", then right away "Links are not allowed here" — plus a counted warning on top. On a server where the antilink forbids links for everyone, the first sentence was false: nothing would ever unlock. The two protections now speak with one voice: when the server's rule forbids the link, that rule explains it; otherwise the new-member protection does. Either way, the link is removed.
- ⚠️ "Links are not allowed here" could appear under a link that was still there. In a channel where the bot lacks permission to delete messages, the antilink still announced the removal, and warned nobody. It now says the message could not be removed, and warns the staff — once per channel.
- 🚪 The antilink's "all links" mode let through an invite written without
https://. "join discord.gg/…" was stopped by the "invites only" mode… but not by the strictest mode, the one that promises to block every link. Fixed, while honouring the allowed-domains list like any other link. And in "invites" mode, a GIF posted alongside no longer hides an invite. - 📡 The "attack in progress" signal dropped as soon as it was raised. When the bot spots a wave of joins or a wave of identical messages, it raises the server's threat level so its other defenses tighten (incident report, maintenance paused, urgent audit…). But that level started going down the very next millisecond — and since these signals sit exactly on their threshold, it fell below it at once: on their own, they reached no one. The level now holds for two minutes before going down.
- 🎖️ A level-up that brings a rank no longer mentions the member twice. With ranks enabled, the bot sent "🎖️ Promotion! @member reaches the rank 🗺️ Explorer!" then, right after, "🎉 Congratulations @member! You reach level 6!" — two messages and two mentions for a single event. It now sends just one: "🎉 Congratulations @member! You reach level 6 and the rank 🗺️ Explorer!". If level-up announcements are turned off, the promotion is still announced on its own, and a promotion is never announced when the role could not be given.
- 🎂
+birthdaycan set someone else's birthday. A bot admin — admin tier in+perms, or Administrator — can type+birthday @member DD/MM, or remove it with+birthday remove @member. Everyone still sets their own, and anyone can read someone else's. - ℹ️
+infois more complete — and more accurate. Announcement channels, stages and forums were not counted anywhere, and @everyone was counted as a role.+infoalso shows the server's security (2FA required for moderators, explicit content filter) and how many boosts are missing for the next tier.+infois now a real shortcut for+infos. - 🎣 The anti-phishing said "removed" even when the link was still there. In a channel where the bot lacks permission to delete messages, a phishing link stayed on screen — clickable — under a message claiming it had been removed, and nobody was warned. The bot now says plainly "do not click, I could not remove it" and warns the staff (once per channel). Same fix for webhooks: the alert to the owners says whether the message is gone or still visible.
- 📨 Forwarded messages also slipped past banned words and wave detection. After the antilink and the anti-phishing, the last two content filters now read a forwarded message's text: a forwarded banned word is removed, and several accounts forwarding the same message do form a coordinated wave.
- 🤫 Heightened monitoring is no longer announced. When a sensitive action is approved by a single owner, or after a
+reset, the bot watches the server more closely for ten minutes — and it wrote so in the log channel, which the person behind the action can see. A stolen account thereby learned it was being watched, and for how long. The monitoring is still applied; it just isn't announced. - 🧪 The self-check (
+diag full) no longer cries "failed test" when it simply ran out of time. The test suite now takes about a hundred seconds and the self-check stopped it at 90: it then showed "❌ test failed" with a random log line. Each harness now has a timeout that fits it; if one is still stopped, the report says so ("⏱️ stopped, no test failed"); and a real failure finally shows the name of the test that failed. - 🔤 A command's help showed its syntax with a
!that works nowhere. When a command is mistyped, the bot shows its syntax and examples. On some thirty commands the syntax read!command …— the catalogue's placeholder prefix, never the server's — and the examples kept+even on a server using another prefix. Both now follow the real prefix. And+ticketai #channelis now enough to pick the learning channel. - 🔔 A quarantine applied by the antiraid alerted no owner. When
+punitionset a module toquarantine, the member was isolated — but the private message to the owners never left, with no visible error. The bot now supplies what was missing itself, whichever module triggers the quarantine: alerting the owners is no longer a detail each protection could forget. - 🎫 The ticket log miscounted, and spoke French to English servers. After 30 quiet minutes, a new log message announced “12 events” while showing only one: it now restarts at 1, like the main log. And on a server set to English, the ticket panel title, the log's default values (“Aucune”, “personne”) and three words of transcripts stayed in French: all are translated now, and the French text is unchanged.
- 📖 The help keeps its buttons, and opens on the page you want. The arrows and menu of
+helpused to vanish after two minutes — and a bot restart left them visible but dead. They now work with no time limit, restarts included. And+help page 8(or+help 8) opens page 8 directly; a page that does not exist says so, with the page count. - 📦 Drops: a real turn-off message, and a switch in the menu.
+drops offanswered "Drops disabled." and nothing else. It now says what stops (no more crates drop; a crate already dropped can still be claimed), what is kept (allowed channels, daily cap) and how to come back — and it also says when drops were already off. New: a 📦 button in+setup→ 📈 Levels & XP turns them on or off, like the level-up announcement. - 🏆 Removing the hall of fame also removes its channel. Turning the hall off from the assistant left the channel in place, with a frozen board that nothing updated anymore. The channel is now deleted — only if the bot created it and it serves nothing else (levels, starboard, logs…); otherwise it is kept, and the answer says why. Records are still counted:
+sdtstill shows them. Reserved to the server owner. - 🛰️
+diagshowed the website badge as “active” while its updates were failing. The “Heartbeat” line only checked that a token existed: the public badge stayed frozen for over two weeks with no warning anywhere, and its last beat announced “0 servers”, sent before the bot knew its own.+diagnow tells whether updates actually succeed (error code and failure count included), and nothing is published before the bot is ready. - 🔑
+custompermand+changerejected aliases.+customperm settings adminanswered “unknown command” even though+settingsworks everywhere else. An alias now sets its command, under its real name — with the same rules: an alias cannot open to the public a command that cannot be public. - 🎂 The birthday announcement speaks the server's language. Its title and default message were hard-coded in French: a server set to English greeted its members with « Joyeux anniversaire ! ». They now follow the server's language; a custom message (
+birthday message) stays exactly the admin's own. - 🔒 Two doors tightened: four commands can no longer be opened to the whole server, and
+panicmoves to owners.+logs,+blgw,+blticand+nickcould be set to the public tier — anyone could then move the log channel, ban someone from giveaways or tickets, and rename any member. And+panic, which locks EVERY channel, raises verification to the maximum and switches antiraid to MAX, was open to administrators while+lockdown, which does less, is owners-only: both now follow the same rule. Default tiers are unchanged — nobody loses access they already had. - 🛡️ A command can no longer act on a channel from another server. Discord recognises a channel mention (
#channel) across every server the bot is in, not only the one you type in. An administrator of one server could therefore mention a channel from another server, and the bot would act there with its own rights: lock, unlock or hide it (+autolock,+autounlock,+autohide,+autounhide), add forum tags to it (+setsuggest), or post a leaderboard or a panel in it. About thirty commands read the mention without checking its server. Any command that mentions a channel from another server is now refused, with a message saying so — and it never silently falls back to the channel you are typing in, which could, for instance, have unlocked the wrong channel mid-raid. - 🎮
+steam: follow a game's Steam reviews in a channel. Give the game's ID, the link to its page, or just its name: every new review is posted as it comes, with the verdict, playtime and a link to the full review. At most 3 reviews per game per check (every 10 minutes), the rest summed up in one line — a hugely reviewed game will not turn the channel into a wall. Links inside reviews are removed: a review is written by a stranger, and the bot republishes it under its own name. Up to 5 games per server, language filtering, and adding a game never reposts the reviews already online. - 🎫 …and
+closenow follows the server's language too. The previous fix translated « Aucune » everywhere in tickets but one place:+closewith no reason still handed the French word to the archive and to the closing card on an English server. - 📦
+backup load <id>: a backup can finally travel to ANOTHER server. Every backup version now has an ID, shown by+backup list; typed on the destination server, it recreates the missing roles, channels and emojis there — without modifying or deleting anything already present — and copies the transferable settings. Whatever points at the source server stays there: channels, roles, added owners, allow-lists, secrets, live state. And whatever granted access or a tier to a MEMBER of the source server is dropped, then counted in the report: those people asked for nothing on the destination server. Base protections cannot be turned off by a load. Bot owners only, with a preview before confirmation. - 🔒
+stickercould be made to fetch an image from the bot’s own machine. The command accepts a web address, and a guard has always refused internal addresses (the machine itself or the private network). But that guard recognised only one spelling of those addresses: the same internal address written another way passed as public — and that is exactly the spelling Node’s address parser produces. The guard now decodes the address instead of recognising its shape, so every way of writing the same address is treated alike. No public image is affected — ordinary links work exactly as before. - 🖼️ Known scam screenshots are removed everywhere. The fake "successful withdrawal" screenshots that compromised accounts copy from server to server are now recognised by fingerprint — even recompressed, resized or forwarded — then removed by the anti-scam, with a notice saying what it is. The list is kept by the bot owner, applies to every server, and while it is empty nothing is downloaded.
- 📰
+newsshowed a "what's new" that deployments kept truncating. The command read a history file tracked by git: every deployment (git archive | tar -x) reset it to the repository's copy, and everything published since then vanished — silently, since the command always displayed something. Measured before the fix: out of the ten most recent published versions, nine were missing from+news, which jumped from September 2nd back to August 21st. It now reads the durable registry kept in the database (safe from deployments), merged with the archive for older versions. Along the way: a server set to English finally reads its news in English. - 🛡️ The
+setupassistant was the widest door for switching two protections off. Turning off the raid shield or automatic backups is reserved to the server owner — that is true of the+shield offcommand and of the settings panel. The assistant, however, is open to any administrator, and it let those two be switched off. An administrator (or an administrator account taken over by someone else, right before an attack) could therefore disable the shield, or set automatic backups to zero — something you only notice the day you need them. All three doors now agree: turning them ON stays open to whoever drives the assistant, only switching off requires the owner, and the refusal says so. - 🎁 "I turned drops off and gifts keep coming": here is why. Three things hand out gifts — surprise crates (
+drops), automatic events (+autoevents) and the voice gift (+vcgift) — and the first two look alike on purpose (same rarities, same emojis, same colours). The automatic event now carries its own name and the command that stops it, and+drops offsays which of the others are still on for this server. - ↩️ Screens you could not come back from — and a Back button announcing something else. In
+ticket, three screens (Form, Opening rules, Panel) did carry a back button… labelled "Buttons" with the colours emoji: you read "go to colours" and landed on the home screen. They now say "Back" ↩️. Picking a button colour also kicked you out to the home screen every time — and there are three colours to set, so three round trips for nothing: you now stay on the colours screen. In+setlogs, an action screen ended with nothing left to click: the way back to the routing list existed in the code but no button offered it; it is there now, and it rebuilds the list (so it is up to date). Finally,+massrolewiped its whole panel when the chosen role had no members — even though nothing had been done: the panel stays, and the notice goes to a private message. - ⏱️
+backupno longer waits between two calls. Listing your snapshots then restoring one was slowed down by a thirty-second pause; the command stays owner-only and the general anti-flood brake still applies. Along the way the cooldown rule is fixed: a delay set to zero now means "none" (it used to fall back to the default delay), and an unreadable setting no longer removes a command's limit. - 📌 One ticket panel, several channels, a single gesture. The
+ticket"Panel" screen could only post the panel in the channel where it had been opened: to have it in three channels you had to reopen+ticket settingsinside each one. A channel picker now sits next to the button — up to ten channels at once, and "Post the panel here" stays for the single-channel case. The report says what actually happened instead of assuming: served channels are named; a channel the bot may not write in is counted as a failure and the others are still served; a channel that already had a panel gets one anyway, because the registry ignores panels deleted by hand and refusing would have made re-posting one impossible — but you are told; and you are also told when the oldest ones drop out of the registry, because "Delete the panels" will no longer find them. - 🔒 Two restores can no longer run at the same time on one server.
+backup restore, the post-raid recovery and loading a backup from another server all go through the same door: while a restore is rebuilding channels and roles — which takes minutes — the next one is refused and says since when, instead of recreating every channel and role TWICE. The lock survives a restart and clears itself if the restore was interrupted. Along the way: a restore that fails no longer announces itself as "finished". - 🕳️ The bot no longer follows an address that points inside its own machine. When a command or a protection downloads an image whose address was chosen by someone else (
+sticker, tracked creators, image anti-scam, attachment scanning), that address now goes through a single guard — and the guard holds at CONNECTION time, so it also refuses a redirect or a domain name that changes its answer afterwards. The check already existed for+sticker; it only protected+sticker. - ↩️ Three screens you could not back out of. Post-raid restore opened on a question — what to do with the bot's channels? — with three answers and no way to back out: you had to pick one, then cancel on the next screen. The Cancel button is now right there. In
+bug, the category step gave no way back to the previous question: a wrong answer meant starting over, and an abandoned report is a bug nobody ever learns about. And the screen confirming a config push to another server carried a single red button: it now has its Cancel the push. - 🧪 A damaged configuration no longer silences a command. When a stored value does not have the expected shape — because it came from an import, from a backup taken by another version, or from a manual edit —
+bl,+custompermand the statistics counters stopped dead, without a word. They now read the configuration through the same contract as the rest of the bot: an unreadable value reads as "nothing configured", never as a crash. And the server prefix is validated by the SAME rule at every door that writes it, including importing a configuration and restoring a backup. - 📬 A forwarded message with no words never entered the request queue. Forwarding one of the bot's own messages back to it — “look at this” — is the simplest way to report something: everything is in the embed, there is no text and no attachment. Those messages used to leave no record and no acknowledgement. They are now archived with a summary of what the embed showed; your own words, when you write any, remain what counts.
- 🩹
+bl <member>had been broken since this morning — fixed. A fix deployed an hour and a half earlier left the command unable to write: it replied with an error and no rank blacklist was recorded (no role removal, no case, no log).+blwith no argument still displayed the list — which is what made it invisible. The automated check that should have caught it only ran the command against a target ALREADY in the list, so it never reached the part that writes. It now also exercises a fresh target. - 🛡️ A scam link got through if it was written without
https://. The bot's blocklist holds over 36,000 malicious domains — but it was only consulted for fully written addresses. A domain posted bare, or disguised the way people do when they know a filter exists (brackets or parentheses around the dot, a space before the dot, the word "dot" instead, a swappedh), was never compared against the list: seven characters less was enough. That is fixed, and those shapes are recognised. A bare domain is matched only against the list of already-known domains, never against the brand-impersonation detectors: a message quotingyoutube.comor a file name triggers nothing. Measured over 59,193 real texts from the bot: zero false positives added. - 🔐 Replying to someone no longer makes them a server owner. Typing
+owner addwith no target — the natural way to check its syntax — made the bot take the person you were replying to: Discord puts the quoted message’s author among the mentions. And where a single owner can confirm, no second approval was required: the co-owner was created in one message, with every security power that carries. The same trap applied to+antiraid whitelist add, which exempts someone from all raid protection. A target taken only from a reply is now refused: the bot names the person and hands back the exact command to type. Writing the target out (mention or ID) works as before, and reading the whitelist from a reply still works. - 🔑 The commands that decide “who can do what” now show examples.
+help cmdperm,+help change,+help changeall,+help permpresetand+help permsalononly showed a syntax line — accurate and unreadable:!permsalon add <command> #channel @roledescribes the grammar, not the use. Each card now carries copy-ready examples, written with your server's prefix, plus one sentence saying what the command really does (a by-name exception, a full replacement, an addition…). - 🔐 Replying to someone no longer lifts their ban, and no longer hands them a role. Two commands targeted the person you were replying to when no target was written out — Discord puts the quoted message’s author among the mentions.
+unbltyped in a reply with no target lifted that person’s blacklist, their ban on the server, and the same ban on every server where the person typing is an owner; with a single eligible owner, no second approval was required.+temprole addwas worse: the reply mention took priority over an ID that had actually been typed, so the role went to the quoted person while the written target was ignored, without a word. A target taken only from a reply is now refused — the bot names the person and hands back the exact command to type — and a written target always wins. Outside a reply, nothing changes. - 📋
+antiraid whitelist listfinally shows the same thing as+wl. Both already read the same list, each with its own layout — now there is only one. For the owner, the subcommand gives exactly+wl, add/remove panel included. For an administrator, the same list without the panel: changing the list that exempts from all security stays reserved to the crown 👑. Along the way, a real defect:+wlhad no display limit and, past roughly 186 whitelisted members, the embed did not render at all — the command answered nothing. The list is now bounded, and the footer still announces the real count. - 🛡️ The attack report only saw one fifth of the defences.
+postmortemand the “threats neutralised” counter in+digestread a single log — and twelve of the bot's fifteen sanction paths wrote nothing to it. A quarantine applied by the threat network, by compromised-account detection or by the raid shield appeared nowhere. Both chokepoints (quarantine and antiraid sanction) now record every action, with the module that decided it — and a defence that FAILS is recorded as such, instead of being counted among the neutralised threats. - 🔐 Replying to someone no longer strips their ownership, and no longer hands them a command. The last two commands targeted the person you were replying to when no target was written out.
+unownertyped in a reply with no target removed server ownership from the quoted co-owner, with no confirmation: that was the way out of+owner add, protected the same day — undoing stayed easier than doing.+cmdperm <command> addtyped in a reply granted that command to the quoted person,+banincluded. A target taken only from a reply is now refused: the bot names the person and hands back the exact command to type. Writing the target out works as before, and a mentioned role remains a valid target. - ↩️ You came from the guide, and there was no way back. The
+guide"Wizard" button replaces the checklist with the wizard — and no wizard screen led back to the guide: you had to type the command again. The closing summary (also reached by clicking "Close" at any step) now carries a Back to the guide ↩️, and it renders the checklist up to date. It only appears inside the configured server: the wizard can also drive a remote server from a direct message, and there the guide would not know which one to show — a button that does nothing is exactly what we are fixing everywhere. - 🇬🇧 The English help was half in French, and nothing could tell. The bot already checked that both languages keep the same typed words — that is essential, otherwise the help would describe a command that does not exist. But that check erases the variable parts (
<durée>,<#salon>,<émoji>…) before comparing: they could stay in French forever. 24 command syntaxes are now translated (<duration>,<#channel>,<emoji>,<new prefix>,<source server ID>…), and one of them was even half-translated inside the same angle brackets. What stays in French stays for a written reason: a language name, a work's title, a proper noun, or a word you must type as-is. - 🔐 Replying to someone no longer targets them: five sensitive commands fixed at once. Discord puts the author of the message you reply to among the mentions, so with no target written out five commands took them as the target.
+perm <tier> addgranted the admin tier to the quoted person — and writing the target out did not help, because the command never read what was typed: it does now.+purgeon its own deleted 100 of the quoted person’s messages (every channel withall),+unbanlifted their ban,+unwlremoved their raid-protection exemption, and+sanctions clearwiped their whole record. A target taken only from a reply is now refused, naming the person and handing back the command to type. Display commands (+avatar,+history…) are unchanged: replying to someone to point at them stays the natural way. - 🚪 Door kicks and threat-network bans now appear in the attack report. The account-age filter, the arrival screen (high risk index) and the threat network acted without leaving any trace in
+postmortemor in the “threats neutralised” counter of+digest: a server that had turned away thirty throwaway accounts during a wave read “no incident”. Fixed — and an action that FAILS (missing permission, member above the bot) is recorded as a failure, never as a neutralised threat. - 🛡️
+bantyped on its own while replying to someone banned them. Fixed, along with four other commands in the same family. Discord puts the author of the message you reply to among the mentions, so a command with no target written out took them as the target. The trap taught the opposite of the truth: outside a reply,+banalone does nothing ("I need a target"), so you learn the command is inert without an argument — and the same keystrokes, typed in a reply, banned, with 24 hours of messages deleted and the reason recorded as "no reason". Same fix for+unmute(which lifted the quoted person’s timeout),+nukeadd del,+blrank, and+note, where+note listin a reply stopped being the server view and published one member’s record in front of them. A target taken only from a reply is now refused: the bot names the person and hands back the exact command. Writing the target out works as before, and display commands are unchanged. - 👢 Three more punishment commands no longer target whoever you are replying to. Direct follow-up to the previous fix, on the three that KICK, BAN and MUTE. Discord adds the quoted message's author to the mentions:
+kicktyped alone in a reply kicked that person, confirmation embed included, and+tempsmutemuted them for ten minutes — without a single argument being written, since the duration has a default. And the command taught the opposite of what it did: outside a reply,+kickalone answers « mention a member ».+tempbanalready refused, but by accident — on « invalid duration », for lack of a default duration — it is guarded too. All three now name the person they would have targeted and ask for it to be written out; replying while writing the target is still allowed. - 🛡️ The attack report now shows the defence, not just the sanctions. The raid shield raises its level on its own during a wave — slowing the welcome channel, tightening watch, automatically quarantining arrivals — then steps back down when things calm. None of it appeared in
+postmortem: you read three quarantines without ever seeing the line that explains them. Level rises and returns to calm are now recorded, and a pass with no level change writes nothing (a flooded log stops being read). - 🎯 A channel deleted mid-quiz no longer stays stuck on "a game is already in progress". A quiz runs for several minutes. If the channel was deleted in the meantime, the bot could no longer release the lock it had taken at the start — and that channel stayed marked "game in progress" until the bot restarted. Nothing reported it: no error shown, just
+quizzrefusing to start for no visible reason. The lock is now taken and released on the same identifier, read once at the start. - 💸 A race in a channel deleted mid-game kept everyone’s stakes.
+courserefunds at the end through a channel lookup — and the channel no longer existed — so it failed silently: nobody was refunded, and the channel stayed marked “race running” until the next restart. Same fix for+lotoand+sondagefun, which take the same lock, and for sticky messages, where the same lookup — five seconds later, inside a timer — could restart the bot.+quizz, where this was spotted, was fixed just before. - 🎮 Steam review tracking no longer goes quiet when it can't post any more. The bot remembers the reviews it is about to announce BEFORE sending them, so the same batch is never posted twice. But remembering burns them: if its permission to write in the channel had since been removed (permissions changed, channel locked), or if the channel disappeared while the reviews were being read, the batch was marked as seen anyway — the reviews never appeared, and nothing said so. Every reason not to be able to post is now checked BEFORE the memory is written: nothing is lost, and everything comes back on the next pass as soon as the channel is restored.
+steamnow shows "I'm no longer allowed to post there" instead of a healthy-looking channel. - 🎯 Writing out the target of
+unflagand+heistdid nothing if you were replying to someone. Both commands read the mention before the argument — and since Discord puts the author of the message you reply to among the mentions, they were the one targeted, with the ID you typed silently ignored.+unflaghas the reverse consequence from the rest: it does not punish its target, it clears them — danger record wiped across every server, permanently. So you lost the record of someone you never aimed at, with nothing to signal it.+heistrobbed the quoted person, who could lose up to a quarter of their aura. Both now read the written target first, and refuse a target taken only from a reply, naming the person. - 🛡️ The path every ARRIVAL takes is now exercised before each update. It is the one a raid hits first, and the busiest in the bot: 25 protections fire there (anti-bot, anti-raid, join flood, quarantine, shield, arrival screen, autorole, anti-impersonation, threat network…), more than twice as many as those reading a message. None had ever run outside production, because doing so would mean letting real accounts into real servers. A bench now runs them all, against 16 hostile arrivals (accounts created seconds ago, nicknames made of invisible characters, homoglyphs of the owner, reversed writing direction…) plus a wave of 25 fresh accounts — a raid, in short. Verdict: no exception, no sanction on an ordinary arrival.
- 🔬 And the barrier guarding updates was writing to the real database. It claimed otherwise. Its verdict could therefore depend on what that database held — turning green or red for reasons unrelated to the code, and a barrier in that state is one you end up not trusting. Fixed, and both benches now share one single isolation. Visible side effect: the most expensive check drops from 361 ms to 7 ms.
- 🔑 A server prefix can no longer sneak in through a side door. What a prefix is allowed to be — three characters at most, no backtick, never a bare letter — is a rule kept in ONE place. But six places in the bot write that setting, and two never consulted it: the automatic restore when the bot is re-invited, and the buttons in the guide sent to the owner on arrival. A prefix inherited from an old snapshot could therefore come back — and an oversized prefix silences eight commands, including
+configand+menu, the very ones you would use to fix it. All six doors now apply the same rule,+prefixCALLS it instead of keeping its own copy, and the door count is tracked by a scan of the code: a seventh one that forgot the rule turns the tests red the day it is written. - 🧯 Removing a scam image from the list can no longer take others with it. The command accepts a line number or a fingerprint prefix. When the number matched no line — a typo, a shorter list than you thought — it was re-read as a fingerprint prefix:
del 99then erased EVERY rule whose fingerprint starts with "99", while the reply named only one. Same for a one-character prefix, which took about a sixteenth of the list. Since that list is GLOBAL — it protects every server — one removal too many is paid everywhere. A line number that does not exist is now refused out loud, and a fingerprint prefix must be at least four characters. - 💣 A server being destroyed by an administrator is now rehearsed before every update. A raid brings accounts IN; a nuke DESTROYS what exists, and it comes from someone who already has the rights — a compromised admin, staff leaving badly, a bot given too much. 23 protections watch that path (8 on channel deletion, 5 on role deletion, 4 on webhooks, 6 on server settings), and none had ever run outside production — testing it for real would mean deleting ten channels and ten roles on a live server. A bench now runs them all: a burst of deletions, a burst of roles, a webhook created then the server renamed. Verdict: the burst is punished, and the owner is spared — the most important invariant here, because if the bot stripped their roles by mistake, nobody would have the rights left to repair anything.
- 🎁 The voice draw’s "surprise gift" finally gives something. When no prize was configured, the winner got a DM congratulating them on a surprise gift 🎁 and telling them to contact the staff to claim it — except the staff had nothing to hand over: the prize was a piece of text, not a reward. The draw now grants 25 to 75 XP, plus the aura bonus the bot already pays on any game gain, and the message states the exact amount instead of pointing at the staff. If a prize has been configured (
+vcgift reward), nothing changes: the team hands it over, as before. - 🎯 Replying to someone can no longer make them the target — and the check that guarantees it is no longer copied around. Discord puts the author of a quoted message among the mentions: a moderation command typed with NO target, as a reply, therefore aimed at that person. Three batches had closed the door command by command. The essential part was missing: the list of protected commands was copied by hand into the tests, so a command added tomorrow could arrive unguarded with nothing to flag it. The count is now taken from the code itself — all 29 commands that designate someone are either guarded or listed with the REASON that exempts them and the code shape that makes that reason true. And the rule, which existed in SIX copied versions (two had already drifted apart), is now written in exactly one place.
- 🗄️ A snapshot of a wiped channel can no longer come back out of an old backup. Before clearing a channel, the bot keeps a six-hour snapshot of it so the channel can be restored — names and message text included. That snapshot was already excluded from server backups, but RESTORING one brought it back: a backup made by an earlier version of the bot rewrote up to 120 KB of members' messages per channel, under keys pointing at channels that no longer exist, hours after the six-hour window had closed. The intent was written in the code — "nor to come back out of a restore" — but the rule existed in two copies and only one of them had learned to recognise those snapshots. Now there is only one.
- 🛡️ A deleted channel no longer disarms the quarantine brake. A quarantined member may only post at intervals; beyond that their message is deleted and they get a reminder. That reminder was posted in the channel — and if the channel had just been deleted, the send failed, the error was swallowed, and the brake reported "message not braked". The quarantined account therefore slipped through, with nothing in the logs. The reminder is a convenience, the braking is the rule: if the channel is gone, the bot stays quiet and brakes anyway.
- 📍 A deleted channel can no longer trip up message handling. For the bot, "the channel a message is in" is not a fixed value: it is a lookup in its memory, redone on every read — and it returns nothing as soon as the channel has been deleted. One game already paid for this: the channel lock was never released, and the command kept answering "a game is already running" until the next restart. The last six places that read the channel that way just to get an id now read the id carried by the message itself, which cannot disappear.
- 🪜 « I grant myself full powers, then I empty the server » is now rehearsed before every update. This is the other half of sabotage: the previous check destroys channels and roles, this one goes after people. 29 protections watch that path — when someone receives a role, when a member is banned, when a member leaves — and none had ever run outside production. The bench now pushes: an administrator role handed to a three-day-old account, a role handed to someone you blocked with
+blrank, the bot being neutralised by having its own rights stripped, then eight bans and eight kicks in a row. Verdict: the blocked person does not keep the role, the owner is never punished, nothing crashes. - 🛡️ A channel deleted while a message is being processed no longer cuts automoderation short. The bot re-read the channel at every step — and a deleted channel (or simply one dropped from its cache, which happens to threads every hour) made the current step fail and every step after it: the warning never went out, and the rest of the message’s filters were abandoned silently. The channel is now held once, when the message arrives, so the protections already written against failed sends finally do their job.
Aucune version ne correspond.
🚀 Premiers pas
- 1Ajoute le bot à ton serveur ➕ inviter
- 2Lance la configuration guidée
+setup - 3Active l’essentiel antiraid
+antiraid+antibot+shield - 4Teste tes défenses sans risque
+firedrill - 5Note la sécurité de ton serveur
+scan
🛡️ Sécurité & Antiraid (66)
+antiraid 👑 Owner
Configure les modules antiraid du serveur (chaque module a aussi un raccourci direct, ex: !antibot on)
+antiraid | !antiraid <module> <on/off/valeur> | !antiraid whitelist add/remove/list @membre
👆 Clique pour voir une simulation
+punition 🛡️ Adminalias: +punitions, +raidpunition
Sanction appliquée par chaque module antiraid : derank, quarantaine, expulsion ou bannissement
+punition | !punition <module> <derank|quarantaine|kick|ban> | !punition all <sanction> | !punition <module> reset
👆 Clique pour voir une simulation
+creation 🛡️ Adminalias: +creationlimit, +agecompte
Âge minimum d’un compte Discord pour rester sur le serveur : les comptes trop récents sont refusés à l’arrivée
+creation | !creation limit <durée> | !creation off
👆 Clique pour voir une simulation
+raidignore 🛡️ Adminalias: +ignoresalon, +chanignore
Salons ou catégories où l'antiraid laisse créer et supprimer librement — une exception ÉTROITE, au lieu de whitelister un bot entier
+raidignore | !raidignore add <#salon> | !raidignore del <#salon> | !raidignore clear
👆 Clique pour voir une simulation
+fichiers 🛡️ Adminalias: +fichier, +files, +filefilter
Quelles extensions de fichiers sont admises sur le serveur, et à quelle cadence — garde les images sans accepter les exécutables
+fichiers | !fichiers autorise <ext…> | !fichiers interdit <ext…> | !fichiers spam <n/t> | !fichiers off
👆 Clique pour voir une simulation
+shield 🛡️ Adminalias: +bouclier, +raidshield
Bouclier de raid adaptatif : durcit automatiquement l'entrée du serveur pendant une montée de menace
+shield [smart | off | reset]
👆 Clique pour voir une simulation
+base 👑 Owner
Panneau unique : sécurités activées à jour en direct + toute la configuration (préfixe, thème, logs, scan…).
+base salon crée un salon dédié permanent (owner)+base [salon]
👆 Clique pour voir une simulation
+guide 🛡️ Adminalias: +demarrer, +start, +checklist
Guide de configuration de la sécurité : check-list vivante (ce qui est en place / à activer) avec ta progression
+guide
👆 Clique pour voir une simulation
+secu 🛡️ Adminalias: +securite, +modules, +secpanel
Active ou désactive les modules de sécurité : astreinte, dérive de configuration, self-bots, surveillance des webhooks, défi d'entrée, confiance progressive, bilan mensuel et bouclier
+secu
👆 Clique pour voir une simulation
+audit 🛡️ Adminalias: +secaudit, +posture
Lance l'auto-audit de sécurité à la demande (failles détaillées + actions par cible)
+audit
👆 Clique pour voir une simulation
+safe 🛡️ Adminalias: +scamcheck, +checklink, +phish
Vérifie si un lien ou un message est une arnaque / du phishing (analyse + VirusTotal)
+safe <lien ou texte> (ou réponds à un message avec +safe)
👆 Clique pour voir une simulation
+firedrill 🛡️ Adminalias: +exercice, +drill
Exercice d'attaque à blanc : simule un raid/nuke et montre ce qui se passerait (aucune action réelle)
+firedrill
👆 Clique pour voir une simulation
+postmortem 🛡️ Adminalias: +incident, +incidents, +autopsie
Post-mortem de la dernière alerte de sécurité : timeline chronologique (qui/quoi/quand) + réponse du bot et verdict
+postmortem
👆 Clique pour voir une simulation
+digest 🛡️ Adminalias: +secdigest, +rapportsecu
Bilan de sécurité du mois (score, incidents, croissance) : aperçu immédiat, ou envoi automatique en privé. `journal` = résumé quotidien des logs, `bilan` = bilan du jour publié dans les logs
+digest | !digest on | !digest off | !digest journal [on|off] | !digest bilan [on|off]
👆 Clique pour voir une simulation
+oncall 🛡️ Adminalias: +astreinte
Astreinte : les alertes critiques réveillent en priorité le staff réellement présent (en vocal / actif).
on/off + qui est joignable+oncall | !oncall on | !oncall off
👆 Clique pour voir une simulation
+alertesnipe 👑 Owner
Centre d'alertes de sécurité en direct (historique, salon, rôle, délai de relance) — s'actualise tout seul (owner)
+alertesnipe
👆 Clique pour voir une simulation
+alertconfig 🛡️ Adminalias: +alertes
Configure les alertes : ping en salon (@everyone/@here/rôle/aucun) et tes alertes en MP par serveur
+alertconfig
👆 Clique pour voir une simulation
+scan 🛡️ Admin
Scanne le serveur, signale les configurations dangereuses et propose de corriger
+scan
👆 Clique pour voir une simulation
+lockdown 👑 Owner
Mode panique : verrouille ou déverrouille tous les salons écrits
+lockdown on|off
👆 Clique pour voir une simulation
+panic 🛡️ Adminalias: +siege, +killswitch, +urgence
Mode incident : verrouille tout le serveur + vérification au max + antiraid MAX pendant une attaque (réversible en 1 clic, et rétabli automatiquement au bout de 6 h)
+panic | !panic off
👆 Clique pour voir une simulation
+lockword 👑 Owneralias: +motdepanique, +panicword
Mot de panique : un mot secret que TU tapes en chat verrouille tout le serveur en urgence
+lockword <set <mot> | unlock | approve | off>
👆 Clique pour voir une simulation
+punish 👑 Owner
Configure les sanctions automatiques selon le nombre d'infractions (strikes) — des paliers de mute par défaut s'appliquent tant que rien n'est réglé
+punish add <strikes> <temps> <sanction> [durée] | !punish del <numéro> | !punish list | !punish setup | !punish off | !punish reset
👆 Clique pour voir une simulation
+backup 👑 Owner
Sauvegarde et restaure le serveur. Trois périmètres : complète (rôles, salons, réglages, emojis), rôles et salons seuls, ou messages. `+backup` sans rien ouvre un menu
+backup [roles] | !backup [roles] info | list | restore confirm [n°] [smart|simple|purge] | !backup messages [n/salon] | !backup messages info | purge | restore confirm
👆 Clique pour voir une simulation
+undo 👑 Owneralias: +recover, +rollback
Annule les dégâts d'un attaquant sur les MEMBRES : débannit ses victimes + rend les rôles retirés (récupération post-raid)
+undo <@membre|ID> [minutes]
👆 Clique pour voir une simulation
+rerank 👑 Owneralias: +reranker, +rendrerole, +restorerank
Rendre à un membre les rôles que le bot lui a retirés (antinuke, antiraid, guardian, strikes) — la réparation d'un faux positif
+rerank | !rerank @membre | !rerank fenetre <durée>
👆 Clique pour voir une simulation
+offbackup 🛡️ Admin
Envoie une sauvegarde chiffrée en DM (off-serveur), ou gère l'envoi auto hebdomadaire
+offbackup | !offbackup auto on/off
👆 Clique pour voir une simulation
+quarantine 🔨 Staff
Liste les membres en quarantaine (ou !quarantine on/off pour activer/désactiver le module — raccourci de +antiraid quarantine)
+quarantine | !quarantine on/off
👆 Clique pour voir une simulation
+wl 👑 Owner
Whitelist : protège un membre de confiance (jamais sanctionné par l'antiraid) — 👑 Owner uniquement
+wl (liste) | !wl @membre/ID (ajoute)
👆 Clique pour voir une simulation
+unwl 👑 Owner
Retire un membre de la whitelist antiraid — 👑 Owner uniquement
+unwl @membre/ID
👆 Clique pour voir une simulation
+bl 👑 Owner
Blacklist rank : le membre ne peut plus recevoir aucun rôle, celui qui lui en donne un est SANCTIONNÉ, et il est banni dès qu’il (re)joint — 👑 Owner uniquement
+bl (liste) | !bl @membre/ID
👆 Clique pour voir une simulation
+unbl 👑 Owner
Retire un membre de la blacklist : il peut de nouveau recevoir des rôles et n'est plus banni à l'arrivée — 👑 Owner uniquement
+unbl @membre/ID
👆 Clique pour voir une simulation
+blrank 👑 Owneralias: +blacklistrank, +rankbl
Interdit à quelqu'un de recevoir le moindre rôle, et sanctionne qui lui en donne un — sans le bannir, contrairement à !bl
+blrank | !blrank add <@membre> | !blrank del <@membre> | !blrank clear
👆 Clique pour voir une simulation
+nuke 👑 Owneralias: +renew
Vide un salon en le supprimant puis en le recréant à l'identique.
+nuke lock protège un salon+nuke | !nuke lock | !nuke unlock
👆 Clique pour voir une simulation
+addrole 👑 Owner
Donne un rôle à un membre, par mention ou ID (réservé comme nuke : owners + autorisés via +nukeadd)
+addrole @membre/ID @role/ID
👆 Clique pour voir une simulation
+delrole 👑 Owner
Retire un rôle à un membre, par mention ou ID (réservé comme addrole : owners + autorisés via +nukeadd)
+delrole @membre/ID @role/ID
👆 Clique pour voir une simulation
+massrole 🛡️ Admin
Rôle de masse 🎭 à BOUTONS : Ajouter / Retirer / Remplacer A→B sur tous les humains — confirmation obligatoire (nombre impacté affiché), application étalée, garde-fous anti-escalade
+massrole (panneau) | !massrole @role | !massrole remove @role
👆 Clique pour voir une simulation
+derank 🛡️ Adminalias: +deranker, +retrograder, +strip
Retire à un membre ce qui lui donne du pouvoir — en lui laissant son rôle de membre et ses rôles décoratifs
+derank <@membre> [raison]
👆 Clique pour voir une simulation
+antiban 🛡️ Admin
Empêche de bannir plusieurs membres de suite (raccourci de +antiraid antiban)
+antiban on/off
👆 Clique pour voir une simulation
+antichannel 🛡️ Admin
Empêche la création/suppression/modification de salons (raccourci de +antiraid antichannel)
+antichannel on/off
👆 Clique pour voir une simulation
+antidelete 🛡️ Admin
Recrée automatiquement un salon supprimé (mêmes paramètres) (raccourci de +antiraid antidelete)
+antidelete on/off
👆 Clique pour voir une simulation
+autoescalate 🛡️ Admin
Passe en sécurité MAX automatiquement en cas de vague de joins (raid) (raccourci de +antiraid autoescalate)
+autoescalate on/off
👆 Clique pour voir une simulation
+antieveryone 🛡️ Admin
Empêche de ping @everyone/@here plusieurs fois de suite (raccourci de +antiraid antieveryone)
+antieveryone on/off
👆 Clique pour voir une simulation
+antiwebhook 🛡️ Admin
Empêche la création de webhooks — ces liens qui permettent de poster dans un salon sans compte, vecteur classique de spam et d'arnaque (raccourci de +antiraid antiwebhook)
+antiwebhook on/off
👆 Clique pour voir une simulation
+antiperm 🛡️ Admin
Anti-nuke : annule l'ajout de permissions/rôles dangereux (Administrateur, etc.) (raccourci de +antiraid antiperm)
+antiperm on/off
👆 Clique pour voir une simulation
+guardian 🛡️ Admin
Guardian : alerte les owners en DM si un membre récent reçoit des perms sensibles (raccourci de +antiraid guardian)
+guardian on/off
👆 Clique pour voir une simulation
+antiunban 🛡️ Admin
Sanctionne ceux qui tentent de débannir un membre (raccourci de +antiraid antiunban)
+antiunban on/off
👆 Clique pour voir une simulation
+antiupdate 🛡️ Admin
Empêche la modification des paramètres du serveur (raccourci de +antiraid antiupdate) + salons ignorés par la surveillance des salons
+antiupdate on/off | !antiupdate ignore #salon | !antiupdate unignore #salon | !antiupdate ignores
👆 Clique pour voir une simulation
+antivanity 🛡️ Admin
Protège l'adresse personnalisée du serveur (discord.gg/tonserveur) : elle est remise en place aussitôt si on la change, et l'auteur perd ses rôles sensibles (raccourci de +antiraid antivanity)
+antivanity on/off
👆 Clique pour voir une simulation
+antideco 🛡️ Admin
Empêche les déconnexions vocales abusives (répétitives) (raccourci de +antiraid antideco)
+antideco on/off
👆 Clique pour voir une simulation
+antitoken 🛡️ Admin
Repère une vague d'arrivées anormale (plusieurs membres en quelques secondes) et verrouille le serveur tout seul (raccourci de +antiraid antitoken)
+antitoken on/off
👆 Clique pour voir une simulation
+trust 🛡️ Admin
Confiance progressive 🌱 : un nouveau venu doit faire ses preuves — quelques jours de présence ou un peu de participation — avant de poster des liens ou de mentionner en masse. Les limites tombent seules, sans sanction (raccourci de +antiraid trust)
+trust on (protection de base — toujours active, non désactivable)
👆 Clique pour voir une simulation
+automod 🛡️ Admin
Détecte et sanctionne le spam de messages
+automod | !automod <antispam|antilink|antibadword|antimassmention|antiscam> <on|off>
👆 Clique pour voir une simulation
+strike 🛡️ Adminalias: +strikes, +bareme
Barème des strikes : combien chaque infraction d'automodération compte, et un poids à part pour les nouveaux venus
+strike | !strike <action> <0-10> [ancien|nouveau] | !strike <action> reset
👆 Clique pour voir une simulation
+ancien 🛡️ Adminalias: +anciennete, +ancienneté
Durée de présence à partir de laquelle un membre n'est plus « nouveau » pour le barème des strikes
+ancien | !ancien <durée> | !ancien reset
👆 Clique pour voir une simulation
+antispam 🛡️ Admin
Anti-spam : allume, éteint, ou règle sa sensibilité (n messages en t secondes) sans passer par le menu
+antispam | !antispam on|off | !antispam <n/t>
👆 Clique pour voir une simulation
+antilink 🛡️ Admin
Anti-lien : bloque les invitations Discord seules, ou tous les liens internet
+antilink | !antilink on|off | !antilink invite|all
👆 Clique pour voir une simulation
+antibadword 🛡️ Admin
Anti-mots interdits : allume ou éteint le filtre (la liste des mots se gère avec !badword)
+antibadword | !antibadword on|off
👆 Clique pour voir une simulation
+antimassmention 🛡️ Admin
Anti-mentions de masse : allume, éteint, ou règle le nombre de mentions toléré dans un message
+antimassmention | !antimassmention on|off | !antimassmention <n>
👆 Clique pour voir une simulation
+antibot 🛡️ Admin
Antibot : `on` active le mode intelligent (vérifie nom + ID officiel du bot et qui l'a ajouté), `strict` bannit tout bot, `off` désactive — + sort des bots inconnus
+antibot on|strict|off | !antibot inconnu ask|kick|allow
👆 Clique pour voir une simulation
+badword 🛡️ Adminalias: +badwords
Gère la liste des mots interdits (automod antibadword) — et les règles PAR SALON : mots tolérés ou interdits dans un salon/une catégorie, et périmètre d'application du filtre
+badword add <mot> | !badword remove <mot> | !badword list | !badword allow #salon <mot> | !badword deny #salon <mot> | !badword scope all|only|except [#salon…]
👆 Clique pour voir une simulation
+reactbl 🛡️ Adminalias: +reactblacklist, +blreact, +emojibl
Émojis interdits en RÉACTION — l'automod lit ce qui est écrit, une réaction lui échappait entièrement
+reactbl | !reactbl add <émoji…> | !reactbl del <émoji…> | !reactbl clear
👆 Clique pour voir une simulation
+autoslowmode 🛡️ Admin
Active le mode lent automatiquement pendant un pic de messages (retiré au calme)
+autoslowmode on/off | !autoslowmode set <msgs> <fenêtre_s> <lenteur_s>
👆 Clique pour voir une simulation
+linkwl 🛡️ Admin
Whitelist de domaines pour l'antilink, et règles PAR SALON : domaines autorisés ou bloqués dans un salon/une catégorie, et périmètre d'application de l'antilink
+linkwl add <domaine> | !linkwl del <domaine> | !linkwl list
👆 Clique pour voir une simulation
+lockrole 🔨 Staffalias: +lockrolename, +verrouroles
Fige un rôle entièrement : nom, permissions, couleur, affichage séparé et mentionnabilité. Toute modification est annulée et journalisée
+lockrole @rôle | !lockrole <nom|ID> | !lockrole del @rôle | !lockrole list
👆 Clique pour voir une simulation
+unlockrole 🔨 Staffalias: +deverrouroles, +unlockrolename
Lève le verrou d'un rôle figé par
+lockrole — il redevient modifiable+unlockrole @rôle | !unlockrole <nom|ID>
👆 Clique pour voir une simulation
+modlimit 🛡️ Adminalias: +modlimits, +limite, +limites
Plafonne l'usage des commandes de modération par rôle, par commande et par fenêtre de temps (ex. « modérateur : 3 ban / heure »), avec l'action à appliquer au dépassement
+modlimit | !modlimit add @rôle <commande> <max>/<durée> [block|alert|both|lock:<durée>] | !modlimit del <n°> | !modlimit status [@membre] | !modlimit reset [@membre] | !modlimit commandes
👆 Clique pour voir une simulation
🔨 Modération (39)
+ban 🔨 Staff
Bannit un membre du serveur (mention ou ID, même hors-serveur)
+ban @membre/ID [raison]
👆 Clique pour voir une simulation
+tempban 🔨 Staff
Bannit un membre temporairement (déban automatique à l'expiration)
+tempban @membre/ID <durée: 1h/1j/7j> [raison]
👆 Clique pour voir une simulation
+kick 🔨 Staff
Expulse un membre du serveur (mention ou identifiant) — il pourra revenir avec une nouvelle invitation
+kick @membre/ID [raison]
👆 Clique pour voir une simulation
+tempsmute 🔨 Staffalias: +tempmute
Réduit un membre au silence (écrit + vocal) pour une durée donnée
+tempsmute @membre/ID [durée: 30s/10m/1h/1j] [raison]
👆 Clique pour voir une simulation
+unmute 🔨 Staff
Rend la parole à un membre (retire le mute écrit et vocal)
+unmute @membre/ID
👆 Clique pour voir une simulation
+warn 🔨 Staff
Donne un avertissement à un membre (sanction automatique selon les paliers)
+warn @membre [raison]
👆 Clique pour voir une simulation
+warnexpiry 🛡️ Admin
Définit l'expiration automatique des avertissements (en jours)
+warnexpiry <jours> | !warnexpiry off
👆 Clique pour voir une simulation
+note 🔨 Staff
Notes internes du staff sur un membre — `!note all` montre toutes les notes du serveur d'un coup
+note add @membre <texte> | !note list @membre | !note all | !note del @membre <n°>
👆 Clique pour voir une simulation
+clear 🔨 Staff
Supprime d'un coup les derniers messages du salon (`+clear 50`) — Discord interdit d'effacer au-delà de 14 jours
+clear [nombre (1-100)]
👆 Clique pour voir une simulation
+sanctions 🔨 Staff
Affiche ou gère les avertissements (warns) d'un membre (mention ou ID)
+sanctions @membre/ID | !sanctions del <id> | !sanctions clear @membre/ID
👆 Clique pour voir une simulation
+history 🔨 Staff
Casier d'un membre : sanctions du bot + sanctions retrouvées dans les logs d'audit Discord (mémorisées)
+history @membre/ID
👆 Clique pour voir une simulation
+case 🔨 Staff
Affiche le détail d'un dossier de modération par son numéro
+case <numéro>
👆 Clique pour voir une simulation
+baninfo 🔨 Staffalias: +infoban, +whoban, +banwho
Qui a banni cette personne, quand et pourquoi — Discord garde le bannissement, pas son auteur ni sa date
+baninfo @membre | !baninfo <identifiant>
👆 Clique pour voir une simulation
+reason 🔨 Staff
Corrige la raison d'un dossier de modération existant
+reason <numéro> <nouvelle raison>
👆 Clique pour voir une simulation
+logs 🛡️ Adminalias: +journal
Recherche dans l'archive du journal (par membre, par type, par plage horaire) — la réponse part en message privé
+logs [@membre/ID] [type] [14h-16h]
👆 Clique pour voir une simulation
+purge 🔨 Staff
Supprime les messages récents d'un membre précis (ce salon, ou tous avec "all")
+purge @membre [nombre|all]
👆 Clique pour voir une simulation
+close 🔨 Staff
Ferme le ticket courant (immédiatement ou après un délai) et archive le transcript dans les logs
+close [raison] | !close <durée: 30m/24h/7j> [raison] | !close cancel
👆 Clique pour voir une simulation
+indice 🔨 Staffalias: +userinfo
Fiche d'identité complète d'un membre (modération + sécurité + indice de dangerosité local & durable)
+indice [@membre/ID]
👆 Clique pour voir une simulation
+moveall 🔨 Staffalias: +moov, +voicemove, +vmove
Déplacements vocaux : un membre vers ton salon / vers un salon / vers le salon d'un autre membre, ou tout un salon vocal (voire tous) vers une destination
+voicemove @membre · @membre #salon · @membre1 @membre2 · #source @membre · #source #dest · #salon (tout le monde)
👆 Clique pour voir une simulation
+dm 🛡️ Admin
Envoie un message privé à un membre (mention ou ID)
+dm @membre/ID <message>
👆 Clique pour voir une simulation
+say 🛡️ Admin
Fait parler le bot dans le salon (supporte {var:nom})
+say <message>
👆 Clique pour voir une simulation
+embed 🛡️ Admin
Crée un ou plusieurs embeds personnalisés dans un même message (titre | description | image, séparés par ---, supporte {var:nom})
+embed <titre> | <description> | [url image] · plusieurs embeds : sépare-les par ---
👆 Clique pour voir une simulation
+snipe 👥 Tous
Affiche le dernier message supprimé du salon, avec navigation (◀ ▶) et bascule supprimés/édités
+snipe [n] | !snipe edit [n] | !snipe @membre | !snipe exclure [#salon]
👆 Clique pour voir une simulation
+report 👥 Tousalias: +signaler, +signalement
Signale discrètement un membre au staff (avec son contexte de sécurité : indice, casier, perms…)
+report @membre <raison> · <ou en réponse à un message> · staff : !report on|off · anon on|off · salon [#salon] · staffrole @rôle · config
👆 Clique pour voir une simulation
+add 🛡️ Adminalias: +adduser, +ajouter
Ajoute un membre (ou tous les membres d'un rôle) au ticket courant
+add @membre [@autre…] | !add @rôle
👆 Clique pour voir une simulation
+remove 🛡️ Adminalias: +removeuser, +retirer
Retire un membre (ou tous les membres d'un rôle) du ticket courant
+remove @membre [@autre…] | !remove @rôle
👆 Clique pour voir une simulation
+nick 🛡️ Adminalias: +pseudo, +surnom
Change le pseudo d'un membre sur le serveur, et liste les membres renommés par le bot (
+nick list)+nick @membre <nouveau pseudo> | !nick @membre reset | !nick list [page] | !nick forget @membre
👆 Clique pour voir une simulation
+voicekick 🔨 Staffalias: +vkick
Déconnecte un membre de son salon vocal (il peut se reconnecter — sanction d'avertissement)
+voicekick @membre/ID [raison]
👆 Clique pour voir une simulation
+editsnipe 👥 Tousalias: +esnipe, +snipeedit
Affiche le dernier message MODIFIÉ du salon (avant → après, auteur, horodatage) — raccourci de
+snipe edit+editsnipe [N]
👆 Clique pour voir une simulation
+blacklist 🛡️ Adminalias: +ticketbl, +gwbl, +exclu
Blacklist « services » : empêche un membre d'ouvrir des tickets et de participer aux giveaways (sans le bannir)
+blacklist add @membre [raison] | !blacklist remove @membre | !blacklist list | !blacklist check @membre
👆 Clique pour voir une simulation
+autohide 🔨 Staff
Masque un salon à @everyone, avec réaffichage automatique à l'échéance
+autohide [#salon] [30m/24h/7j] | !autohide cancel [#salon] | !autohide list
👆 Clique pour voir une simulation
+autohideall 🛡️ Admin
Masque TOUS les salons à @everyone, avec réaffichage automatique à l'échéance
+autohideall [30m/24h/7j] | !autohideall cancel
👆 Clique pour voir une simulation
+autounhide 🔨 Staff
Réaffiche un salon à @everyone, avec retour à l'état d'avant à l'échéance
+autounhide [#salon] [30m/24h/7j] | !autounhide cancel [#salon]
👆 Clique pour voir une simulation
+autounhideall 🛡️ Admin
Réaffiche TOUS les salons à @everyone, avec retour à l'état d'avant à l'échéance
+autounhideall [30m/24h/7j] | !autounhideall cancel
👆 Clique pour voir une simulation
+autolock 🔨 Staff
Verrouille un salon (écriture refusée à @everyone), avec déverrouillage automatique à l'échéance
+autolock [#salon] [30m/24h/7j] | !autolock cancel [#salon] | !autolock list
👆 Clique pour voir une simulation
+autolockall 🛡️ Admin
Verrouille TOUS les salons, avec déverrouillage automatique à l'échéance
+autolockall [30m/24h/7j] | !autolockall cancel
👆 Clique pour voir une simulation
+autounlock 🔨 Staff
Déverrouille un salon, avec retour à l'état d'avant à l'échéance
+autounlock [#salon] [30m/24h/7j] | !autounlock cancel [#salon]
👆 Clique pour voir une simulation
+autounlockall 🛡️ Admin
Déverrouille TOUS les salons, avec retour à l'état d'avant à l'échéance
+autounlockall [30m/24h/7j] | !autounlockall cancel
👆 Clique pour voir une simulation
+temprole 🛡️ Adminalias: +roletempo, +tempole
Attribue un rôle à un membre pour une durée limitée — retrait automatique à l'échéance
+temprole | !temprole add @membre @rôle <durée> | !temprole list | !temprole del @membre @rôle
👆 Clique pour voir une simulation
⚙️ Configuration (29)
+setup 🛡️ Adminalias: +wizard, +assistant, +pasapas, +etapes, +configurer
Assistant de configuration pas à pas : tout le bot en un parcours — 🛡️ Sécurité, 🏘️ Communauté, 🎮 Jeux et 🎨 Apparence. Chaque choix est expliqué, avec Accepter ou Passer, et un sommaire pour naviguer
+setup
👆 Clique pour voir une simulation
+menu 🛡️ Admin
Ouvre le panneau de configuration du bot (alias de +setup)
+menu
👆 Clique pour voir une simulation
+config 🛡️ Adminalias: +settings, +reglages
Affiche toute la configuration actuelle du serveur
+config
👆 Clique pour voir une simulation
+exportconfig 🛡️ Admin
Affiche l'ID de ce serveur pour cloner ses réglages vers un autre
+exportconfig
👆 Clique pour voir une simulation
+importconfig 👑 Owner
Clone les réglages d'un autre serveur vers celui-ci (owner)
+importconfig <ID du serveur source>
👆 Clique pour voir une simulation
+prefix 🛡️ Admin
Change le symbole qui déclenche les commandes sur ce serveur (`+prefix !`) — 3 caractères maximum, `+prefix reset` (ou `off`) pour revenir au préfixe par défaut
+prefix <nouveau préfixe> | !prefix reset
👆 Clique pour voir une simulation
+theme 🛡️ Admin
Change la couleur des embeds du bot (menu help, etc.)
+theme <couleur|#hex> — ex: !theme jaune ou !theme #FFAA00
👆 Clique pour voir une simulation
+perm 🛡️ Adminalias: +perms
Paliers de permission : place un rôle ou un membre sur un niveau d'accès (1 à 9 — chaque niveau inclut les précédents)
+perm | !perm <1-9 ou modo|admin|owner> add <@rôle ou @membre> | !perm del <@rôle> | !perm clear
👆 Clique pour voir une simulation
+set 👑 Owneralias: +setperm
Donne un palier à un rôle ou un membre, ou lui accorde une commande précise
+set perm <modo|admin|owner|1-9> <@rôle|@membre> | !set perm <commande> <@rôle|@membre>
👆 Clique pour voir une simulation
+del 👑 Owneralias: +delperm
Retire son palier à un rôle ou un membre, ou lui retire une commande accordée
+del perm <@rôle|@membre> | !del perm <modo|admin|owner|1-9> <@rôle|@membre> | !del perm <commande> <@rôle|@membre>
👆 Clique pour voir une simulation
+permpreset 🛡️ Adminalias: +permpresets, +presetperm
Enregistre et recharge des jeux de permissions complets
+permpreset list | save <nom> | load <nom> | del <nom>
👆 Clique pour voir une simulation
+helpall 🛡️ Adminalias: +permsall, +aidetout
Affiche toutes les commandes triées par palier de permission
+helpall
👆 Clique pour voir une simulation
+ticketai 🛡️ Adminalias: +iaticket, +ticketia
Configure l’assistant de tickets : ce qu’il sait, et de qui il l’apprend
+ticketai [on|off|salon|ajouter|retirer|liste|essai|parler]
👆 Clique pour voir une simulation
+setlogs 🛡️ Admin
Salon des logs, aiguillage par action (ban, kick, mute…) + audit complet des commandes
+setlogs [#salon | here | off | routes | audit on/off | status]
👆 Clique pour voir une simulation
+setwelcome 🛡️ Admin
Configure le message de bienvenue (et le message distinct pour un membre qui REVIENT)
+setwelcome [#salon] | !setwelcome message <texte> | !setwelcome retour <texte|reset>
👆 Clique pour voir une simulation
+setgoodbye 🛡️ Admin
Configure le message d'au revoir (et le message distinct pour un membre qui était déjà venu plusieurs fois)
+setgoodbye [#salon] | !setgoodbye message <texte> | !setgoodbye retour <texte|reset> | !setgoodbye off
👆 Clique pour voir une simulation
+setverify 🛡️ Admin
Configure la vérification à l'entrée (bouton → rôle vérifié)
+setverify #salon @role | !setverify off | !setverify challenge on|off
👆 Clique pour voir une simulation
+setsuggest 🛡️ Admin
Définit (ou retire) le salon des suggestions — sur un salon FORUM, chaque suggestion devient un post débattable
+setsuggest [#salon] | !setsuggest off
👆 Clique pour voir une simulation
+setstats 🛡️ Admin
Crée des salons compteurs configurables (membres, humains, bots, boosts, rôles, salons)
+setstats [types...] | !setstats off — ex: !setstats members bots boosts
👆 Clique pour voir une simulation
+autorole 🛡️ Admin
Donne automatiquement un rôle aux nouveaux membres
+autorole @role | !autorole off
👆 Clique pour voir une simulation
+rolemenu 🛡️ Admin
Éditeur de menus de rôles 🎭 : boutons ou menu déroulant, un clic peut donner plusieurs rôles, modes multiple / exclusif / verrouillé, limites, apparence et contrôle d'accès — publication et duplication comprises
+rolemenu | !rolemenu creer <nom> @r1 @r2 | !rolemenu liste | !rolemenu editer <id> | !rolemenu envoyer <id> [#salon] | !rolemenu supprimer <id>
👆 Clique pour voir une simulation
+joincreate 🔨 Staff
Salon vocal "hub" : le rejoindre crée un vocal temporaire perso (Join-to-Create)
+joincreate <#vocal ou ID> | !joincreate off
👆 Clique pour voir une simulation
+custom 🛡️ Admin
Crée et configure des commandes personnalisées
+custom add/del/list/info/set/bouton/menu/composants — ex : !custom add salut Coucou {user} !
👆 Clique pour voir une simulation
+var 🛡️ Admin
Variables personnalisées du serveur, réutilisables via {var:nom}
+var set <nom> <valeur> | !var del <nom> | !var list
👆 Clique pour voir une simulation
+permsalon 🛡️ Adminalias: +permchan, +cmdsalon
Autorise un rôle à utiliser une commande dans un salon précis (en plus de ses permissions actuelles)
+permsalon | !permsalon add <commande> #salon @rôle | !permsalon del <commande> #salon @rôle | !permsalon list | !permsalon commandes
👆 Clique pour voir une simulation
+autothread 🛡️ Adminalias: +filauto, +autofil
Ouvre automatiquement un fil sous les photos d'un salon (mode lent réglable) et peut n'y accepter que des images
+autothread [#salon] [image|tous] | !autothread lent <s> #salon | !autothread nom <modèle> #salon | !autothread onlypic on|off #salon | !autothread off #salon
👆 Clique pour voir une simulation
+pinlog 🛡️ Adminalias: +epingles, +pinlogs
Remplace l'avis « X a épinglé un message » par un embed : qui, quoi, et un lien direct
+pinlog on|off | !pinlog salon #salon | !pinlog salon reset
👆 Clique pour voir une simulation
+ghostping 🛡️ Adminalias: +gp, +pingfantome
Mentionne discrètement un nouveau membre à son arrivée, puis supprime le message aussitôt
+ghostping [#salon] | !ghostping on|off | !ghostping test
👆 Clique pour voir une simulation
+soutien 👥 Tousalias: +support, +soutiens
Récompense les membres qui affichent le tag du serveur : rôle(s) automatique(s) et salon vocal réservé
+soutien | !soutien on|off | !soutien add @rôle | !soutien del @rôle | !soutien ou nom|statut|deux | !soutien soeur add <id> | !soutien scan | !soutien list
👆 Clique pour voir une simulation
🎮 Jeux & Fun (49)
+jeux 👥 Tousalias: +games, +jeu, +jouer
Le hub des jeux 🎮 : navigue par catégorie (menu déroulant) dans tous les jeux du bot + l'économie (aura ↔ XP)
+jeux
👆 Clique pour voir une simulation
+aura 👥 Tousalias: +auramax, +auras
Farme tes points d'aura 🟣 : un move stylé en gagne, un moment cringe en perd. Classement par serveur
+aura · !aura @membre · !aura top · !aura gif <url>
👆 Clique pour voir une simulation
+shop 👥 Tousalias: +boutique, +store, +magasin
Boutique d'aura 🛒 : dépense ton aura en bonus (bouclier anti-braquage, sortie de prison, relance de la roue, lot mystère), en cosmétiques (couleur de pseudo, rôle perso, emoji, icône) et en rôles du serveur
+shop · !shop addrole @rôle <prix> · !shop delrole @rôle
👆 Clique pour voir une simulation
+casino 👥 Tousalias: +slots, +blackjack, +roulette, +bj
Casino 🎰 : mise ton aura sur la machine à sous, le blackjack ou la roulette — les gains sont versés en XP + un bonus d'aura (la mise est consommée)
+casino [slots <mise> | bj <mise> | roulette <mise> <pari>]
👆 Clique pour voir une simulation
+roue 👥 Tousalias: +wheel, +spin, +fortune, +daily-spin, +daily, +streak, +serie, +quotidienne
Roue de la Fortune 🎡 : un tour GRATUIT par jour (aura, XP ou jackpot) et une récompense quotidienne. Reviens chaque jour — plus ta série est longue, plus les gains montent
+roue [top]
👆 Clique pour voir une simulation
+heist 👥 Tousalias: +braquage, +cambriolage, +braquer
Braquage d'aura 🦝 : tente de braquer un membre. Réussite = tu le délestes de son aura et gagnes de l'XP, échec = prison (cooldown + amende)
+heist @membre
👆 Clique pour voir une simulation
+warhammer 👥 Tousalias: +wh, +wh40k, +grimdark
Jeu de rôle grimdark (Warhammer 40k) : combats au tour par tour avec lore et cris de guerre. Seul contre l'ordinateur, ou `+warhammer @joueur` pour un duel ou une coopération. `+warhammer boss` = boss de serveur, frappé par tout le monde
+warhammer [faction | @joueur | top | boss]
👆 Clique pour voir une simulation
+ligue 👥 Tousalias: +elo, +pvp
Ligue classée PvP 🏅 : tes duels +warhammer @x rapportent du MMR (Bronze → Argent → Or → Grimdark), saison mensuelle avec récompenses (rôle + aura)
+ligue [top | @membre]
👆 Clique pour voir une simulation
+war 👥 Tousalias: +guerre, +territoires
Guerre de territoires grimdark 🗺️ : les factions Warhammer conquièrent une carte de secteurs 40k, semaine après semaine
+war [push | status | reset]
👆 Clique pour voir une simulation
+scenario 👥 Tousalias: +oracle, +conseil, +evenement
Événement narratif grimdark 🗳️ : le bot pose un scénario, le serveur vote, et l'issue impacte la guerre de territoires (+war)
+scenario
👆 Clique pour voir une simulation
+enquete 👥 Tousalias: +whodunit, +heresie, +investigation, +mystere
Enquête coop « Hérésie à bord » 🕵️ : un whodunit grimdark à déduction — croise les indices, accuse le traître (le plus tôt, le plus payant) et gagne de l'XP
+enquete
👆 Clique pour voir une simulation
+missions 👥 Tousalias: +contrats, +quests, +daily-missions, +quotidien
Contrats quotidiens 🎯 : 3 missions par jour (gagner des combats, farmer, jouer…) qui rapportent de l'XP, + bonus si tu les boucles toutes
+missions
👆 Clique pour voir une simulation
+objectif 🛡️ Adminalias: +goal, +weekly, +hebdo
Objectif de serveur hebdomadaire 🏆 : un but collectif (farmer de l'XP, gagner des combats…) avec une barre commune — tout le monde est récompensé s'il est atteint
+objectif
👆 Clique pour voir une simulation
+quidit 👥 Tousalias: +whosaidit, +quiadit, +qad
Qui a dit ça ? 🕵️ Le bot cite un vrai message passé du SERVEUR (plusieurs salons échantillonnés) — devine son auteur parmi 4 pour gagner de l'XP
+quidit
👆 Clique pour voir une simulation
+enigme 👥 Tousalias: +riddle, +devinette, +enigmes
Chasse aux énigmes 🧩 : le bot pose une devinette, le 1er à écrire la bonne réponse en salon gagne de l'XP
+enigme
👆 Clique pour voir une simulation
+autoevents 🛡️ Adminalias: +events, +autoevent
Événements surprises automatiques (pluie d'XP, quick draw) pour animer le serveur sans que personne ne lance rien
+autoevents on | off | ici | #salon | test | status
👆 Clique pour voir une simulation
+tournoi 👥 Tousalias: +tournament, +coupe, +bracket
Tournoi à élimination 🎪 : inscris-toi, puis affronte les autres en duels de réflexe jusqu'à la finale — le champion gagne de l'XP
+tournoi
👆 Clique pour voir une simulation
+expedition 👥 Tousalias: +expe, +voyage, +campagne
Expédition Warhammer 40k 🗺️ : seul ou en équipe (`+expedition coop`, 2 à 4 joueurs), un voyage à choix multiples avec coup spécial de faction, butin, élites et boss final adapté au groupe
+expedition | !expedition coop | !expedition top
👆 Clique pour voir une simulation
+course 👥 Tousalias: +race, +horserace, +courses
Course hippique avec paris 🏇 : mise ton aura sur un cheval de légende, suis la course en direct et empoche ta mise multipliée par la cote s'il gagne. Deux parieurs minimum
+course [mise]
👆 Clique pour voir une simulation
+maitre 👥 Tousalias: +trone, +koth, +roi
Le Maître de guerre 👑 (roi de la colline) : un titre unique par serveur. Défie le tenant en duel (il choisit l'arène), règne pour toucher un revenu passif d'XP.
+maitre setup crée le rôle+maitre [setup]
👆 Clique pour voir une simulation
+imposteur 👥 Tousalias: +undercover, +espion
L'Imposteur 🕵️ : jeu de bluff social (4 à 10 joueurs). Les civils partagent un mot, l'imposteur en a un voisin — indices, votes, et l'imposteur démasqué peut encore gagner en devinant le mot
+imposteur
👆 Clique pour voir une simulation
+gala 👥 Tousalias: +grandquizz, +samedi, +quizgala
Grand Quiz du samedi soir 🎙️ : chaque samedi 21h, tous les serveurs inscrits jouent le MÊME quiz en simultané, avec un classement inter-serveurs.
+gala on (admin) inscrit ce salon+gala [on | off | test]
👆 Clique pour voir une simulation
+drops 🛡️ Adminalias: +caisses, +drop
Drops surprise 📦 : des caisses surprises tombent dans les salons actifs (1er à cliquer / résoudre l'énigme gagne de l'XP). Admin : active et choisit les salons
+drops | !drops on|off | !drops setup #salon [#salon2] | !drops max <3-12>
👆 Clique pour voir une simulation
+puissance4 👥 Tousalias: +p4, +connect4, +puissance
Puissance 4 : aligne 4 jetons contre un membre (ou le bot), en boutons
+puissance4 [@membre]
👆 Clique pour voir une simulation
+ship 👥 Tous
Calcule le taux de compatibilité amoureuse entre deux membres
+ship @membre1 [@membre2]
👆 Clique pour voir une simulation
+gay 👥 Tous
Le gaymètre : mesure le taux de gaytitude d'un membre (pour rire)
+gay [@membre]
👆 Clique pour voir une simulation
+rps 👥 Tous
Chifoumi (pierre-feuille-ciseaux) contre le bot
+rps <pierre|feuille|ciseaux>
👆 Clique pour voir une simulation
+devine 👥 Tous
Devine le nombre mystère — MULTIJOUEUR ! Tape un nombre pour rejoindre la partie en cours. Podium + records (1-100 · +devine 1000 pour 1-1000)
+devine [1000]
👆 Clique pour voir une simulation
+tierlist 👥 Tousalias: +tier, +tl
Tier list (S→D) : chacun fait la SIENNE du thème en cours (bouton). 14 éléments · thèmes curatés ou ta liste
+tierlist [random] [thème | thème: a, b, c, …]
👆 Clique pour voir une simulation
+makeitmeme 🛡️ Adminalias: +mit, +memegame, +legende, +memeparty, +mim
Make It Meme 🎭 : une même image pour tous, chacun écrit sa légende en secret, puis le salon vote anonymement pour la plus drôle. 3 à 10 joueurs, 1 à 5 manches, combos, XP, aura et classement final
+makeitmeme [nombre de manches 1-5] | !makeitmeme historique | !makeitmeme stats [@membre]
👆 Clique pour voir une simulation
+quizz 👥 Tous
Quiz multijoueur : 10 questions, le plus de bonnes réponses gagne un boost d'XP (thème tournant)
+quizz
👆 Clique pour voir une simulation
+sondagefun 👥 Tous
Jeu de sondage : votez un thème, puis 5 manches « vote comme la majorité » avec classement
+sondagefun
👆 Clique pour voir une simulation
+loto 👥 Tous
Loto : prends un ticket, le plus proche du tirage gagne un gros boost d'XP !
+loto
👆 Clique pour voir une simulation
+memory 👥 Tousalias: +paires, +memoire
Jeu de mémoire solo 🧠 : retrouve les 8 paires d'emoji en un minimum d'essais — plus tu es efficace, plus tu gagnes d'XP
+memory
👆 Clique pour voir une simulation
+demineur 👥 Tousalias: +mines, +demine
Démineur solo 💣 : révèle des gemmes pour faire grimper ton pot d'XP, évite les 3 bombes, et encaisse avant de sauter !
+demineur
👆 Clique pour voir une simulation
+defi 👥 Tousalias: +dailygame, +dg, +défi
Défi quotidien 🎯 : la même grille de démineur et le même memory pour tout le serveur, un seul essai chacun (parties privées anti-spoiler) — podium et XP à minuit, série de participation
+defi | !defi setup #salon (admin)
👆 Clique pour voir une simulation
+motus 👥 Tousalias: +wordle, +sutom, +motdujour
Le « mot du jour » façon Wordle/Sutom 🟩 : un mot mystère commun à tout le serveur, 6 essais, feedback 🟩🟨⬛, série de jours et partage sans spoiler
+motus [ton mot] · !motus classement · !motus stats · !motus partage
👆 Clique pour voir une simulation
+tupref 👥 Tousalias: +tuprefere
Lance un « Tu préfères… ? » (aléatoire, ou personnalisé : +tupref X ou Y) avec votes en direct 🅰️/🅱️
+tupref [option A ou option B]
👆 Clique pour voir une simulation
+mog 👥 Tous
Mog une ou PLUSIEURS personnes, façon chad bipolaire 🗿💅 (fun, avec gif — contre-mog et critiques possibles)
+mog [@membre1 @membre2 …]
👆 Clique pour voir une simulation
+ftg 👥 Tousalias: +tg, +chut
Dis (gentiment) à quelqu'un de fermer sa gueule 🤫 — meme/banter avec GIF, les autres valident avec la réaction ➕
+ftg @membre
👆 Clique pour voir une simulation
+vcgift 🛡️ Admin
Cadeau vocal : tirage au sort parmi les membres en vocal (immédiat, chronométré ou auto)
+vcgift | !vcgift <durée: 30s/10m/1h> | !vcgift on/off | !vcgift channel #salon | !vcgift reward <texte>
👆 Clique pour voir une simulation
+raid 🛡️ Adminalias: +hack
Gag : fausse séquence de « hack/raid » avec barre de progression… puis grosse surprise 😈
+raid [@membre]
👆 Clique pour voir une simulation
+pet 👥 Tousalias: +mascotte, +familier
La mascotte du serveur : la communauté la nourrit en restant active… et elle dépérit si ça s'endort
+pet [feed | play | name <nom> | channel [#salon] | alerts on/off | adopt [nom]]
👆 Clique pour voir une simulation
+morpion 👥 Tousalias: +tictactoe, +ttt
Joue au morpion (tic-tac-toe) contre un membre — ou seul contre le bot (
+morpion) — avec des boutons+morpion [@membre] · !morpion (seul = contre le bot 🤖)
👆 Clique pour voir une simulation
+bang 👥 Tousalias: +duel, +western
Jeu de duel : chaque manche, 2 joueurs s'affrontent au plus rapide dans un salon au hasard — le dernier en vie gagne
+bang · !bang gif <url>
👆 Clique pour voir une simulation
+navale 👥 Tousalias: +battleship, +bataille, +touchecoule
Bataille navale ⚓ : contre l'ordinateur (`+navale`) ou contre un membre (`+navale @adversaire`) — coule sa flotte case par case, un coup au but te fait rejouer. Le vainqueur gagne XP et aura
+navale [@adversaire] · !navale (seul = contre le bot)
👆 Clique pour voir une simulation
+typerace 👥 Tousalias: +frappe, +coursefrappe, +typing
Course de frappe ⌨️ : recopie la phrase le plus vite possible — le premier à la taper EXACTEMENT gagne XP + aura (copier-coller inutile)
+typerace
👆 Clique pour voir une simulation
+dette 🛡️ Adminalias: +emprunter, +banque, +loan
Banque 🏦 : emprunte de l'aura quand tu es à sec, et rembourse — les gains futurs remboursent la dette en priorité
+emprunter <montant> | !dette | !dette rembourser <montant> | !dette top | !dette config <plafond> <intérêt %> (admin)
👆 Clique pour voir une simulation
+ecolog 🛡️ Adminalias: +ecologs, +auralog, +auralogs
Détail des gains et pertes d'aura d'un membre, par source (jeux, boutique, emprunts…) — ou du serveur entier
+ecolog [@membre] [jours] | !ecolog serveur [jours]
👆 Clique pour voir une simulation
📈 Profil & Classements (15)
+level 👥 Tousalias: +lvl, +rank, +rang, +profil, +profile
Carte d'identité unifiée d'un membre : niveau/XP + aura, grade, rang de ligue, série et Warhammer
+level [@membre]
👆 Clique pour voir une simulation
+leaderboard 👥 Tous
Classement des membres par niveau et par XP, affiché en image, page par page
+leaderboard
👆 Clique pour voir une simulation
+levelrole 🛡️ Admin
Récompenses de niveau : attribue un rôle automatiquement à un palier
+levelrole add <niveau> @role | !levelrole del <niveau> | !levelrole list
👆 Clique pour voir une simulation
+voicexp 🛡️ Admin
Active/désactive le gain d'XP en vocal (5–9 XP/min, anti-farm intégré)
+voicexp on/off
👆 Clique pour voir une simulation
+grade 👥 Tousalias: +grades
Grades du serveur 🎖️ : échelle de progression (Aspirant → Légende) selon ton activité, rôles auto à chaque palier
+grade [list | setup | sync | sync all (owner bot : toute la flotte, étalé) | off | @membre]
👆 Clique pour voir une simulation
+stats 👥 Tousalias: +palmares, +statsjeux
Palmarès des jeux 🏅 : victoires, winrate et records par jeu (plus gros pot du démineur, région la plus profonde de l'expédition…) — le tien ou celui d'un membre
+stats [@membre]
👆 Clique pour voir une simulation
+gameleaderboard 👥 Tousalias: +gamelb, +classementjeux
Classement des victoires aux jeux (en image) + tableau qui s'actualise tout seul
+gameleaderboard [board #salon [minutes] | board off]
👆 Clique pour voir une simulation
+sdt 👥 Tousalias: +trophees, +trophées, +salledestrophees, +records
Salle des trophées 🏆 : les records du serveur — membres en ligne/en vocal simultanés, série de counting, top XP du mois, plus grosse aura…
+sdt
👆 Clique pour voir une simulation
+saison 🛡️ Adminalias: +season, +saisonjeux
Classement des jeux de la SAISON en cours (remis à zéro chaque mois — le podium est récompensé en XP)
+saison
👆 Clique pour voir une simulation
+joueur 🛡️ Adminalias: +player, +rolejeux, +gamerole
Prends (ou retires) le rôle 🎮 Joueur : tu seras notifié quand un tournoi ou un gros jeu démarre
+joueur
👆 Clique pour voir une simulation
+autorank 🛡️ Adminalias: +rankauto, +rangauto
Attribue et retire automatiquement des rôles selon l'activité de chaque période (messages ou temps en vocal)
+autorank | !autorank add <messages> <heures vocal> @rôle | !autorank del <n°> | !autorank periode <jours> | !autorank on|off
👆 Clique pour voir une simulation
+xpdecay 🛡️ Adminalias: +xpinactifs, +fontexp
Fait fondre l'XP des membres inactifs : après X jours sans activité, ils perdent Y XP tous les Z jours
+xpdecay <jours d'inactivité> <XP perdus> <tous les N jours> | !xpdecay off | !xpdecay test | !xpdecay (état)
👆 Clique pour voir une simulation
+xpnight 🛡️ Adminalias: +xpnuit, +nuitxp
Réduit les gains d'XP sur une plage horaire (heures de Paris) — par ex. moitié moins d'XP en vocal de minuit à 6 h
+xpnight <heure début> <heure fin> <% conservé> [tout] | !xpnight off | !xpnight (état)
👆 Clique pour voir une simulation
+claimtop 🛡️ Adminalias: +topclaim, +ticketclassement
Classement des membres du staff ayant le plus pris de tickets en charge (+ remise à zéro)
+claimtop | !claimtop reset
👆 Clique pour voir une simulation
+stafftickets 🛡️ Adminalias: +ticketstaff, +staffticket
Activité du staff sur les tickets : prises en charge et tickets résolus, par membre
+stafftickets
👆 Clique pour voir une simulation
🏘️ Communauté & Utilitaires (41)
+suggest 👥 Tous
Propose une idée au serveur : les membres votent 👍 / 👎, et le staff l'approuve ou la refuse d'un bouton
+suggest <ta suggestion>
👆 Clique pour voir une simulation
+bug 👥 Tous
Signaler un bug au staff (panneau avec catégories + rapport libre)
+bug
👆 Clique pour voir une simulation
+poll 👥 Tous
Crée un sondage : le bot pose ta question dans le salon et les membres votent par réaction
+poll <question> | <option1> | <option2> ...
👆 Clique pour voir une simulation
+giveaway 🛡️ Admin
Lance un tirage au sort (conditions : rôle, niveau, ancienneté, âge du compte)
+giveaway <durée> <nb gagnants> <prix> [@rôle] [niveau:N] [ancien:Nj] [compte:Nj] · !giveaway list · !giveaway cancel <n°> · !giveaway reroll [n]
👆 Clique pour voir une simulation
+duo 🛡️ Adminalias: +binome, +pair
Tire au sort le « binôme de la semaine » : 2 membres actifs à faire connaissance (brise-glace)
+duo
👆 Clique pour voir une simulation
+pulse 🛡️ Adminalias: +activite, +heatmap
Heatmap d'activité du serveur : à quelles heures et quels jours il est le plus vivant
+pulse
👆 Clique pour voir une simulation
+growth 🛡️ Adminalias: +croissance, +retention
Courbe de croissance du serveur : arrivées et départs sur les 14 derniers jours
+growth
👆 Clique pour voir une simulation
+recap 🛡️ Adminalias: +communaute, +community, +serverstats
Récap communauté 📊 : croissance du serveur, membres les plus actifs, activité vocale et top aura (le pendant communauté de +digest)
+recap
👆 Clique pour voir une simulation
+ticket 🛡️ Adminalias: +tickets
Système de tickets de support : un bouton qui ouvre un salon privé avec le staff, formulaire d'ouverture configurable, couleurs des boutons réglables
+ticket <role @rôle | requis @rôle… | autoclose <durée> | category <id> | panel [#salon] | settings | form | cloture | status>
👆 Clique pour voir une simulation
+claim 🛡️ Adminalias: +prendre, +prise
Prend en charge le ticket courant, sans remonter chercher le bouton
+claim | !claim libre
👆 Clique pour voir une simulation
+rename 🛡️ Adminalias: +renommer
Renomme le salon du ticket courant, pour retrouver un dossier dans la liste
+rename <nouveau nom>
👆 Clique pour voir une simulation
+invites 👥 Tous
Affiche les invitations d'un membre (ou le classement)
+invites [@membre] | !invites top
👆 Clique pour voir une simulation
+vanitylist 🛡️ Adminalias: +vanity, +listvanity
Liste les membres arrivés grâce à l'URL personnalisée du serveur (détection par suivi des invitations)
+vanitylist
👆 Clique pour voir une simulation
+starboard 🛡️ Admin
Salon "best-of" : les messages avec assez de ⭐ y sont épinglés
+starboard #salon [min] | !starboard off
👆 Clique pour voir une simulation
+autoreact 🛡️ Adminalias: +autoreaction, +autoreactions
Le bot pose lui-même une réaction sous chaque message d'un salon — suggestions, créations, votes
+autoreact | !autoreact add <#salon> <émoji> | !autoreact del <#salon> [émoji] | !autoreact clear
👆 Clique pour voir une simulation
+announce 🛡️ Admin
Programme une annonce dans le salon après un délai
+announce <délai: 30m/2h/1j> <message>
👆 Clique pour voir une simulation
+sticky 🔨 Staff
Épingle un message « flottant » qui se re-poste en bas du salon
+sticky <message> | !sticky off
👆 Clique pour voir une simulation
+birthday 👥 Tousalias: +anniv, +anniversaire
Enregistre ton anniversaire (annonce automatique le jour J) — admin : salon / rôle / test
+birthday [JJ/MM | @membre | remove | list | channel #salon | role @rôle | test]
👆 Clique pour voir une simulation
+counting 🛡️ Adminalias: +comptage, +count
Salon de comptage : la communauté compte de 1 à l'infini, le bot valide et reset sur erreur
+counting <#salon | here | off>
👆 Clique pour voir une simulation
+help 👥 Tous
Affiche le menu d'aide paginé, ou le détail d'une commande
+help [commande]
👆 Clique pour voir une simulation
+doc 🛡️ Adminalias: +docs, +documentation, +wiki
Donne le lien de la documentation en ligne : toutes les commandes, leurs options et des exemples
+doc
👆 Clique pour voir une simulation
+bot 🛡️ Admin
Tableau de bord complet du bot (connexion, sécurité, surveillance, activité, code, système)
+bot
👆 Clique pour voir une simulation
+infos 👥 Tous
Informations et statistiques détaillées du serveur
+infos
👆 Clique pour voir une simulation
+news 🛡️ Adminalias: +nouveautes, +quoideneuf, +whatsnew
Quoi de neuf ? 📰 Les dernières nouveautés et suppressions du bot, groupées par date (mini-changelog)
+news
👆 Clique pour voir une simulation
+ping 👥 Tous
Mesure la réactivité du bot : le temps que met Discord à lui répondre, et celui qu'il met à répondre
+ping
👆 Clique pour voir une simulation
+avatar 👥 Tous
Affiche l'avatar d'un membre en grand — mentionne-le, colle son identifiant, ou ne mets rien pour le tien
+avatar [@membre | ID]
👆 Clique pour voir une simulation
+sticker 🔨 Staffalias: +addsticker
Créer un sticker Discord depuis une image jointe, une réponse ou une URL
+sticker [URL] [nom]
👆 Clique pour voir une simulation
+vc 👥 Tous
Affiche les salons vocaux actifs et leur nombre de membres
+vc
👆 Clique pour voir une simulation
+remind 👥 Tous
Programme un rappel : dans un délai (`10m`, `1h`), à une heure (`9h30`), demain, ou à une date
+remind <10m|1h|2j | 9h30 | demain 9h | 25/12 18:00> <texte>
👆 Clique pour voir une simulation
+afk 👥 Tous
Marque ton absence (AFK) — retiré automatiquement à ton retour
+afk [raison]
👆 Clique pour voir une simulation
+invite 👥 Tous
Affiche le lien pour ajouter le bot à un serveur (embed + bouton)
+invite
👆 Clique pour voir une simulation
+vote 🛡️ Adminalias: +topgg, +voter
Donne le lien pour voter pour le bot sur top.gg (gratuit, toutes les 12 h)
+vote
👆 Clique pour voir une simulation
+music 👥 Tousalias: +musique, +play, +song
La musique du serveur (bot dédié Hasu Music) : comment l'utiliser, et l'inviter
+music
👆 Clique pour voir une simulation
+steal 🛡️ Adminalias: +voler, +addemoji
Vole un emoji (ou sticker) d'un message et l'ajoute au serveur
+steal <emoji…> (ou réponds à un message)
👆 Clique pour voir une simulation
+lastseen 🔨 Staffalias: +vula, +derniereactivite
Quand un membre a-t-il été vu ACTIF pour la dernière fois (message, vocal) — pas sa dernière connexion
+lastseen @membre
👆 Clique pour voir une simulation
+find 🛡️ Adminalias: +ou, +localiser, +trouver
Indique dans quel salon vocal se trouve un membre, avec un lien direct pour l'y rejoindre
+find @membre · !find <identifiant>
👆 Clique pour voir une simulation
+images 🛡️ Adminalias: +imgcount, +compteimages
Compte les images envoyées dans un salon ou une catégorie
+images [#salon | #catégorie] [jours]
👆 Clique pour voir une simulation
+translate 👥 Tousalias: +traduire, +trad, +tr
Traduit un texte, ou le message auquel tu réponds, dans la langue demandée
+translate <langue> <texte> | (en réponse à un message) !translate <langue>
👆 Clique pour voir une simulation
+celebration 🛡️ Adminalias: +celebrations, +paliers, +cap
Annonces de célébration : palier de membres franchi (tous les 100 par défaut) et encart de boost qui change selon le nombre de boosts
+celebration | !celebration cap <nombre|off> | !celebration capmsg <texte> | !celebration salon #salon | !celebration boostsalon #salon | !celebration boost <seuil> <titre> | <description> | !celebration boost del <seuil> | !celebration boost off|on | !celebration test cap|boost
👆 Clique pour voir une simulation
+booster 🛡️ Adminalias: +boosterrole, +boostrole, +boosterperks
Le rôle et le bonus d'XP que reçoivent ceux qui boostent — donné dès le boost, repris dès qu'il cesse
+booster | !booster role <@rôle> | !booster xp <×> | !booster sync | !booster off
👆 Clique pour voir une simulation
+createur 👑 Owneralias: +createurs, +creators, +youtube, +yt
Annonce les nouvelles publications YouTube d'un créateur dans un salon, avec mention réglable
+createur | !createur add <lien|@pseudo|UC…> | !createur del <n°> | !createur salon #salon | !createur mention @rôle|everyone|rien
👆 Clique pour voir une simulation
👑 Owner du bot (23)
+owner 👑 Owner
Gère les owners DE CE SERVEUR (toutes les permissions de sécurité, propres à ce serveur uniquement)
+owner @membre (= ajoute) | !owner remove @membre | !owner list
👆 Clique pour voir une simulation
+unowner 👑 Owner
Retire un owner DE CE SERVEUR (mention ou ID)
+unowner @membre/ID
👆 Clique pour voir une simulation
+customperm 👑 Owner
Règle le palier requis d'une commande, ou déplace TOUTES les commandes d'un palier à un autre
+customperm <commande> <modo|admin|owner|reset>
👆 Clique pour voir une simulation
+change 👑 Owner
Change le palier exigé par une commande, ou lui rend son palier d'origine
+change <commande> <modo|admin|owner|1-9> | !change <commande> reset | !change reset
👆 Clique pour voir une simulation
+changeall 👑 Owner
Fait passer d'un coup toutes les commandes d'un palier à un autre
+changeall <ancien palier> <nouveau palier>
👆 Clique pour voir une simulation
+cmdperm 👑 Owneralias: +cmdperms, +permcmd
Accorder UNE commande à un rôle ou à un membre précis
+cmdperm <commande> add|del <@rôle ou membre> · !cmdperm <commande> · !cmdperm list · !cmdperm reset
👆 Clique pour voir une simulation
+unflag 👑 Owner
Retire un membre flaggé à tort de la base de dangerosité permanente (👑 owner racine uniquement) —
+unflag <id> seul affiche d'abord sa fiche+unflag <@membre|ID> [confirm]
👆 Clique pour voir une simulation
+syncroles 👑 Owner
Rôles-récompense 🏆 : migre/synchronise podium mensuel + rôles de niveau + rôles perso sur TOUS les serveurs (owner du bot, traitement étalé) —
+syncroles all+syncroles all
👆 Clique pour voir une simulation
+diag 👑 Owner
Bilan de santé en direct (base, IA, heartbeat, site, déploiement…).
+diag full = auto-contrôle complet (owner)+diag [full]
👆 Clique pour voir une simulation
+testalerts 👑 Owner
Poste un exemplaire de CHAQUE type d'alerte de sécurité dans le salon de logs, marqués TEST, pour repérer les faux positifs (owner RACINE du bot uniquement)
+testalerts
👆 Clique pour voir une simulation
+fleet 🛡️ Adminalias: +flotte, +serveurs, +servers
Vue de flotte (owner) : score de protection, incidents récents, quarantaines et non-blindés de TOUS les serveurs gardés, en un coup d'œil
+fleet
👆 Clique pour voir une simulation
+threatnet 👑 Owneralias: +reseau, +réseau, +threat
Réseau anti-menaces inter-serveurs : un raider/scammeur neutralisé sur un serveur est bloqué sur les autres
+threatnet [mode <alert|quarantine|ban> | on | off | list | pardon <id>]
👆 Clique pour voir une simulation
+changelog 👑 Owner
Aperçu du prochain changelog (notes, retraits, commandes détectées) avant sa diffusion automatique
+changelog
👆 Clique pour voir une simulation
+changelogdm 👑 Owner
Active ou désactive la réception du changelog du bot en message privé
+changelogdm [on|off]
👆 Clique pour voir une simulation
+changelogfix 👑 Owner
Corrige les notes de version déjà envoyées, dans les salons comme en message privé — simulation par défaut : rien n'est modifié tant que ce n'est pas confirmé (owner)
+changelogfix [confirm] [décalage]
👆 Clique pour voir une simulation
+errorlog 👑 Owner
Définit le salon où sont postées les erreurs du bot (👑 owner racine uniquement)
+errorlog #salon | !errorlog off | !errorlog test
👆 Clique pour voir une simulation
+nukeadd 👑 Owner
Autorise un membre à utiliser la commande nuke (ou le retire)
+nukeadd @membre/ID | !nukeadd del @membre/ID | !nukeadd list
👆 Clique pour voir une simulation
+statut 👑 Owner
Change le statut du bot (présence + activité), ou le réinitialise — 👑 Owner uniquement
+statut <online|dnd|idle|invisible> <play|watch|listen|compete|custom> <texte> | !statut reset
👆 Clique pour voir une simulation
+reset 👑 Owner
Réinitialise toute la configuration du bot sur ce serveur (double confirmation owner)
+reset
👆 Clique pour voir une simulation
+update 👑 Owner
Met à jour le CODE du bot (git pull) puis redémarre — `+update deps` pour les paquets npm (owner)
+update | !update deps
👆 Clique pour voir une simulation
+restart 👑 Owner
Redémarre le bot sans rien perdre de sa configuration (owner)
+restart
👆 Clique pour voir une simulation
+vacuum 👑 Owner
Compacte la base de données (VACUUM) — réservé au propriétaire racine du bot
+vacuum
👆 Clique pour voir une simulation
+watchdog 👑 Owner
Affiche l'état pm2 des autres bots à la demande (gestion via Hasu Panel — plus d'alerte auto)
+watchdog [add <nom>|remove <nom>]
👆 Clique pour voir une simulation
Aucune commande ne correspond. 🤷
❓ Questions fréquentes
Quelles permissions faut-il donner au bot ?Which permissions does the bot need?
Le lien d’invitation demande « Administrateur » : pour stopper un nuke, le bot doit pouvoir agir sur les rôles, salons, webhooks et bannissements plus vite que l’attaquant, sans jamais être bloqué par une permission manquante. Après l’installation,
+scan te dit si quelque chose cloche.The invite link asks for “Administrator”: to stop a nuke, the bot must act on roles, channels, webhooks and bans faster than the attacker, without ever being blocked by a missing permission. After setup, +scan tells you if anything is off.Le bot est-il gratuit ?Is the bot free?
Oui — les 262 commandes sont accessibles gratuitement. Pour soutenir le bot, tu peux voter sur top.gg (
+vote, gratuit, toutes les 12 h).Yes — all 262 commands are free to use. To support the bot, you can vote on top.gg (+vote, free, every 12h).On me raid, je fais quoi tout de suite ?I’m being raided — what do I do right now?
+panic verrouille tout le serveur d’un coup. Ensuite +shield smart lève le bouclier adaptatif, +quarantine isole les comptes suspects et +undo répare les dégâts. La fiche de chaque commande montre un aperçu simulé de sa réponse.+panic locks the whole server at once. Then +shield smart raises the adaptive shield, +quarantine isolates suspicious accounts and +undo repairs the damage. Each command’s card shows a simulated preview of its response.C’est quoi, Guardian AI ?What is Guardian AI?
Le moteur de détection auto-apprenant du bot : il s’entraîne en continu contre une IA attaquante (jeu adverse) et apprend de chaque erreur. Son panneau d’entraînement — précision, menaces ratées, axes de travail — est public dans la barre latérale : rien n’est caché.The bot’s self-learning detection engine: it trains continuously against an attacker AI (adversarial game) and learns from every mistake. Its training panel — accuracy, missed threats, focus areas — is public in the sidebar: nothing is hidden.
Comment savoir si le bot est en ligne et fiable ?How do I know the bot is online and reliable?
Le badge en haut à droite montre son état en direct ; un clic dessus ouvre l’historique de disponibilité des 7 derniers jours, heure par heure. Les courbes du panneau « 📈 Réseau » sont reconstruites automatiquement depuis les battements du bot — rien n’est saisi à la main.The badge at the top right shows its live status; clicking it opens the last 7 days of uptime, hour by hour. The “📈 Network” panel curves are rebuilt automatically from the bot’s heartbeats — nothing is entered by hand.
J’ai trouvé un bug ou j’ai une idée ?Found a bug or got an idea?
+bug signale un problème directement à l’équipe, +suggest propose une amélioration votée par ta communauté. Chaque correction est ensuite détaillée dans le changelog en haut de cette page.+bug reports a problem straight to the team, +suggest proposes an improvement your community votes on. Every fix is then detailed in the changelog at the top of this page.