// electron/utils/readConfig.js const fs = require('fs'); const path = require('path'); const { app } = require('electron'); const defaultConfig = require('./config.default'); const configPath = path.join(app.getPath("userData"),'config.default.json'); // Smart Shooter 5 的历史默认安装目录。用户目录里的旧配置会盖掉代码默认值, // 只有仍停在这套出厂值时才自动切到 6;手动选过别的目录则保持不动。 const LEGACY_SMARTSHOOTER5 = { controlType: "SmartShooter", controlPath: "C:\\Program Files\\Smart Shooter 5", } function sameValue(a, b) { return JSON.stringify(a) === JSON.stringify(b) } // 用户目录只保留和 utils 默认值不同的项 function stripDefaults(overrides) { const next = { ...overrides } for (const key of Object.keys(next)) { if (Object.prototype.hasOwnProperty.call(defaultConfig, key) && sameValue(next[key], defaultConfig[key])) { delete next[key] } } return next } function overridesEqual(a, b) { const keys = new Set([...Object.keys(a || {}), ...Object.keys(b || {})]) for (const key of keys) { if (!sameValue(a[key], b[key])) return false } return true } function readOverrides() { if (!fs.existsSync(configPath)) return {} const data = fs.readFileSync(configPath, 'utf8'); const parsed = JSON.parse(data); if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {} return parsed } function writeOverrides(overrides) { fs.writeFileSync(configPath, JSON.stringify(overrides, null, 2), 'utf8'); } function migrateLegacySmartShooter(overrides) { if (!overrides || overrides.smartShooter6Migrated) return { overrides, changed: false } const merged = { ...defaultConfig, ...overrides } const stillFactoryDefault = merged.controlType === LEGACY_SMARTSHOOTER5.controlType && merged.controlPath === LEGACY_SMARTSHOOTER5.controlPath const next = { ...overrides, smartShooter6Migrated: true } if (!stillFactoryDefault) return { overrides: next, changed: true } next.controlType = defaultConfig.controlType next.controlPath = defaultConfig.controlPath next.SmartShooterPath = overrides.SmartShooterPath || LEGACY_SMARTSHOOTER5.controlPath next.SmartShooter6Path = defaultConfig.SmartShooter6Path return { overrides: next, changed: true } } /** * 读取配置:utils 里的默认值打底,用户目录里只覆盖改过的项 */ function readConfigFile() { try { const overrides = readOverrides() const { overrides: migrated, changed } = migrateLegacySmartShooter(overrides) const stored = stripDefaults(migrated) if (changed || !overridesEqual(overrides, stored)) { writeOverrides(stored) } return { ...defaultConfig, ...stored, }; } catch (error) { console.error('读取配置文件出错:', error); return null; } } /** * 一次写入多项调整。和默认值相同的项不写进用户目录 */ function updateConfigFile(partial) { try { const next = { ...readOverrides() } for (const [key, value] of Object.entries(partial)) { if (Object.prototype.hasOwnProperty.call(defaultConfig, key) && sameValue(value, defaultConfig[key])) { delete next[key] } else { next[key] = value } } writeOverrides(stripDefaults(next)) console.log(`成功写入配置项: ${Object.keys(partial).join(', ')}`); } catch (error) { console.error('写入配置文件出错:', error); } } /** * 写入配置文件 * @param {string} key - 要写入的配置项键名 * @param {*} value - 要写入的配置项值 */ function writeConfigFile(key, value) { updateConfigFile({ [key]: value }) } module.exports = { readConfigFile, writeConfigFile, updateConfigFile };