mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-01-03 08:39:04 +08:00
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();
|
|
},
|
|
};
|