UNPKG

wechaty-puppet-wechat4u

Version:
69 lines (57 loc) 2.26 kB
import type { MessageParser, MessageParserContext } from './message-parser.js' import type * as PUPPET from 'wechaty-puppet' import { parseSysmsgMessagePayload } from '../../messages/message-sysmsg.js' import type { PatMessagePayload } from '../../messages/sysmsg/message-pat.js' import type { TodoMessagePayload } from '../../messages/sysmsg/message-todo.js' import type { RevokeMsgMessagePayload } from '../../messages/sysmsg/message-revokemsg.js' import type { WebMessageRawPayload } from '../../../web-schemas' /** * try to parse talker and listenerId from sysmsg for room messages * @param padLocalMessage * @param ret * @param context */ export const sysmsgParser: MessageParser = async (webMessageRawPayload: WebMessageRawPayload, ret: PUPPET.payloads.Message, context: MessageParserContext) => { const sysmsgPayload = await parseSysmsgMessagePayload(webMessageRawPayload) if (!sysmsgPayload) { return ret } switch (sysmsgPayload.type) { case 'pat': { const patMessagePayload: PatMessagePayload = sysmsgPayload.payload as PatMessagePayload if (context.isRoomMessage) { ret.talkerId = patMessagePayload.pattedUserName ret.listenerId = patMessagePayload.fromUserName } break } case 'roomtoolstips': { const todoMessagePayload: TodoMessagePayload = sysmsgPayload.payload as TodoMessagePayload if (context.isRoomMessage) { ret.talkerId = todoMessagePayload.operatorUserName } break } case 'revokemsg': { const revokeMsgPayload: RevokeMsgMessagePayload = sysmsgPayload.payload as RevokeMsgMessagePayload if (context.isRoomMessage) { // Generic room message logic can get the right talkerId for revoke message } else { // Fix talkerId for single chat revoke message that sent by you // talkerId and listenerId for revoke message sent by others is right already if (revokeMsgPayload.type === 'You') { ret.listenerId = ret.talkerId ret.talkerId = context.puppet.currentUserId } } break } case 'roomtips': { if (context.isRoomMessage) { ret.talkerId = webMessageRawPayload.FromUserName } break } } return ret }