Chat más limpio: filtrado de groserías y enlaces
Tanto el chat del vestíbulo como el del juego ahora bloquean groserías de una lista de 40.000 términos y rechazan enlaces antes de que un mensaje llegue siquiera a guardarse.

En palabras sencillas
El chat debería ser acogedor y seguro, en cualquier idioma. Cada mensaje que envías —en el vestíbulo y dentro de una partida— ahora se comprueba antes de publicarse. Las groserías se bloquean y no se permiten enlaces, así el chat sigue girando en torno al juego.
Las comprobaciones son cuidadosas, no torpes: coinciden con palabras y frases completas, de modo que una palabra inocente que solo contiene una subcadena bloqueada aún pasa. Las pegatinas son un conjunto fijo y seguro, así que nunca se ven afectadas.
Para los más técnicos
Un nuevo paquete @opolyx/moderation (basado en el paquete logger) hace coincidencias exactas de palabras y frases completas, según las propias notas de uso de la lista de bloqueo: «pain in the ass» se bloquea, pero «assassin» y «horde» pasan — no hay escaneo de subcadenas, y la lista ya enumera de antemano ofuscaciones como h0rny, así que no hace falta normalización difusa. Pasa a minúsculas, tokeniza por espacios en blanco, prueba variantes en bruto y sin puntuación en los bordes contra un Set, y luego comprueba n-gramas de frases de 2 a 11 palabras.
Los 40.917 términos viven en un módulo generado de literales de cadena (~420 KB) que es solo del lado del servidor — se verificó que los fragmentos del cliente están limpios. Ambas vías de escritura del chat rechazan un mensaje malo antes de la inserción, porque Realtime difunde las filas guardadas tal cual, así que la comprobación tiene que preceder a la escritura.
// 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.Una brecha aceptada (decisión del propietario): una inserción directa en la base de datos elude estos filtros a nivel de acción — el candidato a endurecimiento es una tabla de términos prohibidos más un disparador antes de la inserción. El filtrado de apodos y una cadena de error totalmente localizada quedan aplazados.
