import { getAppConfig } from '../config' import dayjs from 'dayjs' import AdmZip from 'adm-zip' import { appConfigPath, controledMihomoConfigPath, dataDir, overrideConfigPath, overrideDir, profileConfigPath, profilesDir, subStoreDir, themesDir } from '../utils/dirs' export async function webdavBackup(): Promise { const { createClient } = await import('webdav/dist/node/index.js') const { webdavUrl = '', webdavUsername = '', webdavPassword = '', webdavDir = 'mihomo-party' } = await getAppConfig() const zip = new AdmZip() zip.addLocalFile(appConfigPath()) zip.addLocalFile(controledMihomoConfigPath()) zip.addLocalFile(profileConfigPath()) zip.addLocalFile(overrideConfigPath()) zip.addLocalFolder(themesDir(), 'themes') zip.addLocalFolder(profilesDir(), 'profiles') zip.addLocalFolder(overrideDir(), 'override') zip.addLocalFolder(subStoreDir(), 'substore') const date = new Date() const zipFileName = `${process.platform}_${dayjs(date).format('YYYY-MM-DD_HH-mm-ss')}.zip` const client = createClient(webdavUrl, { username: webdavUsername, password: webdavPassword }) try { await client.createDirectory(webdavDir) } catch { // ignore } return await client.putFileContents(`${webdavDir}/${zipFileName}`, zip.toBuffer()) } export async function webdavRestore(filename: string): Promise { const { createClient } = await import('webdav/dist/node/index.js') const { webdavUrl = '', webdavUsername = '', webdavPassword = '', webdavDir = 'mihomo-party' } = await getAppConfig() const client = createClient(webdavUrl, { username: webdavUsername, password: webdavPassword }) const zipData = await client.getFileContents(`${webdavDir}/${filename}`) const zip = new AdmZip(zipData as Buffer) zip.extractAllTo(dataDir(), true) } export async function listWebdavBackups(): Promise { const { createClient } = await import('webdav/dist/node/index.js') const { webdavUrl = '', webdavUsername = '', webdavPassword = '', webdavDir = 'mihomo-party' } = await getAppConfig() const client = createClient(webdavUrl, { username: webdavUsername, password: webdavPassword }) const files = await client.getDirectoryContents(webdavDir, { glob: '*.zip' }) if (Array.isArray(files)) { return files.map((file) => file.basename) } else { return files.data.map((file) => file.basename) } } export async function webdavDelete(filename: string): Promise { const { createClient } = await import('webdav/dist/node/index.js') const { webdavUrl = '', webdavUsername = '', webdavPassword = '', webdavDir = 'mihomo-party' } = await getAppConfig() const client = createClient(webdavUrl, { username: webdavUsername, password: webdavPassword }) await client.deleteFile(`${webdavDir}/${filename}`) }