SnowCat 雪猫底层全源码:NapCat 4.18.28 底座 + SnowLuma 能力移植 + V8 通道适配 9.9.37
26 包 monorepo(TS 全源码): - snowcat-core: NT 内核 API 封装 + listener(含 9.9.37 六回调适配)+ Packet 发包 - snowcat-onebot: OneBot v11 全动作 + MCP Streamable HTTP 适配器 + 稳定线 - snowcat-webui-frontend/backend: 雪猫控制台(React+HeroUI) - snowcat-shell: 单文件 bundle 出口(vite inlineDynamicImports) - snowcat-native: napi2native / MoeHoo / ffmpeg / pty 运行时 - 56 项 SnowLuma 独门动作移植(qzone 全家桶/群相册/装扮/闪照/收藏) - 工具件: 解包器/启动器/便携制作器/doctor GitHub 关联已全量指向 DandanLLab/SnowCatQQ
This commit is contained in:
commit
b9655a5ab1
1048 files changed
+130851
No files matched your search
@@ -0,0 +1,92 @@
|
||||
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();
|
||||
},
|
||||
};
|
||||
Reference in new issue
Block a user