| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- // 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
- };
|