64 lines
2.2 KiB
JavaScript
64 lines
2.2 KiB
JavaScript
'use strict';
|
|
|
|
const path = require('path');
|
|
const fs = require('fs').promises;
|
|
|
|
function mergeConfig(defaults, user) {
|
|
return {
|
|
...defaults,
|
|
...user,
|
|
update_feed_url:
|
|
user.update_feed_url != null && user.update_feed_url !== ''
|
|
? user.update_feed_url
|
|
: defaults.update_feed_url,
|
|
github: { ...defaults.github, ...(user.github || {}) },
|
|
launch: { ...defaults.launch, ...(user.launch || {}) },
|
|
auth: user.auth != null ? { ...defaults.auth, ...user.auth } : defaults.auth,
|
|
realmlist: user.realmlist != null ? { ...defaults.realmlist, ...user.realmlist } : defaults.realmlist,
|
|
files: Array.isArray(user.files) && user.files.length ? user.files : defaults.files,
|
|
};
|
|
}
|
|
|
|
function getConfigPath(app) {
|
|
if (process.env.FRACTURED_LAUNCHER_CONFIG) return process.env.FRACTURED_LAUNCHER_CONFIG;
|
|
if (app && app.isPackaged) {
|
|
return path.join(path.dirname(process.execPath), 'launcher.json');
|
|
}
|
|
return path.join(__dirname, '..', 'launcher.json');
|
|
}
|
|
|
|
async function loadConfig(app) {
|
|
const p = getConfigPath(app);
|
|
const defPath = path.join(__dirname, '..', 'default-launcher.json');
|
|
const defaults = JSON.parse(await fs.readFile(defPath, 'utf8'));
|
|
try {
|
|
const user = JSON.parse(await fs.readFile(p, 'utf8'));
|
|
return { configPath: p, config: mergeConfig(defaults, user) };
|
|
} catch (e) {
|
|
if (e.code === 'ENOENT') {
|
|
await fs.writeFile(p, JSON.stringify(defaults, null, 2), 'utf8');
|
|
return { configPath: p, config: JSON.parse(JSON.stringify(defaults)) };
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async function saveGameDir(configPath, gameDir) {
|
|
const defPath = path.join(__dirname, '..', 'default-launcher.json');
|
|
const defaults = JSON.parse(await fs.readFile(defPath, 'utf8'));
|
|
const user = JSON.parse(await fs.readFile(configPath, 'utf8'));
|
|
user.game_dir = gameDir;
|
|
const merged = mergeConfig(defaults, user);
|
|
await fs.writeFile(configPath, JSON.stringify(merged, null, 2), 'utf8');
|
|
return merged;
|
|
}
|
|
|
|
function resolveGameDir(cfg, configPath) {
|
|
const gd = cfg.game_dir;
|
|
if (!gd) return '';
|
|
if (path.isAbsolute(gd)) return path.normalize(gd);
|
|
return path.normalize(path.join(path.dirname(configPath), gd));
|
|
}
|
|
|
|
module.exports = { getConfigPath, loadConfig, saveGameDir, resolveGameDir, mergeConfig };
|