diff --git a/src/main/config/profile.ts b/src/main/config/profile.ts index 713428e..20b1dc6 100644 --- a/src/main/config/profile.ts +++ b/src/main/config/profile.ts @@ -1,6 +1,6 @@ import { getControledMihomoConfig } from './controledMihomo' import { mihomoProfileWorkDir, mihomoWorkDir, profileConfigPath, profilePath } from '../utils/dirs' -import { addProfileUpdater } from '../core/profileUpdater' +import { addProfileUpdater, removeProfileUpdater } from '../core/profileUpdater' import { readFile, rm, writeFile } from 'fs/promises' import { restartCore } from '../core/manager' import { getAppConfig } from './app' @@ -82,6 +82,9 @@ export async function addProfileItem(item: Partial): Promise } export async function removeProfileItem(id: string): Promise { + // 先清理自动更新定时器,防止已删除的订阅重新出现 + await removeProfileUpdater(id) + const config = await getProfileConfig() config.items = config.items?.filter((item) => item.id !== id) let shouldRestart = false diff --git a/src/main/core/profileUpdater.ts b/src/main/core/profileUpdater.ts index 122f9b7..95a29a8 100644 --- a/src/main/core/profileUpdater.ts +++ b/src/main/core/profileUpdater.ts @@ -112,4 +112,15 @@ export async function addProfileUpdater(item: IProfileItem): Promise { }) } } +} + +export async function removeProfileUpdater(id: string): Promise { + if (intervalPool[id]) { + if (intervalPool[id] instanceof Cron) { + (intervalPool[id] as Cron).stop() + } else { + clearInterval(intervalPool[id] as NodeJS.Timeout) + } + delete intervalPool[id] + } } \ No newline at end of file diff --git a/src/main/utils/ipc.ts b/src/main/utils/ipc.ts index e25a3d1..26f2e76 100644 --- a/src/main/utils/ipc.ts +++ b/src/main/utils/ipc.ts @@ -104,7 +104,7 @@ import { getImageDataURL } from './image' import { startMonitor } from '../resolve/trafficMonitor' import { closeFloatingWindow, showContextMenu, showFloatingWindow } from '../resolve/floatingWindow' import i18next from 'i18next' -import { addProfileUpdater } from '../core/profileUpdater' +import { addProfileUpdater, removeProfileUpdater } from '../core/profileUpdater' function ipcErrorWrapper( // eslint-disable-next-line @typescript-eslint/no-explicit-any fn: (...args: any[]) => Promise // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -187,6 +187,7 @@ export function registerIpcMainHandlers(): void { ipcMain.handle('addProfileItem', (_e, item) => ipcErrorWrapper(addProfileItem)(item)) ipcMain.handle('removeProfileItem', (_e, id) => ipcErrorWrapper(removeProfileItem)(id)) ipcMain.handle('addProfileUpdater', (_e, item) => ipcErrorWrapper(addProfileUpdater)(item)) + ipcMain.handle('removeProfileUpdater', (_e, id) => ipcErrorWrapper(removeProfileUpdater)(id)) ipcMain.handle('getOverrideConfig', (_e, force) => ipcErrorWrapper(getOverrideConfig)(force)) ipcMain.handle('setOverrideConfig', (_e, config) => ipcErrorWrapper(setOverrideConfig)(config)) ipcMain.handle('getOverrideItem', (_e, id) => ipcErrorWrapper(getOverrideItem)(id)) diff --git a/src/renderer/src/utils/ipc.ts b/src/renderer/src/utils/ipc.ts index 7f09253..86ccb9e 100644 --- a/src/renderer/src/utils/ipc.ts +++ b/src/renderer/src/utils/ipc.ts @@ -167,6 +167,10 @@ export async function addProfileUpdater(item: IProfileItem): Promise { return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('addProfileUpdater', item)) } +export async function removeProfileUpdater(id: string): Promise { + return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('removeProfileUpdater', id)) +} + export async function getProfileStr(id: string): Promise { return ipcErrorWrapper(await window.electron.ipcRenderer.invoke('getProfileStr', id)) }