第二十一批:已存在的ban/规则配置.md安全升级——saveResource只补缺失文件永不覆盖既有文件,模板新增配置行(播报起点)对生产服永远释放不出来;ensureConfigExists对已存在md走safeUpgradeDoc(原文件为基底逐字保留、只补新行、.bak校验失败取消、原子写失败还原、无新增幂等)
Check Source / check (push) Successful in 4s
Auto Release / build (push) Successful in 2m12s
Simple Test / test (push) Successful in 2s
Test Env / test (push) Successful in 2s

This commit is contained in:
youpaishidifu
2026-10-15 18:34:14 +08:00
parent 6d19e23f42
commit 23c1b9e468
@@ -38,7 +38,8 @@ import java.util.regex.Pattern;
* - *.json 直接作为配置文件;
* - 规则配置.md 优先解 ```json 代码块,解不出再解 markdown 表格;
* - 解码全失败 → 备份原文件 + 释放一份新的。
* 配置丢失 → 自动补发(saveResource 自愈)。
* 配置丢失 → 自动补发(saveResource 自愈);
* 已存在的 md → 安全升级自动补齐模板新增行(safeUpgradeDoc,第二十一批)。
*
* 键值:轮播最低间隔(秒) / 轮播最大间隔(秒) / 播报模式 / 播报起点(插件安装之前的封禁不播)
* 播报模式:true=由近到远、false=由远到近、0=关闭;
@@ -123,7 +124,7 @@ public class BanBroadcastManager implements Listener {
return (fs != null && fs.length > 0) ? fs[0] : null;
}
/** 配置文件丢失就补一份(自愈) */
/** 配置文件丢失就补一份(自愈);已存在的 md 走安全升级补齐模板新增行 */
private void ensureConfigExists() {
jsonFile = findJsonConfig(); // ★ 每轮重查:运行中新增/删除的 json 都要跟上
try {
@@ -133,13 +134,23 @@ public class BanBroadcastManager implements Listener {
plugin.saveResource("ban/" + jsonFile.getName(), false);
log("配置文件丢失,已自愈补发: " + jsonFile.getName());
}
return;
}
if (!mdFile.exists()) {
} else if (!mdFile.exists()) {
banDir.mkdirs();
plugin.saveResource("ban/规则配置.md", false);
log("配置文件丢失,已自愈补发: 规则配置.md");
}
// ★ 第二十一批:已存在的 md 安全升级 —— saveResource(...,false) 对已存在文件
// 永不覆盖,jar 模板新增的配置行(如「播报起点」)借此补进原文件;
// 说明文字与用户改过的值原样保留(safeUpgradeDoc:先 .bak 逐字节校验,
// 备份失败整个取消不动原文件;原子写失败自动还原;无新增行幂等不写文件)。
// 有变更由 safeUpgradeDoc 打一条明细,无变更安静 —— 对齐增量日志要求。
if (mdFile != null && mdFile.exists()) {
java.util.List<String> tpl = ConfigManager.readJarResourceLines(
plugin.getResource("ban/规则配置.md"));
if (tpl != null) {
plugin.getConfig2().safeUpgradeDoc(mdFile, tpl, "封禁播报规则");
}
}
} catch (Exception e) {
warn("自愈补发失败: " + e.getMessage());
}