diff --git a/manifest.json b/manifest.json index 7bd5616..28e50ec 100644 --- a/manifest.json +++ b/manifest.json @@ -4,16 +4,12 @@ "name": "LLOneBot", "slug": "LLOneBot", "description": "实现 OneBot 11 和 Satori 协议,用于 QQ 机器人开发", - "version": "4.1.3", + "version": "4.1.4", "icon": "./icon.webp", "authors": [ { "name": "linyuchen", "link": "https://github.com/linyuchen" - }, - { - "name": "idranme", - "link": "https://github.com/idranme" } ], "repository": { @@ -34,4 +30,4 @@ "main": "./main/main.cjs", "preload": "./preload/preload.cjs" } -} +} \ No newline at end of file diff --git a/src/common/utils/window.ts b/src/common/utils/window.ts new file mode 100644 index 0000000..3d10a5f --- /dev/null +++ b/src/common/utils/window.ts @@ -0,0 +1,9 @@ +import { BrowserWindow } from 'electron' +import { log } from '@/common/utils' + +export function getAllWindowIds(): number[] { + const allWindows = BrowserWindow.getAllWindows(); + const ids = allWindows.map(window => window.id); + log('getAllWindowIds', ids); + return ids; +} diff --git a/src/main/main.ts b/src/main/main.ts index d5651be..120f7ba 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -35,6 +35,7 @@ import { NTQQWindowApi } from '../ntqqapi/api' import { existsSync, mkdirSync } from 'node:fs' +import { checkChanelId } from '@/ntqqapi/ntcall' declare module 'cordis' { interface Events { @@ -180,18 +181,17 @@ function onLoad() { if (self.uin) { clearInterval(intervalId) log('process pid', process.pid) - const config = getConfigUtil().getConfig() if (config.enableLLOB && (config.satori.enable || config.ob11.enable)) { startHook() + await checkChanelId() await ctx.sleep(600) } else { llonebotError.otherError = 'LLOneBot 未启动' log('LLOneBot 开关设置为关闭,不启动 LLOneBot') return } - ctx.plugin(Log, { enable: config.log!, filename: logFileName diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index 1c57bed..59e9c2c 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -1,4 +1,4 @@ -import { NTMethod } from './ntcall' +import { invoke, NTChannel, NTMethod } from './ntcall' import { log } from '@/common/utils' import { randomUUID } from 'node:crypto' import { ipcMain } from 'electron' @@ -40,6 +40,8 @@ const callHooks: Array<{ }> = [] export function startHook() { + log("start hook") + const senderExclude = Symbol() ipcMain.emit = new Proxy(ipcMain.emit, { @@ -50,7 +52,6 @@ export function startHook() { if (logHook) { log('request', args) } - const event = args[1] if (event.sender && !event.sender[senderExclude]) { event.sender[senderExclude] = true diff --git a/src/ntqqapi/ntcall.ts b/src/ntqqapi/ntcall.ts index 0f27e30..0e1c64e 100644 --- a/src/ntqqapi/ntcall.ts +++ b/src/ntqqapi/ntcall.ts @@ -1,5 +1,5 @@ import { ipcMain } from 'electron' -import { hookApiCallbacks, registerReceiveHook, removeReceiveHook } from './hook' +import { hookApiCallbacks, ReceiveCmdS, registerReceiveHook, removeReceiveHook } from './hook' import { getBuildVersion, log } from '../common/utils' import { randomUUID } from 'node:crypto' import { @@ -17,6 +17,8 @@ import { NodeIKernelRobotService, NodeIKernelNodeMiscService } from './services' +import { CategoryFriend, SimpleInfo, UserDetailInfoByUin } from '@/ntqqapi/types' +import { selfInfo } from '@/common/globalVars' export enum NTClass { NT_API = 'ns-ntApi', @@ -108,13 +110,38 @@ interface InvokeOptions { timeout?: number } +let availableChannel: NTChannel | undefined = undefined; + +export async function checkChanelId(){ + async function testChannel(channel: NTChannel) { + await invoke( + 'nodeIKernelProfileService/getUserDetailInfoByUin', + [{ uin: selfInfo.uin }], + { timeout: 1000, channel } + ) + } + + for (const channel of [NTChannel.IPC_UP_2, NTChannel.IPC_UP_3]) { + // const channel = `IPC_UP_${windowId}` as NTChannel + try { + await testChannel(channel) + log(`check channel ${channel} success`) + availableChannel = channel + return + } catch (e) { + log(`check channel ${channel} failed`, e) + } + } + availableChannel = getBuildVersion() >= 28788 ? NTChannel.IPC_UP_3 : NTChannel.IPC_UP_2 +} export function invoke< R extends Awaited unknown>>>, S extends keyof NTService = any, M extends keyof NTService[S] & string = any >(method: Extract | string, args: unknown[], options: InvokeOptions = {}) { const className = options.className ?? NTClass.NT_API - const channel = options.channel ?? getBuildVersion() >= 28788 ? NTChannel.IPC_UP_3 : NTChannel.IPC_UP_2 + // const channel = options.channel ?? getBuildVersion() >= 28788 ? NTChannel.IPC_UP_3 : NTChannel.IPC_UP_2 + const channel = options.channel ?? availableChannel! const timeout = options.timeout ?? 5000 const afterFirstCmd = options.afterFirstCmd ?? true let eventName = className + '-' + channel[channel.length - 1] diff --git a/src/version.ts b/src/version.ts index 942a331..94bbc74 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = '4.1.3' +export const version = '4.1.4'