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
71 lines
2.4 KiB
TypeScript
71 lines
2.4 KiB
TypeScript
import * as crypto from 'crypto';
|
|
import { PushMsgBody } from '@/snowcat-core/packet/transformer/proto';
|
|
import { NapProtoEncodeStructType } from 'snowcat-protobuf';
|
|
import { PacketMsg, PacketSendMsgElement } from '@/snowcat-core/packet/message/message';
|
|
import { IPacketMsgElement, PacketMsgTextElement } from '@/snowcat-core/packet/message/element';
|
|
import { SendTextElement } from '@/snowcat-core/index';
|
|
|
|
export class PacketMsgBuilder {
|
|
protected static failBackText = new PacketMsgTextElement(
|
|
{
|
|
textElement: { content: '[该消息类型暂不支持查看]' },
|
|
} as SendTextElement
|
|
);
|
|
|
|
buildFakeMsg (selfUid: string, element: PacketMsg[]): NapProtoEncodeStructType<typeof PushMsgBody>[] {
|
|
return element.map((node): NapProtoEncodeStructType<typeof PushMsgBody> => {
|
|
const avatar = `https://q.qlogo.cn/headimg_dl?dst_uin=${node.senderUin}&spec=0&img_type=jpg`;
|
|
const msgContent = node.msg.reduceRight((acc: undefined | Uint8Array, msg: IPacketMsgElement<PacketSendMsgElement>) => {
|
|
return acc ?? msg.buildContent();
|
|
}, undefined);
|
|
const msgElement = node.msg.flatMap(msg => msg.buildElement() ?? []);
|
|
if (!msgContent && !msgElement.length) {
|
|
msgElement.push(PacketMsgBuilder.failBackText.buildElement());
|
|
}
|
|
return {
|
|
responseHead: {
|
|
fromUin: node.senderUin,
|
|
type: 0,
|
|
sigMap: 0,
|
|
toUin: 0,
|
|
fromUid: '',
|
|
forward: node.groupId
|
|
? undefined
|
|
: {
|
|
friendName: node.senderName,
|
|
},
|
|
toUid: node.groupId ? undefined : selfUid,
|
|
grp: node.groupId
|
|
? {
|
|
groupUin: node.groupId,
|
|
memberName: node.senderName,
|
|
unknown5: 2,
|
|
}
|
|
: undefined,
|
|
},
|
|
contentHead: {
|
|
type: node.groupId ? 82 : 9,
|
|
subType: node.groupId ? undefined : 4,
|
|
divSeq: node.groupId ? undefined : 4,
|
|
autoReply: 0,
|
|
sequence: crypto.randomBytes(4).readUInt32LE(0),
|
|
timeStamp: +node.time.toString().substring(0, 10),
|
|
forward: {
|
|
field1: 0,
|
|
field2: 0,
|
|
field3: node.groupId ? 1 : 2,
|
|
unknownBase64: avatar,
|
|
avatar,
|
|
},
|
|
},
|
|
body: {
|
|
richText: {
|
|
elems: msgElement,
|
|
},
|
|
msgContent,
|
|
},
|
|
};
|
|
});
|
|
}
|
|
}
|