Un chat plus propre : filtrage des grossièretés et des liens
Le chat du hall comme celui en partie bloquent désormais les grossièretés d’une liste de 40 000 termes et rejettent les liens avant même qu’un message soit enregistré.

En clair
Le chat se doit d’être accueillant et sûr, dans n’importe quelle langue. Chaque message que vous envoyez — dans le hall et à l’intérieur d’une partie — est maintenant vérifié avant d’être publié. Les grossièretés sont bloquées et les liens ne sont pas autorisés, pour que le chat reste centré sur le jeu.
Les vérifications sont soignées, pas maladroites : elles correspondent à des mots et des expressions entiers, si bien qu’un mot innocent qui contient simplement une sous-chaîne bloquée passe quand même. Les stickers forment un ensemble fixe et sûr, ils ne sont donc jamais affectés.
Pour les curieux techniques
Un nouveau paquet @opolyx/moderation (calqué sur le paquet logger) effectue une correspondance exacte de mots et d’expressions entiers, selon les notes d’usage de la liste de blocage elle-même : « pain in the ass » est bloqué, mais « assassin » et « horde » passent — il n’y a pas de balayage de sous-chaînes, et la liste énumère déjà à l’avance les obscurcissements comme h0rny, donc aucune normalisation floue n’est nécessaire. Elle met en minuscules, découpe sur les espaces, essaie les variantes brutes et sans ponctuation en bordure contre un Set, puis vérifie les n-grammes d’expressions de 2 à 11 mots.
Les 40 917 termes vivent dans un module de littéraux de chaîne généré (~420 Ko) uniquement côté serveur — les chunks du client ont été vérifiés comme propres. Les deux voies d’écriture du chat rejettent un mauvais message avant l’insertion, car Realtime diffuse les lignes enregistrées telles quelles, la vérification doit donc précéder l’écriture.
// link filter: schemed URLs (https?|ftp|wss?://, hxxp), www., and bare
// label.tld against a curated ~65-TLD set — so Node.js / e.g. / "gg wp" pass,
// but discord.gg / t.me/x / mysite.com / emails are blocked. Light dot-de-obfuscation
// folds example[.]com and "site dot net" first.Une lacune acceptée (décision du propriétaire) : une insertion directe en base de données contourne ces filtres au niveau de l’action — le candidat au durcissement est une table banned-terms plus un déclencheur avant insertion. Le filtrage des pseudonymes et une chaîne d’erreur entièrement localisée sont reportés.
