test autorun

This commit is contained in:
pompurin404 2024-07-31 12:38:32 +08:00
parent 6bee06c4af
commit 056f07de00
No known key found for this signature in database
11 changed files with 149 additions and 15 deletions

View File

@ -11,9 +11,13 @@ files:
- '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}' - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}'
asarUnpack: asarUnpack:
- resources/** - resources/**
extraResources:
- from: './resources/'
to: ''
win: win:
target: target:
- nsis - nsis
requestedExecutionLevel: requireAdministrator
executableName: mihomo-party executableName: mihomo-party
nsis: nsis:
artifactName: ${name}-windows-${version}-${arch}-setup.${ext} artifactName: ${name}-windows-${version}-${arch}-setup.${ext}

View File

@ -30,7 +30,8 @@
"next-themes": "^0.3.0", "next-themes": "^0.3.0",
"react-icons": "^5.2.1", "react-icons": "^5.2.1",
"react-router-dom": "^6.25.1", "react-router-dom": "^6.25.1",
"swr": "^2.2.5" "swr": "^2.2.5",
"yaml": "^2.5.0"
}, },
"devDependencies": { "devDependencies": {
"@electron-toolkit/eslint-config-prettier": "^2.0.0", "@electron-toolkit/eslint-config-prettier": "^2.0.0",

3
pnpm-lock.yaml generated
View File

@ -38,6 +38,9 @@ importers:
swr: swr:
specifier: ^2.2.5 specifier: ^2.2.5
version: 2.2.5(react@18.3.1) version: 2.2.5(react@18.3.1)
yaml:
specifier: ^2.5.0
version: 2.5.0
devDependencies: devDependencies:
'@electron-toolkit/eslint-config-prettier': '@electron-toolkit/eslint-config-prettier':
specifier: ^2.0.0 specifier: ^2.0.0

0
script/prepare.ts Normal file
View File

91
src/main/autoRun.ts Normal file
View File

@ -0,0 +1,91 @@
import { exec } from 'child_process'
import { app } from 'electron'
import fs from 'fs'
// 获取应用的可执行文件路径
const exePath = app.getPath('exe')
const taskName = 'mihomo-party'
const taskXml = `
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>${new Date().toISOString()}</Date>
<Author>${process.env.USERNAME}</Author>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<Enabled>true</Enabled>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<LogonType>InteractiveToken</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>false</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>${exePath}</Command>
</Exec>
</Actions>
</Task>
`
export async function checkAutoRun(): Promise<boolean> {
if (process.platform === 'win32') {
const { stdout } = (await new Promise((resolve) => {
exec(`schtasks /query /tn "${taskName}"`, (_err, stdout, stderr) => {
resolve({ stdout, stderr })
})
})) as { stdout: string; stderr: string }
return stdout.includes(taskName)
} else {
return app.getLoginItemSettings().openAtLogin
}
}
export function enableAutoRun(): void {
if (process.platform === 'win32') {
const taskFilePath = `${app.getPath('userData')}\\${taskName}.xml`
fs.writeFileSync(taskFilePath, taskXml)
exec(`schtasks /create /tn "${taskName}" /xml "${taskFilePath}" /f`)
} else {
app.setLoginItemSettings({
openAtLogin: true,
path: exePath
})
}
}
export function disableAutoRun(): void {
if (process.platform === 'win32') {
exec(`schtasks /delete /tn "${taskName}" /f`)
app.setLoginItemSettings({
openAtLogin: false
})
} else {
app.setLoginItemSettings({
openAtLogin: false
})
}
}

10
src/main/cmds.ts Normal file
View File

@ -0,0 +1,10 @@
import { ipcMain } from 'electron'
import { mihomoVersion } from './mihomo-api'
import { checkAutoRun, disableAutoRun, enableAutoRun } from './autoRun'
export function registerIpcMainHandlers(): void {
ipcMain.handle('mihomoVersion', mihomoVersion)
ipcMain.handle('checkAutoRun', checkAutoRun)
ipcMain.handle('enableAutoRun', enableAutoRun)
ipcMain.handle('disableAutoRun', disableAutoRun)
}

View File

@ -3,7 +3,7 @@ import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils' import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import pngIcon from '../../resources/icon.png?asset' import pngIcon from '../../resources/icon.png?asset'
import icoIcon from '../../resources/icon.ico?asset' import icoIcon from '../../resources/icon.ico?asset'
import { registerIpcMainHandlers } from './mihomo-api' import { registerIpcMainHandlers } from './cmds'
let window: BrowserWindow | null = null let window: BrowserWindow | null = null
let tray: Tray | null = null let tray: Tray | null = null

View File

@ -1,4 +1,3 @@
import { ipcMain } from 'electron'
import axios, { AxiosInstance } from 'axios' import axios, { AxiosInstance } from 'axios'
let axiosIns: AxiosInstance = null! let axiosIns: AxiosInstance = null!
@ -21,11 +20,7 @@ export const getAxios = async (force: boolean = false): Promise<AxiosInstance> =
return axiosIns return axiosIns
} }
async function mihomoVersion(): Promise<IMihomoVersion> { export async function mihomoVersion(): Promise<IMihomoVersion> {
const instance = await getAxios() const instance = await getAxios()
return instance.get('/version') as Promise<IMihomoVersion> return instance.get('/version') as Promise<IMihomoVersion>
} }
export function registerIpcMainHandlers(): void {
ipcMain.handle('mihomoVersion', mihomoVersion)
}

View File

@ -1,6 +1,6 @@
import React from 'react' import React from 'react'
import ReactDOM from 'react-dom/client' import ReactDOM from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom' import { HashRouter } from 'react-router-dom'
import { ThemeProvider as NextThemesProvider } from 'next-themes' import { ThemeProvider as NextThemesProvider } from 'next-themes'
import { NextUIProvider } from '@nextui-org/react' import { NextUIProvider } from '@nextui-org/react'
import '@renderer/utils/init' import '@renderer/utils/init'
@ -11,9 +11,9 @@ ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<React.StrictMode> <React.StrictMode>
<NextUIProvider> <NextUIProvider>
<NextThemesProvider attribute="class" defaultTheme="dark"> <NextThemesProvider attribute="class" defaultTheme="dark">
<BrowserRouter> <HashRouter>
<App /> <App />
</BrowserRouter> </HashRouter>
</NextThemesProvider> </NextThemesProvider>
</NextUIProvider> </NextUIProvider>
</React.StrictMode> </React.StrictMode>

View File

@ -1,17 +1,35 @@
import { Button } from '@nextui-org/react' import { Button } from '@nextui-org/react'
import { mihomoVersion } from '@renderer/utils/api' import { checkAutoRun, enableAutoRun, disableAutoRun } from '@renderer/utils/api'
import useSWR from 'swr' import useSWR from 'swr'
export default function Settings(): JSX.Element { export default function Settings(): JSX.Element {
const { data, error, isLoading, mutate } = useSWR('mihomoVersion', mihomoVersion) const { data, error, isLoading, mutate } = useSWR('checkAutoRun', checkAutoRun, {
errorRetryCount: 5,
errorRetryInterval: 200
})
if (error) return <div>failed to load</div> if (error) return <div>failed to load</div>
if (isLoading) return <div>loading...</div> if (isLoading) return <div>loading...</div>
return ( return (
<div> <div>
{data?.version} {`${data}`}
<Button onPress={() => mutate()}>mutate</Button> <Button
onPress={async () => {
await enableAutoRun()
await mutate()
}}
>
enable
</Button>
<Button
onPress={async () => {
await disableAutoRun()
await mutate()
}}
>
disable
</Button>
</div> </div>
) )
} }

View File

@ -1,3 +1,15 @@
export async function mihomoVersion(): Promise<IMihomoVersion> { export async function mihomoVersion(): Promise<IMihomoVersion> {
return await window.electron.ipcRenderer.invoke('mihomoVersion') return await window.electron.ipcRenderer.invoke('mihomoVersion')
} }
export async function checkAutoRun(): Promise<boolean> {
return await window.electron.ipcRenderer.invoke('checkAutoRun')
}
export async function enableAutoRun(): Promise<void> {
await window.electron.ipcRenderer.invoke('enableAutoRun')
}
export async function disableAutoRun(): Promise<void> {
await window.electron.ipcRenderer.invoke('disableAutoRun')
}