'use strict'; const fs = require('fs'); const path = require('path'); const { defaultConfig, normalizeConfig } = require('./expansionConfig'); /** * 配置文件读写器:把扩地配置持久化为 JSON。 * * 默认路径为项目根目录下的 `data/autostore.json`(已在 .gitignore 中忽略), * 也可通过构造参数覆盖,便于测试使用临时目录。 */ class ConfigStore { /** * @param {string} [filePath] 配置文件绝对路径 */ constructor(filePath) { this.filePath = filePath || path.join(__dirname, '..', '..', 'data', 'autostore.json'); } /** * 从磁盘加载配置;文件不存在或解析失败时返回默认配置。 * @returns {object} */ load() { let raw; try { raw = fs.readFileSync(this.filePath, 'utf8'); } catch { return defaultConfig(); } try { const parsed = JSON.parse(raw); const config = normalizeConfig(parsed); // 固定值字段:防止旧配置文件里的异常值影响运行 config.autoEat = true; config.eatThreshold = 14; // API Key 兜底:配置文件未填写时从环境变量 SIMP_API_KEY 读取 //(密钥不进代码仓库,开发环境由 .env 提供,运行环境可设置系统环境变量) if (!config.apiKey) { const envKey = process.env.SIMP_API_KEY; if (envKey && envKey.trim()) config.apiKey = envKey.trim(); } return config; } catch { return defaultConfig(); } } /** * 把配置写入磁盘(自动创建父目录)。 * @param {object} config * @returns {boolean} 是否写入成功 */ save(config) { try { fs.mkdirSync(path.dirname(this.filePath), { recursive: true }); fs.writeFileSync(this.filePath, JSON.stringify(config, null, 2), 'utf8'); return true; } catch { // 保存失败时静默忽略(不阻塞运行) return false; } } } module.exports = { ConfigStore };