import * as crypto from 'node:crypto'; import { PacketMsg } from '@/napcat-core/packet/message/message'; interface ForwardMsgJson { app: string config: ForwardMsgJsonConfig, desc: string, extra: ForwardMsgJsonExtra, meta: ForwardMsgJsonMeta, prompt: string, ver: string, view: string } interface ForwardMsgJsonConfig { autosize: number, forward: number, round: number, type: string, width: number } interface ForwardMsgJsonExtra { filename: string, tsum: number, } interface ForwardMsgJsonMeta { detail: ForwardMsgJsonMetaDetail } interface ForwardMsgJsonMetaDetail { news: { text: string }[], resid: string, source: string, summary: string, uniseq: string } interface ForwardAdaptMsg { senderName?: string; isGroupMsg?: boolean; msg?: ForwardAdaptMsgElement[]; } interface ForwardAdaptMsgElement { preview?: string; } export class ForwardMsgBuilder { private static build (resId: string, msg: ForwardAdaptMsg[], source?: string, news?: ForwardMsgJsonMetaDetail['news'], summary?: string, prompt?: string): ForwardMsgJson { const id = crypto.randomUUID(); const isGroupMsg = msg.some(m => m.isGroupMsg); if (!source) { source = msg.length === 0 ? '聊天记录' : (isGroupMsg ? '群聊的聊天记录' : msg.map(m => m.senderName).filter((v, i, a) => a.indexOf(v) === i).slice(0, 4).join('和') + '的聊天记录'); } if (!news) { news = msg.length === 0 ? [{ text: 'Nya~ This message is send from NapCat.Packet!', }] : msg.map(m => ({ text: `${m.senderName}: ${m.msg?.map(msg => msg.preview).join('')}`, })); } if (!summary) { summary = `查看${msg.length}条转发消息`; } if (!prompt) { prompt = '[聊天记录]'; } return { app: 'com.tencent.multimsg', config: { autosize: 1, forward: 1, round: 1, type: 'normal', width: 300, }, desc: prompt, extra: { filename: id, tsum: msg.length, }, meta: { detail: { news, resid: resId, source, summary, uniseq: id, }, }, prompt, ver: '0.0.0.5', view: 'contact', }; } static fromResId (resId: string): ForwardMsgJson { return this.build(resId, []); } static fromPacketMsg (resId: string, packetMsg: PacketMsg[], source?: string, news?: ForwardMsgJsonMetaDetail['news'], summary?: string, prompt?: string): ForwardMsgJson { return this.build(resId, packetMsg.map(msg => ({ senderName: msg.senderName, isGroupMsg: msg.groupId !== undefined, msg: msg.msg.map(m => ({ preview: m.valid ? m.toPreview() : '[该消息类型暂不支持查看]', })), })), source, news, summary, prompt); } }