Mod Update Checker

Check and update server-side mods from Modrinth.

tool
management

Installation command

!!MCDR plugin install mod_update_checker

Author

Synced at

...

Last update

...

Latest version

Total downloads

102

Back to catalogue

ModUpdateChecker-v1.6.1.mcdr

Version

1.6.1

Date

October 14, 2026

Size

89.79 KiB

Downloads

7

MD5

867cbedf55354f6085ac138e59fb32b0

SHA256

24f2f11e903b9b3149356fffc57b1f97262f7a4a6738b8ed8ddef0394300b88f

MCDR Plugin Dependencies

Plugin IDRequirement
mcdreforged>=2.13.0

Python Package Requirements

Python PackageRequirement

none

CHANGELOG

本插件所有值得一提的变更都记录在此。插件包内也附带同一份 CHANGELOG.md。

格式参考 Keep a Changelog,版本号遵循 语义化版本。

本文件只保留最新一个版本的条目,更早版本的记录见 GitHub Releases。


v1.6.1

这一版是一轮全代码审查的修复轮:下载台账的并发写入、频道开关失效、mods 目录读不到时的误报, 以及十几处「坏了但不出声」的路径。

修复

  • 并发下载不再丢台账。 下载台账以前由多个实例各自把内存快照整份写回,!!muc download 的两个后台线程、命令线程上的 install 与检查线程会互相覆盖(实测 9 条记录被清成 0 条),后果是「关服自动安装已批准的版本」静默失效。现在写入是进程级加锁的重读-合并-写回,JSON 的临时文件名也带上进程与线程号。
  • check.include_beta / check.include_alpha 之前完全不起作用(频道过滤函数没有任何调用者),默认配置下 beta 会被当成可用更新推荐。现在两个开关生效;某个项目在所选频道里没有版本时会回落到更旧的频道,并在报告里说明这次回落。
  • project-map.json 存成 GBK / ANSI 不再让整次检查失败。 以前 UnicodeDecodeError 会穿过映射表的错误处理:!!muc status 整页报错,一次检查以「check failed」收场、一条结论都不产出。
  • 关掉 sources.modrinth 不再污染解析缓存。 以前「没问过」会被写成「确认不存在」,打开 Modrinth 之后这些 jar 在缓存有效期内(默认 24 小时)一次名字搜索都不会发,永久显示为「认不出」。
  • 下载失败不再先删掉旧版本。 旧文件要等新文件就位之后才删,否则新版本 404 时新旧两份都没有,回滚点消失。
  • 游戏版本投票只取下界。 以前区间上界与下界等权计票、平局按字典序取最大者,猜错版本会让每个 Mod 都显示「无适配构建」。
  • mods/ 目录读不到时不再报成「0 个 jar」。 状态页写明目录与原因,检查直接跳过并说明原因——读不到的目录与空目录是两件事。
  • 安装失败不再在 mods/ 留下半截新 jar。 改成同目录临时文件 + 原子替换;万一仍然留下东西,安装结果会点名那个文件。
  • 上游整体不可用时不再对每个 Mod 逐个搜索(以前 12 个 Mod 会发 48 次搜索请求)。
  • 其余收紧:resolve-cache.json 里的坏记录不再让每次检查失败;scan_mods 在目录可 stat 不可列举时返回可解释的结果而不是抛异常;备份名判定改用 fullmatch;台账里的文件名做安全校验(不再接受 ..);加密或损坏的 jar 不再打破 scan_jar 的「不抛异常」承诺;元数据解压加 4 MiB 上限;下载失败文案不再把不重试的失败说成「重试 N 次后失败」。
  • 停服后在途的检查不再覆盖报告;checker 不再在关闭客户端之后继续发请求。

变更

  • !!muc status 改成两段式:命令线程先回一句「正在读取」,扫描与渲染在后台线程完成后整屏给出——页面不再占用 MCDR 唯一的同步执行器线程;同一时间只允许一份状态页在生成。
  • 数值选项超出范围会被钳制并在控制台提示一次(范围写进 README 的配置表;只改内存,不回写管理员写的文件)。
  • !!muc 别名下不再有写死 !!modupdate 的提示行;cleanup.notice_confirm / command.delete.usage / command.delete.disabled_hint 的占位符随之调整(翻译者注意)。
  • 版本识别是从日志或 Mod 元数据推断出来的时候,状态页会多一行说明来源。
  • 版本号 1.6.0 → 1.6.1。

内部整理

  • 新增 tools/mutation_check.py:把每条守卫逐个改坏(在仓库的临时副本里改,工作树不受影响),对应的用例必须失败;没被抓住的守卫与「锚点挪走」分开报告。
  • 新增 tools/check_python_floor.py 与 CI 的 python-floor 作业:每个文件都必须能以 3.8 解析、且不用更新的注解写法或标准库名字。
  • 新增 CI 的 lint 与 mutation 作业;两个 workflow 都补上 permissions、timeout-minutes 与 concurrency。
  • README-dev.md 引用的测量脚本(7 个)连同 bench/README.md 一起进仓库,并新增 tests/test_documented_paths.py 守卫文档里写出的仓库路径确实存在。
  • 入口模块顶部按主题列出段落顺序与拆分计划(未搬迁)。

验证

  • 测试 827 项全部通过(其中 2 项是真实 MCDR 端到端)。
  • 变异检查 12 条全部被抓。
  • 真实 MCDR 2.13.0 / 2.14.1 / 2.15.0 / 2.15.7 / 2.16.0 五版本各跑一遍完整流程,逐项一致。
  • 产物可复现、换行归一、包内无注释与 docstring、包内 changelog 只留本节且与版本号一致。