79 lines
2.7 KiB
JavaScript
79 lines
2.7 KiB
JavaScript
|
|
// main/services/iosai.js
|
|||
|
|
const { app } = require('electron')
|
|||
|
|
const path = require('path')
|
|||
|
|
const fs = require('fs')
|
|||
|
|
const { exec } = require('child_process')
|
|||
|
|
const axios = require('axios')
|
|||
|
|
|
|||
|
|
let iosAIProcess = null
|
|||
|
|
let userData = { tenantId: null, userId: null, tokenValue: null } // 如果需要共享,请提供 setter
|
|||
|
|
|
|||
|
|
function resolveIOSAIPath() {
|
|||
|
|
const candidates = [
|
|||
|
|
path.join(path.dirname(process.execPath), 'iOSAI', 'IOSAI.exe'),
|
|||
|
|
path.join(process.resourcesPath || '', 'iOSAI', 'IOSAI.exe'),
|
|||
|
|
path.join(__dirname, '..', 'iOSAI', 'IOSAI.exe'),
|
|||
|
|
path.join(process.cwd(), 'iOSAI', 'IOSAI.exe'),
|
|||
|
|
]
|
|||
|
|
for (const p of candidates) {
|
|||
|
|
try { if (fs.existsSync(p)) return p } catch { }
|
|||
|
|
}
|
|||
|
|
return null
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function startIOSAIExecutable() {
|
|||
|
|
if (process.platform !== 'win32') {
|
|||
|
|
console.warn('[IOSAI] 非 Windows,跳过')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
const exePath = resolveIOSAIPath()
|
|||
|
|
if (!exePath) return console.error('[IOSAI] 未找到 IOSAI.exe')
|
|||
|
|
|
|||
|
|
const exeDir = path.dirname(exePath)
|
|||
|
|
const exeFile = path.basename(exePath)
|
|||
|
|
const cmd = `start "" /D "${exeDir}" "${exeFile}"`
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
exec(cmd, { cwd: exeDir, windowsHide: false }, (err) => {
|
|||
|
|
if (err) console.error('[IOSAI] 启动失败:', err)
|
|||
|
|
else console.log('[IOSAI] 启动命令已执行')
|
|||
|
|
})
|
|||
|
|
} catch (e) { console.error('[IOSAI] 启动异常:', e) }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function killIOSAI() {
|
|||
|
|
try {
|
|||
|
|
if (userData.userId && userData.tenantId) {
|
|||
|
|
await axios.post('https://crawlclient.api.yolozs.com/api/user/aiChat-logout',
|
|||
|
|
{ userId: userData.userId, tenantId: userData.tenantId },
|
|||
|
|
{ headers: { 'Content-Type': 'application/json', 'vvtoken': userData.tokenValue } }
|
|||
|
|
).catch(e => console.log('[IOSAI] 登出失败', e?.message))
|
|||
|
|
}
|
|||
|
|
if (iosAIProcess?.pid) {
|
|||
|
|
exec(`taskkill /PID ${iosAIProcess.pid} /T /F`, (err) => {
|
|||
|
|
if (err) {
|
|||
|
|
exec('taskkill /IM IOSAI.exe /F')
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
} else {
|
|||
|
|
exec('taskkill /IM IOSAI.exe /F')
|
|||
|
|
exec('taskkill /IM iproxy.exe /F')
|
|||
|
|
exec('taskkill /IM tidevice.exe /F')
|
|||
|
|
}
|
|||
|
|
} catch { }
|
|||
|
|
iosAIProcess = null
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function isProcessRunningWin(exeName) {
|
|||
|
|
return new Promise((resolve) => {
|
|||
|
|
if (process.platform !== 'win32') return resolve(true)
|
|||
|
|
const cmd = `tasklist /FI "IMAGENAME eq ${exeName}" /FO CSV /NH`
|
|||
|
|
exec(cmd, { windowsHide: true }, (err, stdout) => {
|
|||
|
|
if (err || !stdout) return resolve(false)
|
|||
|
|
resolve(stdout.toLowerCase().includes(`"${exeName.toLowerCase()}"`))
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
module.exports = { startIOSAIExecutable, killIOSAI, isProcessRunningWin }
|