UNPKG

wechaty-puppet-padplus

Version:
226 lines 9.17 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const wechaty_puppet_1 = require("wechaty-puppet"); const schemas_1 = require("../schemas"); const is_type_1 = require("./is-type"); const _1 = require("."); const message_file_name_1 = require("./message-file-name"); const message_recalled_payload_parser_1 = require("./message-recalled-payload-parser"); const message_source_parser_1 = require("./message-source-parser"); const message_type_1 = require("./message-type"); const config_1 = require("../config"); // import { xmlToJson } from './xml-to-json' const PRE = 'messageRawPayloadParser'; function messageRawPayloadParser(rawPayload) { return __awaiter(this, void 0, void 0, function* () { // console.log('messageRawPayloadParser:', rawPayload) /** * 0. Set Message Type */ const type = message_type_1.messageType(rawPayload.msgType); config_1.log.silly(PRE, `messageType ${type}`); const payloadBase = { id: rawPayload.msgId, timestamp: rawPayload.createTime / 1000, type, }; if (type === wechaty_puppet_1.MessageType.Image || type === wechaty_puppet_1.MessageType.Audio || type === wechaty_puppet_1.MessageType.Video || type === wechaty_puppet_1.MessageType.Attachment) { payloadBase.filename = message_file_name_1.messageFileName(rawPayload) || undefined; } if (type === wechaty_puppet_1.MessageType.Emoticon) { payloadBase.url = rawPayload.url; } let fromId; let roomId; let toId; let text; let mentionIdList; /** * 1. Set Room Id */ if (is_type_1.isRoomId(rawPayload.fromUserName)) { roomId = rawPayload.fromUserName; } else if (is_type_1.isRoomId(rawPayload.toUserName)) { roomId = rawPayload.toUserName; } else { roomId = undefined; } /** * 2. Set To Contact Id */ if (is_type_1.isContactId(rawPayload.toUserName)) { toId = rawPayload.toUserName; } else { // TODO: if the message @someone, the toId should set to the mentioned contact id(?) toId = undefined; } /** * 3. Set From Contact Id */ if (is_type_1.isContactId(rawPayload.fromUserName)) { fromId = rawPayload.fromUserName; } else { const parts = rawPayload.content.split(':\n'); if (parts && parts.length > 1) { if (is_type_1.isContactId(parts[0])) { fromId = parts[0]; } } else { fromId = undefined; } } /** * * 4. Set Text */ if (is_type_1.isRoomId(rawPayload.fromUserName)) { const startIndex = rawPayload.content.indexOf(':\n'); text = rawPayload.content.slice(startIndex !== -1 ? startIndex + 2 : 0); } else { text = rawPayload.content; } if (type === wechaty_puppet_1.MessageType.Recalled) { const recalledPayload = yield message_recalled_payload_parser_1.recalledPayloadParser(rawPayload); const pattern = [ /"(.+)" 撤回了一条消息/, /"(.+)" has recalled a message./, ]; const patternSelf = [ /你撤回了一条消息/, /You recalled a message/, ]; if (recalledPayload) { const isRecalled = pattern.some(regex => regex.test(recalledPayload.replaceMsg)); const isRecalledSelf = patternSelf.some(regex => regex.test(recalledPayload.replaceMsg)); if (isRecalled || isRecalledSelf) { text = recalledPayload.newMsgId; if (isRecalledSelf) { fromId = rawPayload.toUserName; if (is_type_1.isRoomId(rawPayload.fromUserName)) { roomId = rawPayload.fromUserName; } else if (is_type_1.isContactId(rawPayload.fromUserName)) { toId = rawPayload.fromUserName; } } } else { payloadBase.type = wechaty_puppet_1.MessageType.Unknown; } } else { payloadBase.type = wechaty_puppet_1.MessageType.Unknown; } } /** * 5.1 Validate Room & From ID */ if (!roomId && !fromId) { throw Error('empty roomId and empty fromId!'); } /** * 5.1 Validate Room & To ID */ if (!roomId && !toId) { throw Error('empty roomId and empty toId!'); } /** * 6. Set mention list, only for room messages */ if (roomId) { const messageSource = yield message_source_parser_1.messageSourceParser(rawPayload.msgSource); if (messageSource !== null && messageSource.atUserList) { mentionIdList = messageSource.atUserList; } } /** * 6. Set Contact for ShareCard */ /* if (type === MessageType.Contact) { const xml = await xmlToJson(rawPayload.content.split('\n')[1]) log.silly(PRE, `xml : ${JSON.stringify(xml)}`) const shareCardData = xml.msg.$ text = JSON.stringify(shareCardData) } */ let payload; // Two branch is the same code. // Only for making TypeScript happy if (fromId && toId) { payload = Object.assign(Object.assign({}, payloadBase), { fromId, mentionIdList, roomId, text, toId }); } else if (roomId) { payload = Object.assign(Object.assign({}, payloadBase), { fromId, mentionIdList, roomId, text, toId }); } else { throw new Error('neither toId nor roomId'); } /** * 6. Set app payload type */ if (type === wechaty_puppet_1.MessageType.Attachment) { const appPayload = yield _1.appMessageParser(rawPayload); if (appPayload) { switch (appPayload.type) { case schemas_1.WechatAppMessageType.Text: payload.type = wechaty_puppet_1.MessageType.Text; payload.text = appPayload.title; payload.filename = undefined; break; case schemas_1.WechatAppMessageType.Url: payload.type = wechaty_puppet_1.MessageType.Url; break; case schemas_1.WechatAppMessageType.Attach: payload.type = wechaty_puppet_1.MessageType.Attachment; payload.filename = appPayload.title; break; case schemas_1.WechatAppMessageType.ChatHistory: payload.type = wechaty_puppet_1.MessageType.ChatHistory; break; case schemas_1.WechatAppMessageType.MiniProgram: case schemas_1.WechatAppMessageType.MiniProgramApp: payload.type = wechaty_puppet_1.MessageType.MiniProgram; break; case schemas_1.WechatAppMessageType.RedEnvelopes: case schemas_1.WechatAppMessageType.Transfers: payload.type = wechaty_puppet_1.MessageType.Money; break; case schemas_1.WechatAppMessageType.RealtimeShareLocation: payload.type = wechaty_puppet_1.MessageType.Location; break; default: payload.type = wechaty_puppet_1.MessageType.Unknown; break; } } } return payload; }); } exports.messageRawPayloadParser = messageRawPayloadParser; //# sourceMappingURL=message-raw-payload-parser.js.map