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

100

Back to catalogue

ModUpdateChecker-v1.0.0.mcdr

Version

1.0.0

Date

October 7, 2026

Size

70.94 KiB

Downloads

8

MD5

3a37d8ef6a6d299283a52b79af1af1c8

SHA256

20cd274864f4182a008e7bfdf2422758a175088088a344381fff3000c021fccb

MCDR Plugin Dependencies

Plugin IDRequirement
mcdreforged>=2.13.0

Python Package Requirements

Python PackageRequirement

none

首个版本:扫描服务端 mods/ 目录里的每个 jar,与 Modrinth 比对,报告哪些 Mod 有更新的构建、哪些没有适配当前加载器或游戏版本的构建、哪些查不到来源。不需要任何 API key 或额外依赖。

默认只读:写 mods/ 的能力要先开启 download.install_on_stop,或者逐个 !!muc install 点名,且只在关服后执行。

功能

  • 识别方式:按 SHA-1 批量识别(一两次请求识别整个 mods 目录);自编译、重新打包过的 jar 按名字兜底并在报告里标注 matched_by: name;顺带诊断重复 mod id、仅客户端 Mod 装在服务端、声明的 MC 版本范围与当前服务端不符。
  • 九个状态:update_available / awaiting_install / no_compatible_build / local_ahead / up_to_date / unresolved / not_a_mod / error / ignored。「无适配构建」分两种并分别说明:项目没发布过该加载器的构建,还是发布过但没有面向当前游戏版本。报告分「有更新但尚未下载」与「已下载待安装」两组,一个 Mod 只属于其中一组。
  • 配置按功能分组:顶层只留 enabled / language / command_permission_level,其余分入 server / check / report / sources / download / network 六章。旧版本平铺的选项名不再被读取,插件会为此打一行警告并列出每个旧名字对应的新路径。
  • 列表一行一个 Mod:详情点开才看(!!modupdate info 或点 [详细信息])。每行最多一个链接且对齐成一列;只在「下一步是打开网页」时给链接;待处理优先,截断会写明还剩多少;编号取自完整列表,同一编号始终指同一个 Mod。全部聊天输出受一页预算约束(18 行)。
  • 关服后自动安装(download.install_on_stop,默认关闭):只在关服后动手;只处理插件自己下载过的文件;旧 jar 只改名(.old / .old.2)绝不覆盖;安装前校验哈希、失败回滚;mods/ 里那个 jar 已不在就跳过。明细在下次启动时列出,第一位上线的管理员也会收到;文件名开头的中括号备注会跟到新文件名上。
  • 手动下载与安装:download <编号> / install <编号> 都先列出将要发生什么,再等 !!modupdate confirm(120 秒内有效,重载配置或再跑过一次检查同样作废)。install 要求文件已经下载好;只有发起人本人能确认;授权逐条生效,不会影响别的文件。详情页底部有可点的 [下载此版本] / [安排安装]。
  • 自动检查与提醒:开服后自动检查一次并写入控制台日志(延迟 60 秒避开 Mod 加载);管理员上线时把结果单独发给他(24 小时内的结果直接复用,且不重复广播);可选游戏内广播(默认关)。
  • 可选下载(download.enabled,默认关闭):只写能校验哈希的文件,校验不过的丢弃且不留残留;同名不同内容绝不覆盖;下载过的版本被取代时自动删旧;下载失败按 download.retries 重试(404/401/403 与写盘失败不重试);下载失败不影响检查结果。
  • 排除不想检查的 Mod:check.ignored_mods 接受 mod id、jar 文件名或去掉 .jar 的名字;被排除的 Mod 完全不产生网络查询,但仍以 ignored 状态出现在报告里。

命令

!!modupdate 与 !!muc 两个别名,默认需要 MCDR 权限等级 3:check / list [状态] / info <编号> / download <编号> / install <编号> / confirm / status / reload / help。帮助页有标题栏与统一配色,并显示你实际输入的那个别名。

修复(开发期间的独立代码审查)

  • 事件监听器被注册两次(MCDR 会合并显式注册与按名发现),导致每个事件触发两次、每次开服起两个检查线程。
  • !!MCDR reload plugin 路径不派发 on_unload,每次重载遗留一个调度线程;!!modupdate reload 因停止事件没清导致定时检查被静默关闭。
  • 批量查询失败被当成「没有适配构建」(把瞬时故障变成一个看起来很确定的错误结论);上游失败仍写入否定缓存(把网络故障提升成 24 小时盲区);GET /projects?ids= 未容忍 404(一个坏 id 让整批丢掉标题与链接)。
  • covers(">= 1.21.4", "1.21.5") 因运算符旁空格返回 False(版本范围退化成等值判断);int() 拒绝超长数字串(畸形版本号会让整次检查抛异常)。
  • logger.info(RText) 的颜色被静默丢弃:控制台改走纯文本,回复走 RText。
  • 文档与死代码清理:更正过期的注释与说法、删除无人调用的函数与字段、语言目录自检补上 install 家族键、「还有 N 个未显示」只在真的截断时输出。

其他

  • 消息里的插件名统一为声明名,并加测试要求「任何 [方括号] 开头的文案,方括号里必须是元数据里的那个名字」。
  • 开发期间实现过、随后整条移除 CurseForge 支持(它的所有端点都要求 API key,且下载不保证直链),现在只查 Modrinth,不需要任何凭据。
  • README 分成两份:README.md 面向使用者,README-dev.md 面向开发者,互相链接;两份都不进产物。

验证

  • 自动化测试覆盖版本比对与范围匹配、元数据解析、下载的各类失败模式(含「被篡改必拒绝」)、MCDR 生命周期约束、配置分组不变式、语言目录一致性、手动下载/安装的确认流程、文档与代码的一致性,以及真实 MCDR 端到端。
  • 跨 5 个 MCDR 版本(2.13.0 / 2.14.1 / 2.15.0 / 2.15.7 / 2.16.0)各起一次真实 MCDR 跑完整流程,逐项检查一致。
  • 产物可复现:同一份源码打两次,SHA-256 完全一致。