mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-12-19 13:10:16 +08:00
* feat: pnpm new * Refactor build and release workflows, update dependencies Switch build scripts and workflows from npm to pnpm, update build and artifact paths, and simplify release workflow by removing version detection and changelog steps. Add new dependencies (silk-wasm, express, ws, node-pty-prebuilt-multiarch), update exports in package.json files, and add vite config for napcat-framework. Also, rename manifest.json for framework package and fix static asset copying in shell build config.
93 lines
2.9 KiB
JavaScript
93 lines
2.9 KiB
JavaScript
const process = require('process');
|
|
const os = require('os');
|
|
const path = require('path');
|
|
|
|
// 保存原始dlopen
|
|
const dlopenOrig = process.dlopen;
|
|
|
|
let wrapperSession;
|
|
let wrapperNodeApi;
|
|
let wrapperLoginService;
|
|
let getWebUiUrlFunc;
|
|
let ncCallback = () => { };
|
|
let napCatInitialized = false; // 添加一个标志
|
|
|
|
function createServiceProxy (ServiceName) {
|
|
return new Proxy(() => { }, {
|
|
get: (target, FunctionName) => {
|
|
if (ServiceName === 'NodeIQQNTWrapperSession' && FunctionName === 'create') {
|
|
return () => new Proxy({}, {
|
|
get: function (target, ClassFunName, receiver) {
|
|
return function () {
|
|
if (ClassFunName === 'init') {
|
|
const origin = arguments[3].onOpentelemetryInit;
|
|
arguments[3].onOpentelemetryInit = function (result) {
|
|
origin(...arguments);
|
|
if (result.is_init) {
|
|
ncCallback();
|
|
}
|
|
};
|
|
}
|
|
const ret = wrapperSession[ClassFunName](...arguments);
|
|
return ret;
|
|
};
|
|
},
|
|
});
|
|
}
|
|
if (ServiceName === 'NodeIKernelLoginService' && FunctionName === 'get') {
|
|
return () => wrapperLoginService;
|
|
}
|
|
return wrapperNodeApi[ServiceName][FunctionName];
|
|
},
|
|
});
|
|
}
|
|
|
|
function clearHook () {
|
|
process.dlopen = dlopenOrig;
|
|
}
|
|
|
|
async function initializeNapCat () {
|
|
console.log('[NapCat] [Info] 开始初始化NapCat');
|
|
try {
|
|
const currentPath = path.dirname(__filename);
|
|
const { NCoreInitFramework, getWebUiUrl } = await import('file://' + path.join(currentPath, './napcat.mjs'));
|
|
getWebUiUrlFunc = getWebUiUrl;
|
|
await NCoreInitFramework(wrapperSession, wrapperLoginService, (callback) => { ncCallback = callback; });
|
|
} catch (error) {
|
|
console.log('[NapCat] [Error] 初始化NapCat', error);
|
|
}
|
|
}
|
|
|
|
process.dlopen = function (module, filename, flags = os.constants.dlopen.RTLD_LAZY) {
|
|
const dlopenRet = dlopenOrig(module, filename, flags);
|
|
if (!filename.includes('wrapper.node') || napCatInitialized) return dlopenRet;
|
|
napCatInitialized = true; // 初始化完成后设置标志
|
|
clearHook();
|
|
wrapperNodeApi = module.exports;
|
|
wrapperLoginService = wrapperNodeApi.NodeIKernelLoginService.get();
|
|
wrapperSession = wrapperNodeApi.NodeIQQNTWrapperSession.create();
|
|
|
|
initializeNapCat().then().catch();
|
|
|
|
module.exports = new Proxy({}, {
|
|
get: (target, ServiceName) => {
|
|
if (ServiceName === 'NodeIKernelLoginService' || ServiceName === 'NodeIQQNTWrapperSession') {
|
|
return createServiceProxy(ServiceName);
|
|
}
|
|
return wrapperNodeApi[ServiceName];
|
|
},
|
|
});
|
|
|
|
return dlopenRet;
|
|
};
|
|
|
|
module.exports = {
|
|
NCgetWebUiUrl: async () => {
|
|
if (!getWebUiUrlFunc) {
|
|
console.log('[NapCat] [Error] 未初始化完成');
|
|
return '';
|
|
}
|
|
return await getWebUiUrlFunc();
|
|
},
|
|
};
|