diff --git a/lib/config/configControl.js b/lib/config/configControl.js index 67b8c0c..8027112 100644 --- a/lib/config/configControl.js +++ b/lib/config/configControl.js @@ -7,7 +7,8 @@ const fsp = fs.promises; const pluginConfigPath = Path.defaultConfigPath; const dataConfigPath = Path.config; const configFile = path.join(dataConfigPath, 'config.json'); -let configCache = {}; // 缓存 +let configCache = {}; +let watchers = []; /** * 初始化配置 @@ -80,9 +81,43 @@ async function init() { } } +/** + * 配置文件热更新 + */ +function watchConfigs() { + for (const w of watchers) { + w.close(); + } + watchers = []; + + fsp.readdir(dataConfigPath).then((files) => { + files + .filter((f) => f.endsWith('.json')) + .forEach((file) => { + const filePath = path.join(dataConfigPath, file); + const watcher = fs.watch(filePath, async (eventType) => { + if (eventType === 'change') { + try { + const data = await fc.readJSON(filePath); + const name = path.basename(file, '.json'); + configCache[name] = data; + if (configCache.debug) { + logger.info(`[crystelf-plugin] 配置热更新: ${file}`); + } + } catch (e) { + logger.warn(`[crystelf-plugin] 热更新读取失败 ${file}:`, e); + } + } + }); + watchers.push(watcher); + }); + }); +} + const configControl = { async init() { await init(); + watchConfigs(); }, get(key) { @@ -126,6 +161,7 @@ const configControl = { async reload() { await init(); + watchConfigs(); return true; }, };