import { exec, execFile } from 'child_process' import { dialog, nativeTheme } from 'electron' import { readFile } from 'fs/promises' import path from 'path' import { promisify } from 'util' import { exePath, mihomoCorePath, resourcesDir } from '../utils/dirs' export function getFilePath(ext: string[]): string[] | undefined { return dialog.showOpenDialogSync({ title: '选择订阅文件', filters: [{ name: `${ext} file`, extensions: ext }], properties: ['openFile'] }) } export async function readTextFile(filePath: string): Promise { return await readFile(filePath, 'utf8') } export async function openUWPTool(): Promise { const execFilePromise = promisify(execFile) const uwpToolPath = path.join(resourcesDir(), 'files', 'enableLoopback.exe') await execFilePromise(uwpToolPath) } export async function setupFirewall(): Promise { const execPromise = promisify(exec) const removeCommand = ` Remove-NetFirewallRule -DisplayName "mihomo" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "mihomo-alpha" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "Mihomo Party" -ErrorAction SilentlyContinue ` const createCommand = ` New-NetFirewallRule -DisplayName "mihomo" -Direction Inbound -Action Allow -Program "${mihomoCorePath('mihomo')}" -Enabled True -Profile Any -ErrorAction SilentlyContinue New-NetFirewallRule -DisplayName "mihomo-alpha" -Direction Inbound -Action Allow -Program "${mihomoCorePath('mihomo-alpha')}" -Enabled True -Profile Any -ErrorAction SilentlyContinue New-NetFirewallRule -DisplayName "Mihomo Party" -Direction Inbound -Action Allow -Program "${exePath()}" -Enabled True -Profile Any -ErrorAction SilentlyContinue ` if (process.platform === 'win32') { await execPromise(removeCommand, { shell: 'powershell' }) await execPromise(createCommand, { shell: 'powershell' }) } } export function setNativeTheme(theme: 'system' | 'light' | 'dark'): void { nativeTheme.themeSource = theme }