From d43c6b10a39909df9ee88ee2a50c5442321dbdb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Thu, 22 Jan 2026 14:42:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8Dmac=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/napcat-core/helper/qq-basic-info.ts | 10 ++++++++- packages/napcat-core/index.ts | 23 +++++++++++--------- packages/napcat-shell/base.ts | 2 +- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/packages/napcat-core/helper/qq-basic-info.ts b/packages/napcat-core/helper/qq-basic-info.ts index d7f450c4..b9c2e3e4 100644 --- a/packages/napcat-core/helper/qq-basic-info.ts +++ b/packages/napcat-core/helper/qq-basic-info.ts @@ -5,6 +5,7 @@ import AppidTable from '@/napcat-core/external/appid.json'; import { LogWrapper } from './log'; import { getMajorPath } from '@/napcat-core/index'; import { QQAppidTableType, QQPackageInfoType, QQVersionConfigType } from 'napcat-common/src/types'; +import path from 'node:path'; export class QQBasicInfoWrapper { QQMainPath: string | undefined; @@ -21,6 +22,10 @@ export class QQBasicInfoWrapper { // 基础目录获取 this.context = context; this.QQMainPath = process.execPath; + if (process.platform === 'darwin' && path.basename(this.QQMainPath) === 'QQ Helper') { + // 实用进程特殊处理 实用进程目录和QQ差远了 + this.QQMainPath = path.resolve(path.dirname(this.QQMainPath), '../../../../', 'MacOS', 'QQ'); + } this.QQVersionConfigPath = getQQVersionConfigPath(this.QQMainPath); // 基础信息获取 无快更则启用默认模板填充 @@ -99,7 +104,10 @@ export class QQBasicInfoWrapper { } getAppidV2ByMajor (QQVersion: string) { - const majorPath = getMajorPath(QQVersion); + if (!this.QQMainPath) { + throw new Error('QQMainPath未定义 无法通过Major获取Appid'); + } + const majorPath = getMajorPath(QQVersion, this.QQMainPath); const appid = parseAppidFromMajor(majorPath); return appid; } diff --git a/packages/napcat-core/index.ts b/packages/napcat-core/index.ts index 02e046c8..b92e141d 100644 --- a/packages/napcat-core/index.ts +++ b/packages/napcat-core/index.ts @@ -44,20 +44,23 @@ export enum NapCatCoreWorkingEnv { Framework = 2, } -export function loadQQWrapper (QQVersion: string): WrapperNodeApi { +export function loadQQWrapper (execPath: string | undefined, QQVersion: string): WrapperNodeApi { if (process.env['NAPCAT_WRAPPER_PATH']) { const wrapperPath = process.env['NAPCAT_WRAPPER_PATH']; const nativemodule: { exports: WrapperNodeApi; } = { exports: {} as WrapperNodeApi }; process.dlopen(nativemodule, wrapperPath); return nativemodule.exports; } + if (!execPath) { + throw new Error('无法加载Wrapper,execPath未定义'); + } let appPath; if (os.platform() === 'darwin') { - appPath = path.resolve(path.dirname(process.execPath), '../Resources/app'); + appPath = path.resolve(path.dirname(execPath), '../Resources/app'); } else if (os.platform() === 'linux') { - appPath = path.resolve(path.dirname(process.execPath), './resources/app'); + appPath = path.resolve(path.dirname(execPath), './resources/app'); } else { - appPath = path.resolve(path.dirname(process.execPath), `./versions/${QQVersion}/`); + appPath = path.resolve(path.dirname(execPath), `./versions/${QQVersion}/`); } let wrapperNodePath = path.resolve(appPath, 'wrapper.node'); if (!fs.existsSync(wrapperNodePath)) { @@ -65,21 +68,21 @@ export function loadQQWrapper (QQVersion: string): WrapperNodeApi { } // 老版本兼容 未来去掉 if (!fs.existsSync(wrapperNodePath)) { - wrapperNodePath = path.join(path.dirname(process.execPath), `./resources/app/versions/${QQVersion}/wrapper.node`); + wrapperNodePath = path.join(path.dirname(execPath), `./resources/app/versions/${QQVersion}/wrapper.node`); } const nativemodule: { exports: WrapperNodeApi; } = { exports: {} as WrapperNodeApi }; process.dlopen(nativemodule, wrapperNodePath); return nativemodule.exports; } -export function getMajorPath (QQVersion: string): string { +export function getMajorPath (execPath: string, QQVersion: string): string { // major.node let appPath; if (os.platform() === 'darwin') { - appPath = path.resolve(path.dirname(process.execPath), '../Resources/app'); + appPath = path.resolve(path.dirname(execPath), '../Resources/app'); } else if (os.platform() === 'linux') { - appPath = path.resolve(path.dirname(process.execPath), './resources/app'); + appPath = path.resolve(path.dirname(execPath), './resources/app'); } else { - appPath = path.resolve(path.dirname(process.execPath), `./versions/${QQVersion}/`); + appPath = path.resolve(path.dirname(execPath), `./versions/${QQVersion}/`); } let majorPath = path.resolve(appPath, 'major.node'); if (!fs.existsSync(majorPath)) { @@ -87,7 +90,7 @@ export function getMajorPath (QQVersion: string): string { } // 老版本兼容 未来去掉 if (!fs.existsSync(majorPath)) { - majorPath = path.join(path.dirname(process.execPath), `./resources/app/versions/${QQVersion}/major.node`); + majorPath = path.join(path.dirname(execPath), `./resources/app/versions/${QQVersion}/major.node`); } return majorPath; } diff --git a/packages/napcat-shell/base.ts b/packages/napcat-shell/base.ts index 8b3b80cf..b192f6bc 100644 --- a/packages/napcat-shell/base.ts +++ b/packages/napcat-shell/base.ts @@ -347,7 +347,7 @@ export async function NCoreInitShell () { await connectToNamedPipe(logger).catch(e => logger.logError('命名管道连接失败', e)); } const basicInfoWrapper = new QQBasicInfoWrapper({ logger }); - const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVersion()); + const wrapper = loadQQWrapper(basicInfoWrapper.QQMainPath, basicInfoWrapper.getFullQQVersion()); const nativePacketHandler = new NativePacketHandler({ logger }); // 初始化 NativePacketHandler 用于后续使用 // nativePacketHandler.onAll((packet) => {