mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2024-11-21 09:36:35 +00:00
161 lines
5.1 KiB
TypeScript
161 lines
5.1 KiB
TypeScript
import type { SelfInfo } from '@/core/entities';
|
|
|
|
import { LogWrapper } from '@/common/utils/log';
|
|
import { LoginListener, SessionListener } from '@/core/listeners';
|
|
import { DependsAdapter, DispatcherAdapter, GlobalAdapter } from '@/core/adapters';
|
|
import { NapCatPathWrapper } from '@/common/framework/napcat';
|
|
import {
|
|
NapCatCoreWorkingEnv,
|
|
loadQQWrapper,
|
|
NapCatCore,
|
|
InstanceContext,
|
|
WrapperNodeApi,
|
|
NodeIQQNTWrapperSession
|
|
} from '@/core';
|
|
import { QQBasicInfoWrapper } from '@/common/utils/QQBasicInfo';
|
|
import { hostname, systemVersion } from '@/common/utils/system';
|
|
import { genSessionConfig } from '@/core/wrapper/helper';
|
|
import { proxiedListenerOf } from '@/common/utils/proxy-handler';
|
|
|
|
import path from 'path';
|
|
import fs from 'fs';
|
|
import os from 'os';
|
|
import { NodeIKernelLoginService } from '@/core/services';
|
|
import { NapCatOneBot11Adapter } from '@/onebot';
|
|
|
|
// NapCat Shell App ES 入口文件
|
|
export async function NCoreInitShell() {
|
|
console.log('NapCat Shell App Loading...');
|
|
|
|
const pathWrapper = new NapCatPathWrapper();
|
|
const logger = new LogWrapper(pathWrapper.logsPath);
|
|
const basicInfoWrapper = new QQBasicInfoWrapper({ logger });
|
|
const wrapper = loadQQWrapper(basicInfoWrapper.getFullQQVesion());
|
|
|
|
// from constructor
|
|
const engine = new wrapper.NodeIQQNTWrapperEngine();
|
|
const util = new wrapper.NodeQQNTWrapperUtil();
|
|
const loginService = new wrapper.NodeIKernelLoginService();
|
|
const session = new wrapper.NodeIQQNTWrapperSession();
|
|
|
|
// from get dataPath
|
|
let dataPath = util.getNTUserDataInfoConfig();
|
|
if (!dataPath) {
|
|
dataPath = path.resolve(os.homedir(), './.config/QQ');
|
|
fs.mkdirSync(dataPath, { recursive: true });
|
|
}
|
|
const dataPathGlobal = path.resolve(dataPath, './nt_qq/global');
|
|
|
|
// from initConfig
|
|
engine.initWithDeskTopConfig(
|
|
{
|
|
base_path_prefix: '',
|
|
platform_type: 3,
|
|
app_type: 4,
|
|
app_version: basicInfoWrapper.getFullQQVesion(),
|
|
os_version: 'Windows 10 Pro',
|
|
use_xlog: true,
|
|
qua: basicInfoWrapper.QQVersionQua!,
|
|
global_path_config: {
|
|
desktopGlobalPath: dataPathGlobal,
|
|
},
|
|
thumb_config: { maxSide: 324, minSide: 48, longLimit: 6, density: 2 }
|
|
},
|
|
new wrapper.NodeIGlobalAdapter(new GlobalAdapter())
|
|
);
|
|
loginService.initConfig({
|
|
machineId: '',
|
|
appid: basicInfoWrapper.QQVersionAppid!,
|
|
platVer: systemVersion,
|
|
commonPath: dataPathGlobal,
|
|
clientVer: basicInfoWrapper.getFullQQVesion(),
|
|
hostName: hostname
|
|
});
|
|
|
|
const selfInfo = await new Promise<SelfInfo>((resolve) => {
|
|
const loginListener = new LoginListener();
|
|
|
|
// from constructor
|
|
loginListener.onUserLoggedIn = (userid: string) => {
|
|
logger.logError(`当前账号(${userid})已登录,无法重复登录`);
|
|
};
|
|
|
|
loginListener.onQRCodeLoginSucceed = async (loginResult) => resolve({
|
|
uid: loginResult.uid,
|
|
uin: loginResult.uin,
|
|
nick: '', // 获取不到
|
|
online: true
|
|
});
|
|
loginService.addKernelLoginListener(new wrapper.NodeIKernelLoginListener(
|
|
proxiedListenerOf(loginListener, logger)));
|
|
});
|
|
|
|
// from initSession
|
|
const sessionConfig = await genSessionConfig(
|
|
basicInfoWrapper.QQVersionAppid!,
|
|
basicInfoWrapper.getFullQQVesion(),
|
|
selfInfo.uin,
|
|
selfInfo.uid,
|
|
dataPath
|
|
);
|
|
const sessionListener = new SessionListener();
|
|
sessionListener.onSessionInitComplete = (r: unknown) => {
|
|
if (r !== 0) {
|
|
throw r;
|
|
}
|
|
};
|
|
session.init(
|
|
sessionConfig,
|
|
new wrapper.NodeIDependsAdapter(new DependsAdapter()),
|
|
new wrapper.NodeIDispatcherAdapter(new DispatcherAdapter()),
|
|
new wrapper.NodeIKernelSessionListener(sessionListener)
|
|
);
|
|
try {
|
|
session.startNT(0);
|
|
} catch (__) {
|
|
session.startNT(); // may still throw error; we do not catch that
|
|
}
|
|
// Initialization end!
|
|
|
|
const accountDataPath = path.resolve(dataPath, './NapCat/data');
|
|
fs.mkdirSync(dataPath, { recursive: true });
|
|
logger.logDebug('本账号数据/缓存目录:', accountDataPath);
|
|
|
|
new NapCatShell(
|
|
wrapper,
|
|
session,
|
|
logger,
|
|
loginService,
|
|
selfInfo,
|
|
basicInfoWrapper
|
|
);
|
|
}
|
|
|
|
export class NapCatShell {
|
|
readonly core: NapCatCore;
|
|
readonly context: InstanceContext;
|
|
|
|
constructor(
|
|
wrapper: WrapperNodeApi,
|
|
session: NodeIQQNTWrapperSession,
|
|
logger: LogWrapper,
|
|
loginService: NodeIKernelLoginService,
|
|
selfInfo: SelfInfo,
|
|
basicInfoWrapper: QQBasicInfoWrapper,
|
|
) {
|
|
this.context = {
|
|
workingEnv: NapCatCoreWorkingEnv.Shell,
|
|
wrapper,
|
|
session,
|
|
logger,
|
|
loginService,
|
|
basicInfoWrapper
|
|
};
|
|
this.core = new NapCatCore(this.context, selfInfo);
|
|
|
|
new NapCatOneBot11Adapter(this.core, this.context);
|
|
}
|
|
}
|
|
|
|
NCoreInitShell();
|