Repository navigation
Releases: LifeSci-Craft/MCDR-ServerLogFilter
Release list
v1.4.4
[1.4.4] - 2026-10-15
修复
!!lf test与真实过滤共用同一段取正文逻辑:以前!!lf test只剥控制台前缀,玩家发言(<玩家名> 内容)被当成「正文含玩家名」来判定,于是正确的^hello类规则被报成「不会被隐去」、而带玩家名的规则被报成会命中却在真实路径永不生效。- 命中时只清
echo_to_console这一位,不再整体赋值action_flag,避免覆盖别的筛选器刚设下的「丢弃」或「取消控制台输入」标志。 - 状态页与关服汇报的计数口径与规则命中数自洽:一行命中多条规则不再重复计数,控制台输入也不计入「已隐去的服务端日志行」。
!!lf reset写盘失败时不再回复「已重置」;!!lf reload在规则已经替换之后失败时不再回复「规则保持原样」。- 连续零命中扫描改为持过滤器锁读命中数,消除窄窗口内的误告警。
- 只匹配空串的规则(如
^$)被明确拒绝,不再被当作可用规则。 - 元数据改用
author+ 顶层link:MCDR 2.13.0–2.15.7 上作者与主页不再为空,并移除任何版本都不认的authors[].link。
工具与工程
tools/mcdr_matrix.py为子进程固定 UTF-8 输出,加载判定不再依赖本地化文案;中文 Windows 上不再出现「五个版本全 FAIL」的假失败;同时不再使用 Python 3.10 才有的write_text(newline=)。- CI 增加「最低 MCDR × 最低 Python」(2.15.0 × 3.9)组合,固定 action 版本并启用 pip 缓存。
验证
- 测试 414 项全部通过(含 35 项真实 MCDR 端到端)。
- 变异检查 60 条全部被抓。
- 真实 MCDR 2.15.0 / 2.15.7 / 2.16.0 三版本矩阵通过,14 项跨版本判据一致。
- 产物按
pack.py重建,与提交件逐字节一致。
v1.4.3
Changelog
本插件所有值得一提的变更都记录在此。插件包内也附带同一份 CHANGELOG.md。
格式参考 Keep a Changelog,版本号遵循 语义化版本。
本文件只保留最新一个版本的条目,更早版本的记录见
GitHub Releases。
[1.4.3] - 2026-10-14
变更
- 移除「升级后播报新增了哪些配置项」的功能,连同它的开关
announce_config_upgrade与那套逐项说明文字。MCDR 仍会在升级后把新增选项按默认值补进config.json,只是不再由插件逐项解说。 - 版本号 1.4.2 → 1.4.3。
修复
- 灾难性回溯探测:
(a|aa)+$在快机器上会被放行。 增长判据要求两次测量都高于 0.5 ms 才比较比值,而这条模式在 13 字符上只要 39 µs,于是比值判据被整条跳过、只剩 25 ms 的绝对预算兜底;它在 25 字符上约 11 ms,照样通过。同一份代码因此在慢机器(含 CI)上拦下、在快机器上放行。现改为:大的那次测量高于 0.5 ms、小的那次只需高于 0.02 ms 即可比较比值——这条模式的比值是 290 倍,属于可靠证据。两档都在微秒级的普通规则仍然跳过比值判断。
升级说明
- 旧配置里的
announce_config_upgrade会被 MCDR 当作冗余键、在下次保存配置时移除,不需要手动处理。 - 另外两个播报开关不受影响:
announce_broken_config(配置写坏被备份并重置时说明原因与路径)、warn_about_stale_rules(规则连续多个开服周期零命中时提醒)。
开发
- 语言文件删掉 32 条只服务于该播报的键(每种语言 16 条:
upgrade.*6 条、config_doc.*10 条)。 - 删除该功能的 15 条单测与 2 条端到端用例;
tools/mcdr_matrix.py种下的配置不再包含该选项。 - 语言测试原本借升级播报的日志验证「英文真的到达了输出」,改为验证坏配置提示的英文。
- 探测的增长判据另加两条不依赖机器快慢的用例(用脚本化的时钟喂入真实读数)。
- 两份 README 的配置表、
docs/DEVELOPMENT.md与tests/README.md同步更新。
验证
- 测试 363 项全部通过(单元 328 + 真实 MCDR 端到端 35)。
- 变异检查 55 条全部被抓。
- 真实 MCDR 2.15.0 / 2.15.7 / 2.16.0 三版本矩阵逐项一致。
- 产物可复现、换行归一、包内无注释与 docstring、包内 changelog 只留本节。
v1.4.2
Changelog
本插件所有值得一提的变更都记录在此。插件包内也附带同一份 CHANGELOG.md。
格式参考 Keep a Changelog,版本号遵循 语义化版本。
本文件只保留最新一个版本的条目,更早版本的记录见
GitHub Releases。
[1.4.2] - 2026-10-14
修复
- 一行命中多条规则时,每条规则都计数。 以前只给第一条计数,被它遮蔽的那条命中数永远是 0,连续几轮之后会被报成「从未命中」并建议删除——而它其实一直在正常工作,删掉后对应日志会立刻重新刷屏。
!!logfilter test一直说它会命中,两屏结论互相矛盾;现在两个口径一致。 - 正则安全探测不再有量级盲区。 探测串原来固定 22 字符,
(a|aa)+$这类只在更长输入上爆炸的模式能通过检查,而它在 60 字符以上的真实日志行上会让 MCDR 主线程卡死(filter_server_info跑在主线程)。现在先用两档长度的增长比判断,再用接近真实行长的长档做绝对耗时兜底。 on_server_startup补上配置判空。 MCDR 低于 2.15.0 时插件会停用并提示升级,但此后每次开服完成仍会抛一次AttributeError(提示与报错自相矛盾)。- 类型写坏的配置也会被备份。 以前只有「JSON 语法错 / 顶层不是对象 / 不是 UTF-8」会备份成
config.json.old并播报;合法 JSON 但字段类型写错(例如stale_rule_threshold填成字符串)会被 MCDR 用默认值覆盖,用户写的patterns就此消失且没有备份。 - 未走到启动完成的周期不再让已修好的规则被重复告警。 到期提醒的判据加上「本轮该规则一次都没命中」,文案从「连续 N 次零命中」改为「从未命中」。
state.json损坏时备份并说明(以前会被静默重置,命中历史无声消失);_state的读改写加锁。!!logfilter reload失败时给可读回复(此前只有一条 traceback);!!lf test只粘了行前缀时不再把带前缀的原文当正文,^锚定的规则不会再被误报成不命中。- 探测预算被钳制时会 warning 一次(下限 1 ms、上限 2000 ms)。
新增
- 状态页新增一行计数口径说明(一次隐去可能来自多条规则,两者数字不必相加)。
- 「匹配一切」的判定改用补集判据,
^$这类只匹配空行的规则也会被警告。
变更
pattern_probe_timeout_ms的语义在 README 里写明:它只影响插件加载与!!logfilter reload的耗时,与逐行过滤开销无关;这个检查是启发式,不是形式化保证。- 从写坏的配置原文里抢救
language时同时接受单引号写法。 - 版本号 1.4.1 → 1.4.2。
开发
- CI 新增三个作业:lint(ruff 0.17.0,规则见根目录
ruff.toml)、跨版本矩阵(真实 MCDR 2.15.0 / 2.15.7 / 2.16.0)、产物自检(tools/check_artifact.py);单元测试矩阵新增 Python 3.9(该档装 pytest 8.3.5,因为 pytest 9 需要 3.10)。 - 打包器换行归一:CRLF 工作区与 LF 工作区打出的字节相同,包内
CHANGELOG.md只保留最新一节且版本号必须与元数据一致。 - 变异检查改造:隔离字节码缓存、区分
failed与error、打印变异后文件的 sha256、失败时保留临时目录。 - 清掉测试里 13 处歧义变量名与 1 处错位的 import,
ruff check .归零。
验证
- 测试 378 项全部通过(单元 340 + 真实 MCDR 端到端 37)。
- 变异检查 58 条全部被抓(
tools/mutation_check.py)。 - 真实 MCDR 2.15.0 / 2.15.7 / 2.16.0 三版本矩阵逐项一致,无 traceback。
- 产物可复现、换行归一、包内无注释与 docstring、包内代码可编译。
v1.4.1
这个版本做了什么
修掉一个会**伪造「零命中提醒」**的 bug,加上两道规则守卫,并把打包变成可复现。
修复
!!logfilter reload不再抹掉本轮已命中的次数。 以前重载会把「本次已隐去」清零:一条明明在命中的规则被记成「本轮零命中」,几轮之后弹出假的到期提醒。现在同名规则的计数接着数,只有从配置里删掉的规则才丢计数;重载回执会说明「本轮已命中的 N 次继续保留」。- 修掉文档里几处过期说法(测试一览表还在描述「
reload后计数归零」)。
新增
- 规则「匹配一切」时加载警告:
.、.*、^、a?、\w*、.+会隐去所有服务端输出,控制台看起来像服务端挂了。加载时用一组差异极大的探测串判断,只警告、不丢弃(MCDR 日志 +!!logfilter list状态页红字)。 - 重复规则去重:同一条写两遍时只保留第一条并播报。第二条永远不可能命中,还会攒出假的零命中计数。
变更
!!logfilter test列出所有命中的规则,不再只报第一条。- 状态页新增
匹配一切:与重复:两行,与已跳过:并列。 - 版本号 1.4.0 → 1.4.1。
工程改进
- 新增 GitHub Actions CI:单元测试(Python 3.10 / 3.13)、变异检查、真实 MCDR 端到端三个作业。
- 打包可复现:同样的源码永远打出同样的字节,所以下面那个 SHA256 可以自己验证(
python pack.py && sha256sum)。 - 清掉 3 处无用常量;测试夹具的版本号改为直接读
mcdreforged.plugin.json。
验证
| 项 | 结果 |
|---|---|
| 测试 | 291 passed(单元 254 + 真实 MCDR 端到端 37) |
| 变异 | 51/51 全部被抓住 |
| 矩阵 | 2.15.0 / 2.15.7 / 2.16.0 PASS;2.13.0 / 2.14.1 按设计被拒 |
| CI | 四个 check 全绿(含 Python 3.10 与真实 MCDR 端到端) |
| 可复现 | 分支与合并提交两次打包,字节完全相同 |
升级说明
无需改动任何配置。 两处留意:
- 配置里有重复规则或「匹配一切」的规则时,加载会在控制台看到提示,行为与之前一致。
- 本次修复只影响统计与提醒的准确性:此前可能因假提醒误删过其实正常的规则,可以参考这份说明加回来。
产物
| 文件 | 大小 | SHA256 |
|---|---|---|
ServerLogFilter-v1.4.1.mcdr |
21,302 B | 08231bdfb44560e701f1693e803640c2991f8a0609c3c3856d581161e6f8e544 |
包内 7 个文件:mcdreforged.plugin.json、server_log_filter/{__init__.py,i18n.py}、
server_log_filter/lang/{en_us,zh_cn}.json、CHANGELOG.md、LICENSE
(三个 README 都不打包)。
v1.4.0
这个版本做了什么
命令面有了简写与帮助页、全部限管理员;两个界面重做成同一套外观;包体积减少 37%。
新增
!!lf简写:与!!logfilter完全等价,两种拼法都登记进 MCDR 的!!help(同一个命令节点的两条字面量,不是两棵复制出来的命令树)。- 帮助页:直接输入
!!logfilter(或!!lf)就是命令列表;!!logfilter help是同一屏。 - 帮助行可点击(游戏内聊天):点一下等于敲了那行命令;
test是例外,只把!!lf test填进输入框。控制台里那几行本身就是可复制的命令文本。
变更
- 全部子命令改为仅管理员可用:状态页会印出规则、
test会验证日志内容。被拒绝时会一并说明原因与提权命令(!!MCDR permission set <你的ID> admin)。 - 状态页与帮助页统一成一套外观:同一个顶栏、同样的配色(命令 aqua、说明 white、分隔符 gray、权限提醒 yellow)、规则行同样的分隔符并对齐;界面里不再出现深灰字。
- 规则编号不再有多余空格:9 条以内印
[1],10 条以上才补成[ 1]/[12]。 - 帮助页不再重复状态页的运行时提示。
工程改进
- 包体积 31,454 B → 19,764 B:打包时剥掉注释与 docstring(仓库里完整保留),用
tokenize找注释(字符串里的#不会被误切),清空而不删行,行号与仓库一致,从已安装插件报出的 traceback 仍指向仓库源码的同一行。
升级说明
无需改动任何配置。 两处留意:
- 裸敲
!!logfilter现在给帮助;看状态请敲!!logfilter list(或!!lf list)。 - 普通玩家不再能使用这些命令,会看到「权限不足」及其原因。
验证
| 项 | 结果 |
|---|---|
| 测试 | 221 → 263(单测 188 → 226,真机端到端 33 → 37) |
| 变异 | 33 → 46(46/46 全部被抓住) |
| 矩阵 | 2.15.0 / 2.15.7 / 2.16.0 PASS;2.13.0 / 2.14.1 按设计被拒 |
产物
| 文件 | 大小 | SHA256 |
|---|---|---|
ServerLogFilter-v1.4.0.mcdr |
19,764 B | 6f8b361ac5fe0e9fa98de393b10477ebb8d33071c048b71d49e767b81c900997 |
v1.3.0
这个版本做了什么
修掉六个「一处写错就满盘皆输」的地方,状态页多告诉你三件事。
修复
六处是同一个错误出现在不同位置:代码承诺「单条出错不影响其他」,但 except 只接住最常见的异常类型。其中三处会让插件直接加载不了:
- 配置文件不是 UTF-8(如记事本存成 ANSI/GBK):插件不加载。现在按字节读取、显式解码,走上已有的备份 + 重建流程,原文件逐字节保留为
config.json.old。 - 规则里的量化符溢出(
a{999999999999})或上千层嵌套括号:插件不加载。现在与被跳过的其他规则一样处理并上报。 pattern_probe_timeout_ms设成 0:所有规则被拒且都报「有回溯风险」。现在下限夹到 1 ms。- 译文里写
{a.b}:消息路径抛异常。语言文件的承诺是「坏模板原样输出、绝不抛异常」。 !!logfilter test+ 锚定规则:对正确的规则报「不命中」。现在测试前先剥掉[时间] [线程/级别]:前缀,与过滤器实际匹配的正文一致,并在回复里说明。
新增
!!logfilter 状态页新增三行:
- 当前语言及来源:
语言:zh_cn(跟随 MCDR)/(配置指定)。 - 被跳过的规则数(正则写错或触发回溯保护),只在大于 0 时显示。
- 每条规则上次命中的是第几个开服周期。
变更
- 版本号 1.2.2 → 1.3.0;语言文件新增 6 条消息(中英同步)。
- 顺手修掉一个小 bug:重载时「配置被打坏的原因」用旧语言生成,与整段播报的语言可能不一致。
升级说明
无需改动任何配置。 六处修复都只在「配置、规则或取值写错」时才会显现,正常使用下的行为与 1.2.2 一致。
验证
| 项 | 结果 |
|---|---|
| 测试 | 208 → 221(单测 178 → 188,真机端到端 30 → 33) |
| 变异 | 28 → 33(33/33 全部被抓住) |
| 矩阵 | 2.15.0 / 2.15.7 / 2.16.0 PASS;2.13.0 / 2.14.1 按设计被拒 |
| 性能 | 逐行开销与 v1.2.2 一致(差异在复跑噪声内) |
产物
| 文件 | 大小 | SHA256 |
|---|---|---|
ServerLogFilter-v1.3.0.mcdr |
27,526 B | 794e357dcc00437765ee03bf67de1fc324aaf05033dd1054be1249815f83b55c |
v1.2.2
这个版本做了什么
插件有英文界面了,并新增配置项 language。所有面向用户的文案都放进语言文件。
新增
language配置项:auto(默认,跟随 MCDR 的config.yml)、zh_cn、en_us。写死的值压过 MCDR 的设置;大小写与-/_都随意(zh-CN、EN_us、en都能认);没有对应语言文件时回落到en_us并提醒一次;MCDR 设成zh_tw而暂无繁体文件时用zh_cn;配置写坏时这个值从文件原文里读,照样生效;改完!!logfilter reload立即生效。- 加语言不需要改代码:复制
en_us.json改成<语言代码>.json、只翻译取值、跑pytest tests -k language即可;server_log_filter/lang/README.md是写给译者的说明。
变更
- 版本号 1.2.1 → 1.2.2。
- 所有面向用户的文案改为查语言文件(中文提示与 1.2.1 逐字一致);
language排在配置文件第一位。 - 代码注释精简一轮(说明性长段落移入
docs/DEVELOPMENT.md),__init__.py1110 → 990 行、i18n.py252 → 238 行,一行可执行代码都没动。
升级说明
- 老配置自动补齐,
language默认auto,无需手动改动任何配置。 ⚠️ 默认跟随 MCDR:如果你的 MCDR 从来没改过语言(出厂默认en_us),升级后插件提示会变成英文;想看中文把language设成zh_cn即可。
验证
| 项 | 结果 |
|---|---|
| 测试 | 175 → 208(单测 149 → 178,真机端到端 26 → 30) |
| 变异 | 20 → 28(28/28 全部被抓住) |
| 矩阵 | 2.15.0 / 2.15.7 / 2.16.0 PASS;2.13.0 / 2.14.1 按设计被拒 |
产物
| 文件 | 大小 | SHA256 |
|---|---|---|
ServerLogFilter-v1.2.2.mcdr |
25,739 B | 0f08b54491f901bc6890b9eab78a7fc07d749e28da8372a0c548d984b72be519 |
v1.2.1
这个版本做了什么
三条提示各自有了开关(默认全开),从配置里删掉的规则统计会在重载时立刻清除。
新增
- 三个提示开关:
announce_config_upgrade(配置被自动补齐时列出新增选项)、announce_broken_config(配置写坏被备份重置时说明原因与备份路径)、warn_about_stale_rules(规则连续多个开服周期零命中)。 - 开关只管「说不说」,不管「做不做」:补齐配置、备份坏文件、记录统计照常进行。写坏配置时开关只能从文件原文里读(那一刻配置已经解析失败),因此写在语法错误之后也照样有效;「连备份都失败」属于数据丢失警告,不受开关影响。
修复
- 从配置里删掉的规则,其统计在重载时立刻清除(此前要等一次完整的开服 / 关服周期),并说明清掉了哪些。两条重载路径都覆盖。
- 两条边界特意保留:只看配置原文、不看编译结果(被跳过的规则不算删除);配置因写坏被自动重置时不清理。没有实际清理时不写盘。
变更
- 版本号 1.2.0 → 1.2.1;随包的
CHANGELOG.md改为只保留最新版本的条目。
升级说明
老配置自动补齐,新增的两个开关默认开启,无需手动改动任何配置。
验证
| 项 | 结果 |
|---|---|
| 测试 | 156 → 175 |
| 变异 | 18 → 20(20/20 全部被抓住) |
| 矩阵 | 2.15.0 / 2.15.7 / 2.16.0 PASS;2.13.0 / 2.14.1 按设计被拒 |
产物
| 文件 | 大小 | SHA256 |
|---|---|---|
ServerLogFilter-v1.2.1.mcdr |
18,302 B | 86a4f6a228b1427d9b43726b88cfda37a2d2768444640fecf92dce02c0d7db6e |
v1.2.0 — 配置更新提示、坏配置保全、提醒去重
这个版本做了什么
围绕配置文件的三处改进:配置更新会说明、写坏会先备份、零命中提醒不再重复。
新增
- 配置新增选项时会说明改了哪些:列出本次新增的选项及各一行说明(MCDR 本就会补齐并写回,此前是静默的;你已有的取值不受影响)。
- 配置写坏时会先备份再重建:解析失败的文件先备份为
config.json.old,再生成默认配置;报错给出解析器的行列号,改好后!!logfilter reload立即生效。空文件、顶层不是 JSON 对象同样处理;连备份都失败时插件照常加载并明确告知。
变更
- 零命中提醒不再逐条重复:只列规则;只有当某条规则比阈值更久没命中时,才在它后面补一句次数。
- 主 README 改为面向开服的人;打包 / 测试 / 版本矩阵等开发内容移入
docs/DEVELOPMENT.md。
验证
| 项 | 结果 |
|---|---|
| 矩阵 | 2.15.0 / 2.15.7 / 2.16.0 PASS,逐项一致,零异常 |
产物
| 文件 | 大小 | SHA256 |
|---|---|---|
ServerLogFilter-v1.2.0.mcdr |
19,672 B | 1430736ee7c26496d50a07dd6cb30b6724bb25d33689cc5eb4a72f9e1acb39be |
v1.1.1 — 发布包减重(去掉打包的 README)
这个版本做了什么
发布包不再包含两个 README:28,467 → 15,137 字节(−47%)。插件行为与 v1.1.0 完全一致。
变更
README.md/README_en.md从发布包中移除(占包压缩体积的 49.6%,MCDR 从不读取它们)。包内固定 4 个文件:mcdreforged.plugin.json、server_log_filter/__init__.py、CHANGELOG.md、LICENSE。- 新增测试把产物内容钉死为这 4 个文件,以后任何白名单改动都必须显式修改该测试。
验证
| 项 | 结果 |
|---|---|
| 测试 | 113 项全绿 |
| 变异 | 7/7 全部被抓住 |
| 矩阵 | 2.15.0 / 2.15.7 / 2.16.0 全部 PASS,12 项检查逐项一致 |
产物
| 文件 | 大小 | SHA256 |
|---|---|---|
ServerLogFilter-v1.1.1.mcdr |
15,137 B | dbce68da9ab3871152ca94eaf0b4b5dfa61999cd7473e2c1d2b62961cf83db0d |