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
94 lines
2.8 KiB
TypeScript
94 lines
2.8 KiB
TypeScript
import * as os from 'os';
|
||
import offset from '@/snowcat-core/external/napi2native.json';
|
||
import { InstanceContext, SnowCatCore } from '@/snowcat-core/index';
|
||
import { PacketClientSession } from '@/snowcat-core/packet/clientSession';
|
||
import { snowCatVersion } from 'snowcat-common/src/version';
|
||
import { LogWrapper } from '../helper/log';
|
||
|
||
interface OffsetType {
|
||
[key: string]: {
|
||
recv: string;
|
||
send: string;
|
||
};
|
||
}
|
||
|
||
const typedOffset: OffsetType = offset;
|
||
|
||
export class NTQQPacketApi {
|
||
context: InstanceContext;
|
||
core: SnowCatCore;
|
||
logger: LogWrapper;
|
||
qqVersion: string | undefined;
|
||
pkt!: PacketClientSession;
|
||
errStack: string[] = [];
|
||
packetStatus: boolean = false;
|
||
|
||
constructor (context: InstanceContext, core: SnowCatCore) {
|
||
this.context = context;
|
||
this.core = core;
|
||
this.logger = core.context.logger;
|
||
}
|
||
|
||
async initApi () {
|
||
this.packetStatus = (await this.InitSendPacket(this.context.basicInfoWrapper.getFullQQVersion())
|
||
.then((result) => {
|
||
return result;
|
||
})
|
||
.catch((err) => {
|
||
this.logger.logError(err);
|
||
this.pushError(err);
|
||
return false;
|
||
})) && this.pkt?.available;
|
||
}
|
||
|
||
get available (): boolean {
|
||
return this.pkt?.available ?? false;
|
||
}
|
||
|
||
get clientLogStack () {
|
||
return [this.pkt?.clientLogStack, ...this.errStack].filter(Boolean).join('\n');
|
||
}
|
||
|
||
private pushError (error: unknown) {
|
||
if (error instanceof Error) {
|
||
this.errStack.push(error.stack || error.message);
|
||
return;
|
||
}
|
||
this.errStack.push(String(error));
|
||
}
|
||
|
||
async InitSendPacket (qqVer: string) {
|
||
this.qqVersion = qqVer;
|
||
const table = typedOffset[qqVer + '-' + os.arch()];
|
||
if (!table) {
|
||
const err = `[Core] [Packet] PacketBackend 不支持当前QQ版本架构:${qqVer}-${os.arch()},
|
||
请参照 https://github.com/NapNeko/SnowCatQQ/releases/tag/v${snowCatVersion} 配置正确的QQ版本!`;
|
||
this.logger.logError(err);
|
||
this.errStack.push(err);
|
||
return false;
|
||
}
|
||
if (this.core.configLoader.configData.packetBackend === 'disable') {
|
||
const err = '[Core] [Packet] 已禁用PacketBackend,NapCat.Packet将不会加载!';
|
||
this.logger.logError(err);
|
||
this.errStack.push(err);
|
||
return false;
|
||
}
|
||
this.pkt = new PacketClientSession(this.core);
|
||
await this.pkt.init(process.pid, table.recv, table.send);
|
||
if (!this.pkt.available) {
|
||
const err = '[Core] [Packet] NativePacketClient 初始化失败,PacketBackend 发包能力不可用!';
|
||
this.logger.logError(err);
|
||
this.errStack.push(err);
|
||
return false;
|
||
}
|
||
try {
|
||
await this.pkt.operation.FetchRkey(3000);
|
||
} catch (error) {
|
||
this.logger.logError('测试Packet状态异常', error);
|
||
this.pushError(error);
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
}
|