功能
更清爽的聊天:脏话与链接过滤
大厅和游戏内聊天现在都会依据一份 40,000 词的名单屏蔽脏话,并在消息被存储之前就拒绝链接。

通俗版
无论用哪种语言,聊天都应当友好而安全。你发送的每一条消息——无论在大厅还是在游戏内——现在都会在发布前经过检查。脏话会被屏蔽,链接也不被允许,让聊天始终围绕着游戏。
这些检查谨慎而不笨拙:它匹配的是完整的词和短语,因此一个只是碰巧包含被屏蔽子串的无辜词语仍能通过。贴纸是一组固定且安全的集合,因此从不受影响。
40,917
屏蔽词条
~65
识别的链接域名
~0.3ms
每条消息的检查
2
覆盖的聊天路径
如果一条消息被屏蔽,你会看到一条内嵌提示,它就是不会被发送——什么都不会存储,别人也看不到。
技术细节
一个新的 @opolyx/moderation 包(仿照 logger 包)按照屏蔽名单自身的使用说明,进行完整词和短语的精确匹配:「pain in the ass」会被屏蔽,但「assassin」和「horde」能通过——没有子串扫描,而且名单已经预先枚举了诸如 h0rny 之类的变体写法,因此无需模糊归一化。它会转为小写、按空白切分、用原始形式和去掉边缘标点的变体去对照一个 Set,然后检查 2 到 11 个词的短语 n-gram。
这 40,917 个词条存放在一个生成的字符串字面量模块中(约 420 KB),仅在服务器端——客户端分块已验证是干净的。两条聊天写入路径都会在插入之前拒绝不良消息,因为 Realtime 会原样广播已存储的行,所以检查必须先于写入。
ts
// 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 表加上一个插入前触发器。昵称过滤和完全本地化的错误字符串被推迟。
