chore: 针对的并非框架

This commit is contained in:
手瓜一十雪
2024-08-10 17:45:17 +08:00
parent 80d2218aa6
commit 6371d79d33
9 changed files with 18 additions and 12 deletions

134
src/framework/napcat.cjs Normal file
View File

@@ -0,0 +1,134 @@
// https://github.com/NapNeko/LiteLoader-NapCatExample/blob/main/src/common/proxy.ts
// By Mlikiowa
const process = require('process');
const os = require('os');
const path = require('path');
const currentPath = path.dirname(__filename);
const dlopenOrig = process.dlopen;
let wrapperSession;
let wrapperNodeApi;
let wrapperLoginService;
let initCallBack;
// Proxy dlopen
process.dlopen = (module, filename, flags = os.constants.dlopen.RTLD_LAZY) => {
dlopenOrig(module, filename, flags);
for (const export_name in module.exports) {
module.exports[export_name] = new Proxy(module.exports[export_name], {
construct: (target, args, _newTarget) => {
let constructed;
if (export_name === 'NodeIKernelSessionListener') {
let HookedArg = [];
for (let ArgIndex in args) {
if (args[ArgIndex] instanceof Object) {
let HookArg = {};
for (let ListenerName in args[ArgIndex]) {
HookArg[ListenerName] = function (...ListenerData) {
try {
if (ListenerName === "onSessionInitComplete") {
//回调成功
initCallBack.forEach((cb) => cb(...ListenerData));
clearHook();
}
//console.log("Construct-ARG-Apply", ListenerName, JSON.stringify(ListenerData, null, 2));
} catch (error) {
// ignored
}
args[ArgIndex][ListenerName](...ListenerData);
};
HookedArg.push(HookArg);
}
} else {
// 其它类型
//console.log("Construct-ARG-NotProxy", args[keyArg]);
}
}
constructed = new target(...HookedArg);
} else {
constructed = new target(...args);
}
if (export_name === 'NodeIQQNTWrapperSession') wrapperSession = constructed;
if (export_name === 'NodeIKernelLoginService') wrapperLoginService = constructed;
return constructed;
},
});
}
if (filename.toLowerCase().includes('wrapper.node')) {
wrapperNodeApi = module.exports;
}
};
/**
* 清理 Hook
*/
function clearHook() {
initCallBack = [];
process.dlopen = dlopenOrig;
}
function ntIsInitialized_Internal() {
return wrapperSession !== undefined
&& wrapperNodeApi !== undefined
&& wrapperLoginService !== undefined;
}
function pollForNTInitializationCheck() {
return new Promise((resolve, reject) => {
let isSolve = false;
const intervalRef = setInterval(() => {
if (isSolve) return;
try {
if (ntIsInitialized_Internal()) {
isSolve = true;
resolve(true);
}
} catch (error) {
reject(error);
} finally {
clearInterval(intervalRef);
}
}, 500);
});
}
function registerInitCallback(callback) {
if (initCallBack === undefined) {
initCallBack = [];
}
initCallBack.push(callback);
}
async function fetchServices(timeout = 10000) {
return Promise.race([
pollForNTInitializationCheck(),
new Promise((resolve) => {
setTimeout(() => resolve(false), timeout);
})
]).then(result => result ?
{ wrapperSession, wrapperNodeApi, wrapperLoginService } :
Promise.reject()
);
}
async function NCInit() {
console.log("[NapCat] [Info] 开始初始化NapCat");
try {
const { wrapperSession, wrapperLoginService } = await fetchServices();
const { NCoreInitLiteLoader } = await import('file://' + path.join(currentPath, './napcat.mjs'));
//传入LoginService Session 其余自载入
await NCoreInitLiteLoader(wrapperSession, wrapperLoginService, registerInitCallback);
//console.log("[NapCat] [Info] NapCat初始化完成");
} catch (error) {
console.error("[NapCat] [Error] 初始化NapCat失败", error);
}
}
NCInit();

78
src/framework/napcat.ts Normal file
View File

@@ -0,0 +1,78 @@
import { NapCatPathWrapper } from "@/common/framework/napcat";
import { LogWrapper } from "@/common/utils/log";
import { proxiedListenerOf } from "@/common/utils/proxy-handler";
import { QQBasicInfoWrapper } from "@/common/utils/QQBasicInfo";
import { NapCatCore, NapCatCoreWorkingEnv, loadQQWrapper } from "@/core/core";
import { InstanceContext } from "@/core";
import { SelfInfo } from "@/core/entities";
import { LoginListener } from "@/core/listeners";
import { NodeIKernelLoginService } from "@/core/services";
import { WrapperNodeApi, NodeIQQNTWrapperSession } from "@/core/wrapper/wrapper";
import { NapCatOneBot11Adapter } from "@/onebot/main";
import { sleep } from "@/common/utils/helper";
//LiteLoader ES入口文件
export async function NCoreInitLiteLoader(
session: NodeIQQNTWrapperSession,
loginService: NodeIKernelLoginService,
registerInitCallback: (callback: () => void) => void
) {
//在进入本层前是否登录未进行判断
console.log("NapCat LiteLoader App Loading...");
const pathWrapper = new NapCatPathWrapper();
const logger = new LogWrapper(pathWrapper.logsPath);
const basicInfoWrapper = new QQBasicInfoWrapper({ logger });
const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVesion());
//直到登录成功后,执行下一步
const selfInfo = await new Promise<SelfInfo>((resolveSelfInfo) => {
const loginListener = new LoginListener();
loginListener.onQRCodeLoginSucceed = async (loginResult) => {
await new Promise<void>(resolvePendingInit => {
registerInitCallback(() => resolvePendingInit());
});
resolveSelfInfo({
uid: loginResult.uid,
uin: loginResult.uin,
nick: '', // 获取不到
online: true,
});
};
loginService.addKernelLoginListener(new wrapper.NodeIKernelLoginListener(
proxiedListenerOf(loginListener, logger)));
});
// 过早进入会导致addKernelMsgListener等Listener添加失败
// await sleep(2500);
// 初始化 NapCatLiteLoader
const loaderObject = new NapCatLiteLoader(wrapper, session, logger, loginService, selfInfo, basicInfoWrapper, pathWrapper);
//启动WebUi
//初始化LLNC的Onebot实现
new NapCatOneBot11Adapter(loaderObject.core, loaderObject.context, pathWrapper);
}
export class NapCatLiteLoader {
public core: NapCatCore;
context: InstanceContext;
constructor(
wrapper: WrapperNodeApi,
session: NodeIQQNTWrapperSession,
logger: LogWrapper,
loginService: NodeIKernelLoginService,
selfInfo: SelfInfo,
basicInfoWrapper: QQBasicInfoWrapper,
pathWrapper: NapCatPathWrapper
) {
this.context = {
workingEnv: NapCatCoreWorkingEnv.LiteLoader,
wrapper,
session,
logger,
loginService,
basicInfoWrapper,
pathWrapper
};
this.core = new NapCatCore(this.context, selfInfo);
}
}

View File

View File

@@ -0,0 +1,2 @@
export const onSettingWindowCreated = (view) => {
};