wechaty-puppet-padplus
Version:
Puppet Padplus for Wechaty
226 lines • 9.17 kB
JavaScript
;
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