import { overrideConfigPath, overridePath } from '../utils/dirs' import { getControledMihomoConfig } from './controledMihomo' import { readFile, writeFile, rm } from 'fs/promises' import { existsSync } from 'fs' import axios from 'axios' import yaml from 'yaml' let overrideConfig: IOverrideConfig // override.yaml export async function getOverrideConfig(force = false): Promise { if (force || !overrideConfig) { const data = await readFile(overrideConfigPath(), 'utf-8') overrideConfig = yaml.parse(data, { merge: true }) || { items: [] } } if (typeof overrideConfig !== 'object') overrideConfig = { items: [] } return overrideConfig } export async function setOverrideConfig(config: IOverrideConfig): Promise { overrideConfig = config await writeFile(overrideConfigPath(), yaml.stringify(overrideConfig), 'utf-8') } export async function getOverrideItem(id: string | undefined): Promise { const { items } = await getOverrideConfig() return items.find((item) => item.id === id) } export async function updateOverrideItem(item: IOverrideItem): Promise { const config = await getOverrideConfig() const index = config.items.findIndex((i) => i.id === item.id) if (index === -1) { throw new Error('Override not found') } config.items[index] = item await setOverrideConfig(config) } export async function addOverrideItem(item: Partial): Promise { const config = await getOverrideConfig() const newItem = await createOverride(item) if (await getOverrideItem(item.id)) { updateOverrideItem(newItem) } else { config.items.push(newItem) } await setOverrideConfig(config) } export async function removeOverrideItem(id: string): Promise { const config = await getOverrideConfig() const item = await getOverrideItem(id) config.items = config.items?.filter((item) => item.id !== id) await setOverrideConfig(config) await rm(overridePath(id, item?.ext || 'js')) } export async function createOverride(item: Partial): Promise { const id = item.id || new Date().getTime().toString(16) const newItem = { id, name: item.name || (item.type === 'remote' ? 'Remote File' : 'Local File'), type: item.type, ext: item.ext || 'js', url: item.url, global: item.global || false, updated: new Date().getTime() } as IOverrideItem switch (newItem.type) { case 'remote': { const { 'mixed-port': mixedPort = 7890 } = await getControledMihomoConfig() if (!item.url) throw new Error('Empty URL') const res = await axios.get(item.url, { proxy: { protocol: 'http', host: '127.0.0.1', port: mixedPort } }) const data = res.data await setOverride(id, newItem.ext, data) break } case 'local': { const data = item.file || '' setOverride(id, newItem.ext, data) break } } return newItem } export async function getOverride(id: string, ext: 'js' | 'yaml' | 'log'): Promise { if (!existsSync(overridePath(id, ext))) { return '' } return await readFile(overridePath(id, ext), 'utf-8') } export async function setOverride(id: string, ext: 'js' | 'yaml', content: string): Promise { await writeFile(overridePath(id, ext), content, 'utf-8') }