diff --git a/packages/ui/electron.vite.config.ts b/packages/ui/electron.vite.config.ts index 27ed422..bae286f 100644 --- a/packages/ui/electron.vite.config.ts +++ b/packages/ui/electron.vite.config.ts @@ -4,7 +4,7 @@ import vue from '@vitejs/plugin-vue' export default defineConfig({ main: { - plugins: [externalizeDepsPlugin({ exclude: ['@bossgeekgo/geek-auto-start-chat-with-boss'] })] + plugins: [externalizeDepsPlugin({ exclude: ['@bossgeekgo/geek-auto-start-chat-with-boss', '@bossgeekgo/dingtalk-plugin'] })] }, preload: { plugins: [externalizeDepsPlugin()] diff --git a/packages/ui/package.json b/packages/ui/package.json index 8f4da5b..e916518 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -21,6 +21,7 @@ }, "dependencies": { "@bossgeekgo/geek-auto-start-chat-with-boss": "workspace:*", + "@bossgeekgo/dingtalk-plugin": "workspace:*", "@electron-toolkit/preload": "^3.0.0", "@electron-toolkit/utils": "^3.0.0", "electron-updater": "^6.1.7", diff --git a/packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS.ts b/packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS.ts new file mode 100644 index 0000000..10054a0 --- /dev/null +++ b/packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS.ts @@ -0,0 +1,33 @@ +import DingtalkPlugin from '@bossgeekgo/dingtalk-plugin/index.mjs' +import { mainLoop } from '@bossgeekgo/geek-auto-start-chat-with-boss/index.mjs' +import { + SyncHook, + AsyncSeriesHook +} from 'tapable' +import { readConfigFile } from '@bossgeekgo/geek-auto-start-chat-with-boss/runtime-file-utils.mjs' +const { groupRobotAccessToken: dingTalkAccessToken } = readConfigFile('dingtalk.json') + +const initPlugins = (hooks) => { + new DingtalkPlugin(dingTalkAccessToken).apply(hooks) +} + +export const runAutoChat = async () => { + const hooks = { + puppeteerLaunched: new SyncHook(), + pageLoaded: new SyncHook(), + cookieWillSet: new SyncHook(['cookies']), + newChatWillStartup: new AsyncSeriesHook(['positionInfoDetail']), + newChatStartup: new SyncHook(['positionInfoDetail']), + noPositionFoundForCurrentJob: new SyncHook(), + noPositionFoundAfterTraverseAllJob: new SyncHook(), + errorEncounter: new SyncHook(['errorInfo']) + } + initPlugins(hooks) + while (true) { + try { + await mainLoop(hooks) + } catch (err) { + void err + } + } +} diff --git a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW.ts b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW.ts new file mode 100644 index 0000000..c77ab7e --- /dev/null +++ b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW.ts @@ -0,0 +1,43 @@ +import { app, BrowserWindow, ipcMain } from 'electron' +import { electronApp, optimizer } from '@electron-toolkit/utils' +import { createMainWindow } from '../window/mainWindow' + +export function openSettingWindow() { + // This method will be called when Electron has finished + // initialization and is ready to create browser windows. + // Some APIs can only be used after this event occurs. + app.whenReady().then(() => { + // Set app user model id for windows + electronApp.setAppUserModelId('com.electron') + + // Default open or close DevTools by F12 in development + // and ignore CommandOrControl + R in production. + // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils + app.on('browser-window-created', (_, window) => { + optimizer.watchWindowShortcuts(window) + }) + + // IPC test + ipcMain.on('ping', () => console.log('pong')) + + createMainWindow() + + app.on('activate', function () { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) createMainWindow() + }) + }) + + // Quit when all windows are closed, except on macOS. There, it's common + // for applications and their menu bar to stay active until the user quits + // explicitly with Cmd + Q. + app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } + }) + + // In this file you can include the rest of your app"s specific main process + // code. You can also put them in separate files and require them here. +} diff --git a/packages/ui/src/main/index.ts b/packages/ui/src/main/index.ts index 5e30666..f9d5386 100644 --- a/packages/ui/src/main/index.ts +++ b/packages/ui/src/main/index.ts @@ -1,43 +1,14 @@ -import { app, BrowserWindow, ipcMain } from 'electron' -import { electronApp, optimizer } from '@electron-toolkit/utils' -import { mainLoop } from '@bossgeekgo/geek-auto-start-chat-with-boss/index.mjs' -import { createMainWindow } from './window/mainWindow' -console.log(mainLoop) +import { runAutoChat } from './flow/GEEK_AUTO_START_CHAT_WITH_BOSS' +import { openSettingWindow } from './flow/OPEN_SETTING_WINDOW' -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.whenReady().then(() => { - // Set app user model id for windows - electronApp.setAppUserModelId('com.electron') - - // Default open or close DevTools by F12 in development - // and ignore CommandOrControl + R in production. - // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils - app.on('browser-window-created', (_, window) => { - optimizer.watchWindowShortcuts(window) - }) - - // IPC test - ipcMain.on('ping', () => console.log('pong')) - - createMainWindow() - - app.on('activate', function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createMainWindow() - }) -}) - -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() +const runMode = process.env.BOSSGEEKGO_RUN_MODE +switch (runMode) { + case 'geekAutoStartWithBoss': { + runAutoChat() + break } -}) - -// In this file you can include the rest of your app"s specific main process -// code. You can also put them in separate files and require them here. + default: { + openSettingWindow() + break + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 823b839..956db1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ importers: packages/ui: dependencies: + '@bossgeekgo/dingtalk-plugin': + specifier: workspace:* + version: link:../dingtalk-plugin '@bossgeekgo/geek-auto-start-chat-with-boss': specifier: workspace:* version: link:../geek-auto-start-chat-with-boss