Чище чат: фильтрация мата и ссылок
И чат в лобби, и чат в игре теперь блокируют мат по списку из 40 000 терминов и отклоняют ссылки ещё до того, как сообщение будет сохранено.

Простыми словами
Чат должен быть приветливым и безопасным на любом языке. Каждое сообщение, которое вы отправляете — в лобби и внутри игры, — теперь проверяется перед публикацией. Мат блокируется, ссылки не разрешены, так что чат остаётся про игру.
Проверки аккуратны, а не грубы: они сопоставляют целые слова и фразы, поэтому безобидное слово, которое лишь содержит заблокированную подстроку, всё равно проходит. Стикеры — фиксированный, безопасный набор, поэтому их это никогда не затрагивает.
Для тех, кому интересны детали
Новый пакет @opolyx/moderation (по образцу пакета logger) выполняет точное сопоставление целых слов и фраз согласно собственным заметкам по использованию блок-листа: «pain in the ass» блокируется, а «assassin» и «horde» проходят — никакого сканирования подстрок, и список уже заранее перечисляет обфускации вроде h0rny, так что нечёткая нормализация не нужна. Он приводит к нижнему регистру, разбивает по пробелам, пробует сырые и очищенные от краевой пунктуации варианты против Set, затем проверяет фразовые n-граммы от 2 до 11 слов.
Все 40 917 терминов живут в сгенерированном модуле строковых литералов (~420 КБ), только на стороне сервера — клиентские чанки проверены и чисты. Оба пути записи чата отклоняют плохое сообщение до вставки, потому что Realtime рассылает сохранённые строки дословно, так что проверка обязана предшествовать записи.
// 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.Один принятый пробел (решение владельца): прямая вставка в базу данных обходит эти фильтры уровня действия — кандидат на усиление это таблица banned-terms плюс триггер до вставки. Фильтрация никнеймов и полностью локализованная строка ошибки отложены.
