import { taskDir, exePath, homeDir } from '../utils/dirs'
import { mkdir, readFile, rm, writeFile } from 'fs/promises'
import { exec } from 'child_process'
import { existsSync } from 'fs'
import { app } from 'electron'
import { promisify } from 'util'
import path from 'path'
const appName = 'mihomo-party'
const taskXml = `
${new Date().toISOString()}
${process.env.USERNAME}
true
InteractiveToken
HighestAvailable
IgnoreNew
false
false
false
true
true
false
false
true
true
false
false
false
PT0S
7
${exePath()}
`
export async function checkAutoRun(): Promise {
if (process.platform === 'win32') {
const execPromise = promisify(exec)
try {
const { stdout } = await execPromise(`schtasks /query /tn "${appName}"`)
return stdout.includes(appName)
} catch (e) {
return false
}
}
if (process.platform === 'darwin') {
return app.getLoginItemSettings().openAtLogin
}
if (process.platform === 'linux') {
return existsSync(path.join(homeDir, '.config', 'autostart', `${appName}.desktop`))
}
return false
}
export async function enableAutoRun(): Promise {
if (process.platform === 'win32') {
const execPromise = promisify(exec)
const taskFilePath = path.join(taskDir(), `${appName}.xml`)
await writeFile(taskFilePath, Buffer.from(`\ufeff${taskXml}`, 'utf-16le'))
await execPromise(`schtasks /create /tn "${appName}" /xml "${taskFilePath}" /f`)
}
if (process.platform === 'darwin') {
app.setLoginItemSettings({
openAtLogin: true
})
}
if (process.platform === 'linux') {
let desktop = `
[Desktop Entry]
Name=mihomo-party
Exec=${exePath()} %U
Terminal=false
Type=Application
Icon=mihomo-party
StartupWMClass=mihomo-party
Comment=Mihomo Party
Categories=Utility;
`
if (existsSync(`/usr/share/applications/${appName}.desktop`)) {
desktop = await readFile(`/usr/share/applications/${appName}.desktop`, 'utf8')
}
const autostartDir = path.join(homeDir, '.config', 'autostart')
if (!existsSync(autostartDir)) {
await mkdir(autostartDir, { recursive: true })
}
const desktopFilePath = path.join(autostartDir, `${appName}.desktop`)
await writeFile(desktopFilePath, desktop)
}
}
export async function disableAutoRun(): Promise {
if (process.platform === 'win32') {
const execPromise = promisify(exec)
await execPromise(`schtasks /delete /tn "${appName}" /f`)
}
if (process.platform === 'darwin') {
app.setLoginItemSettings({
openAtLogin: false
})
}
if (process.platform === 'linux') {
const desktopFilePath = path.join(homeDir, '.config', 'autostart', `${appName}.desktop`)
await rm(desktopFilePath)
}
}