/* eslint-disable @typescript-eslint/no-unnecessary-condition */ import { xmlToJson } from '../utils/xml-to-json.js' interface AppMsgXmlSchema { msg: { appmsg: { title: string; des: string; type: string; url: string; appattach: { totallen: string; attachid: string; emoticonmd5: string; fileext: string; cdnattachurl: string; cdnthumbaeskey: string; aeskey: string; encryver: string; islargefilemsg: string; }; thumburl: string; md5: any; recorditem?: string; weappinfo?: { username: string; appid: string; pagepath: string; weappiconurl: string; shareId: string; }; refermsg?: { type: string; svrid: string; fromusr: string; chatusr: string; displayname: string; content: string; }; finderFeed?: { objectId: string; feedType: string; nickname: string; avatar: string; desc: string; mediaCount: string; objectNonceId: string; liveId: string; username: string; authIconUrl: string; authIconType: string; mediaList?: { media?: { thumbUrl: string, fullCoverUrl: string, videoPlayDuration: string, url: string, height: string, mediaType: string, width: string } }, megaVideo?: {}, bizAuthIconType: string } }; fromusername: string; appinfo: { appname: any; }; }; } export enum AppMessageType { Text = 1, Img = 2, Audio = 3, Video = 4, Url = 5, Attach = 6, Open = 7, Emoji = 8, VoiceRemind = 9, ScanGood = 10, Good = 13, Emotion = 15, CardTicket = 16, RealtimeShareLocation = 17, ChatHistory = 19, MiniProgram = 33, MiniProgramApp = 36, // this is forwardable mini program Channels = 51, // 视频号 GroupNote = 53, ReferMsg = 57, Transfers = 2000, RedEnvelopes = 2001, ReaderType = 100001, } export interface AppAttachPayload { totallen?: number; attachid?: string; emoticonmd5?: string; fileext?: string; cdnattachurl?: string; aeskey?: string; cdnthumbaeskey?: string; encryver?: number; islargefilemsg: number; } export interface ReferMsgPayload { type: string; svrid: string; fromusr: string; chatusr: string; displayname: string; content: string; } export interface ChannelsMsgPayload { objectId: string; feedType: string; nickname: string; avatar: string; desc: string; mediaCount: string; objectNonceId: string; liveId: string; username: string; authIconUrl: string; authIconType: string; mediaList?: { media?: { thumbUrl: string, fullCoverUrl: string, videoPlayDuration: string, url: string, height: string, mediaType: string, width: string } }, megaVideo?: {}, bizAuthIconType?: string } export interface MiniAppMsgPayload { username: string; appid: string; pagepath: string; weappiconurl: string; shareId: string; } export interface AppMessagePayload { des?: string; thumburl?: string; title: string; url: string; appattach?: AppAttachPayload; channel?: ChannelsMsgPayload; miniApp?: MiniAppMsgPayload; type: AppMessageType; md5?: string; fromusername?: string; recorditem?: string; refermsg?: ReferMsgPayload; } export async function parseAppmsgMessagePayload (messageContent: string): Promise { const appMsgXml: AppMsgXmlSchema = await xmlToJson(messageContent) const { title, des, url, thumburl, type, md5, recorditem } = appMsgXml.msg.appmsg let appattach: AppAttachPayload | undefined let channel: ChannelsMsgPayload | undefined let miniApp: MiniAppMsgPayload | undefined const tmp = appMsgXml.msg.appmsg.appattach const channeltmp = appMsgXml.msg.appmsg.finderFeed const minitmp = appMsgXml.msg.appmsg.weappinfo if (tmp) { appattach = { aeskey: tmp.aeskey, attachid: tmp.attachid, cdnattachurl: tmp.cdnattachurl, cdnthumbaeskey: tmp.cdnthumbaeskey, emoticonmd5: tmp.emoticonmd5, encryver: (tmp.encryver && parseInt(tmp.encryver, 10)) || 0, fileext: tmp.fileext, islargefilemsg: (tmp.islargefilemsg && parseInt(tmp.islargefilemsg, 10)) || 0, totallen: (tmp.totallen && parseInt(tmp.totallen, 10)) || 0, } } if (channeltmp) { channel = { authIconType: channeltmp.authIconType, authIconUrl: channeltmp.authIconUrl, avatar: channeltmp.avatar, desc: channeltmp.desc, feedType: channeltmp.feedType, liveId: channeltmp.liveId, mediaCount: channeltmp.mediaCount, nickname: channeltmp.nickname, objectId: channeltmp.objectId, objectNonceId: channeltmp.objectNonceId, username: channeltmp.username, } } if (minitmp) { miniApp = { appid: minitmp.appid, pagepath: minitmp.pagepath, shareId: minitmp.shareId, username: minitmp.username, weappiconurl: minitmp.weappiconurl, } } return { appattach, channel, des, md5, miniApp, recorditem, refermsg: appMsgXml.msg.appmsg.refermsg, thumburl, title, type: parseInt(type, 10), url, } }