feat: 修复mac问题

This commit is contained in:
手瓜一十雪 2026-01-22 14:42:42 +08:00
parent 857be5ee49
commit d43c6b10a3
3 changed files with 23 additions and 12 deletions

View File

@ -5,6 +5,7 @@ import AppidTable from '@/napcat-core/external/appid.json';
import { LogWrapper } from './log'; import { LogWrapper } from './log';
import { getMajorPath } from '@/napcat-core/index'; import { getMajorPath } from '@/napcat-core/index';
import { QQAppidTableType, QQPackageInfoType, QQVersionConfigType } from 'napcat-common/src/types'; import { QQAppidTableType, QQPackageInfoType, QQVersionConfigType } from 'napcat-common/src/types';
import path from 'node:path';
export class QQBasicInfoWrapper { export class QQBasicInfoWrapper {
QQMainPath: string | undefined; QQMainPath: string | undefined;
@ -21,6 +22,10 @@ export class QQBasicInfoWrapper {
// 基础目录获取 // 基础目录获取
this.context = context; this.context = context;
this.QQMainPath = process.execPath; 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); this.QQVersionConfigPath = getQQVersionConfigPath(this.QQMainPath);
// 基础信息获取 无快更则启用默认模板填充 // 基础信息获取 无快更则启用默认模板填充
@ -99,7 +104,10 @@ export class QQBasicInfoWrapper {
} }
getAppidV2ByMajor (QQVersion: string) { 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); const appid = parseAppidFromMajor(majorPath);
return appid; return appid;
} }

View File

@ -44,20 +44,23 @@ export enum NapCatCoreWorkingEnv {
Framework = 2, Framework = 2,
} }
export function loadQQWrapper (QQVersion: string): WrapperNodeApi { export function loadQQWrapper (execPath: string | undefined, QQVersion: string): WrapperNodeApi {
if (process.env['NAPCAT_WRAPPER_PATH']) { if (process.env['NAPCAT_WRAPPER_PATH']) {
const wrapperPath = process.env['NAPCAT_WRAPPER_PATH']; const wrapperPath = process.env['NAPCAT_WRAPPER_PATH'];
const nativemodule: { exports: WrapperNodeApi; } = { exports: {} as WrapperNodeApi }; const nativemodule: { exports: WrapperNodeApi; } = { exports: {} as WrapperNodeApi };
process.dlopen(nativemodule, wrapperPath); process.dlopen(nativemodule, wrapperPath);
return nativemodule.exports; return nativemodule.exports;
} }
if (!execPath) {
throw new Error('无法加载WrapperexecPath未定义');
}
let appPath; let appPath;
if (os.platform() === 'darwin') { 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') { } else if (os.platform() === 'linux') {
appPath = path.resolve(path.dirname(process.execPath), './resources/app'); appPath = path.resolve(path.dirname(execPath), './resources/app');
} else { } 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'); let wrapperNodePath = path.resolve(appPath, 'wrapper.node');
if (!fs.existsSync(wrapperNodePath)) { if (!fs.existsSync(wrapperNodePath)) {
@ -65,21 +68,21 @@ export function loadQQWrapper (QQVersion: string): WrapperNodeApi {
} }
// 老版本兼容 未来去掉 // 老版本兼容 未来去掉
if (!fs.existsSync(wrapperNodePath)) { 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 }; const nativemodule: { exports: WrapperNodeApi; } = { exports: {} as WrapperNodeApi };
process.dlopen(nativemodule, wrapperNodePath); process.dlopen(nativemodule, wrapperNodePath);
return nativemodule.exports; return nativemodule.exports;
} }
export function getMajorPath (QQVersion: string): string { export function getMajorPath (execPath: string, QQVersion: string): string {
// major.node // major.node
let appPath; let appPath;
if (os.platform() === 'darwin') { 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') { } else if (os.platform() === 'linux') {
appPath = path.resolve(path.dirname(process.execPath), './resources/app'); appPath = path.resolve(path.dirname(execPath), './resources/app');
} else { } 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'); let majorPath = path.resolve(appPath, 'major.node');
if (!fs.existsSync(majorPath)) { if (!fs.existsSync(majorPath)) {
@ -87,7 +90,7 @@ export function getMajorPath (QQVersion: string): string {
} }
// 老版本兼容 未来去掉 // 老版本兼容 未来去掉
if (!fs.existsSync(majorPath)) { 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; return majorPath;
} }

View File

@ -347,7 +347,7 @@ export async function NCoreInitShell () {
await connectToNamedPipe(logger).catch(e => logger.logError('命名管道连接失败', e)); await connectToNamedPipe(logger).catch(e => logger.logError('命名管道连接失败', e));
} }
const basicInfoWrapper = new QQBasicInfoWrapper({ logger }); const basicInfoWrapper = new QQBasicInfoWrapper({ logger });
const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVersion()); const wrapper = loadQQWrapper(basicInfoWrapper.QQMainPath, basicInfoWrapper.getFullQQVersion());
const nativePacketHandler = new NativePacketHandler({ logger }); // 初始化 NativePacketHandler 用于后续使用 const nativePacketHandler = new NativePacketHandler({ logger }); // 初始化 NativePacketHandler 用于后续使用
// nativePacketHandler.onAll((packet) => { // nativePacketHandler.onAll((packet) => {