Skip to content

Releases: LifeSci-Craft/MCDR-ServerLogFilter

v1.4.4

Choose a tag to compare

@Pau1am Pau1am released this 15 Oct 08:20
1769334

[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

Choose a tag to compare

@Pau1am Pau1am released this 14 Oct 16:19
f2fd21a

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

Choose a tag to compare

@Pau1am Pau1am released this 14 Oct 15:14
ad908ad

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

Choose a tag to compare

@Pau1am Pau1am released this 07 Oct 04:27
fd2d9e8

这个版本做了什么

修掉一个会**伪造「零命中提醒」**的 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 端到端)
可复现 分支与合并提交两次打包,字节完全相同

升级说明

无需改动任何配置。 两处留意:

  1. 配置里有重复规则或「匹配一切」的规则时,加载会在控制台看到提示,行为与之前一致。
  2. 本次修复只影响统计与提醒的准确性:此前可能因假提醒误删过其实正常的规则,可以参考这份说明加回来。

产物

文件 大小 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

Choose a tag to compare

@Pau1am Pau1am released this 04 Oct 13:08
120de8e

这个版本做了什么

命令面有了简写与帮助页、全部限管理员;两个界面重做成同一套外观;包体积减少 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 仍指向仓库源码的同一行。

升级说明

无需改动任何配置。 两处留意:

  1. 裸敲 !!logfilter 现在给帮助;看状态请敲 !!logfilter list(或 !!lf list)。
  2. 普通玩家不再能使用这些命令,会看到「权限不足」及其原因。

验证

项 结果
测试 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

Choose a tag to compare

@Pau1am Pau1am released this 04 Oct 09:49
0df79e7

这个版本做了什么

修掉六个「一处写错就满盘皆输」的地方,状态页多告诉你三件事。

修复

六处是同一个错误出现在不同位置:代码承诺「单条出错不影响其他」,但 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

Choose a tag to compare

@Pau1am Pau1am released this 04 Oct 08:53

这个版本做了什么

插件有英文界面了,并新增配置项 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__.py 1110 → 990 行、i18n.py 252 → 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

Choose a tag to compare

@Pau1am Pau1am released this 04 Oct 07:33
1c12b5e

这个版本做了什么

三条提示各自有了开关(默认全开),从配置里删掉的规则统计会在重载时立刻清除。

新增

  • 三个提示开关: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 — 配置更新提示、坏配置保全、提醒去重

Choose a tag to compare

@Pau1am Pau1am released this 04 Oct 06:42
4711311

这个版本做了什么

围绕配置文件的三处改进:配置更新会说明、写坏会先备份、零命中提醒不再重复。

新增

  • 配置新增选项时会说明改了哪些:列出本次新增的选项及各一行说明(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)

Choose a tag to compare

@Pau1am Pau1am released this 04 Oct 05:29
894559c

这个版本做了什么

发布包不再包含两个 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