UNPKG

@juzi/wechaty

Version:

Wechaty is a RPA SDK for Chatbot Makers.

157 lines (148 loc) 3.96 kB
import type * as PUPPET from '@juzi/wechaty-puppet' import { FileBox } from 'file-box' import { ContactImpl, MessageImpl, DelayImpl, UrlLinkImpl, MiniProgramImpl, PostImpl, LocationImpl, ChannelImpl, ChannelCardImpl, PremiumOnlineAppointmentCardImpl, ConsultCardImpl, DouyinOneClickPhoneCollectionImpl, WxxdProductImpl, WxxdOrderImpl, } from '../user-modules/mod.js' import type { Sayable, SayOptionsObject } from './types.js' /** * TODO: add unit test to ensure the interface validation code works */ const deliverSayableConversationPuppet = (puppet: PUPPET.impls.PuppetInterface) => (conversationId: string) => async (sayable: Sayable, options?: SayOptionsObject) => { let msgId: string | void if (typeof sayable === 'number') { sayable = String(sayable) } if (typeof sayable === 'string') { return puppet.messageSendText( conversationId, sayable, { mentionIdList: options?.mentionList?.map(c => c === '@all' ? '@all' : c.id), quoteId: options?.quoteMessage?.id, }, ) } /** * Huan(202110): Checking `looseInstanceOf` is enough for the following types: * so we do not check `interfaceOfClass` anymore because it will consume more resources. */ if (FileBox.valid(sayable)) { /** * 1. File */ msgId = await puppet.messageSendFile( conversationId, sayable, ) } else if (MessageImpl.validInstance(sayable)) { /** * 2. Message */ msgId = await puppet.messageForward( conversationId, sayable.id, ) } else if (ContactImpl.validInstance(sayable)) { /** * 3. Contact */ msgId = await puppet.messageSendContact( conversationId, sayable.id, ) } else if (UrlLinkImpl.validInstance(sayable)) { /** * 4. Link Message */ msgId = await puppet.messageSendUrl( conversationId, sayable.payload, ) } else if (MiniProgramImpl.validInstance(sayable)) { /** * 5. Mini Program */ msgId = await puppet.messageSendMiniProgram( conversationId, sayable.payload, ) } else if (LocationImpl.validInstance(sayable)) { /** * 6. Location */ msgId = await puppet.messageSendLocation( conversationId, sayable.payload, ) } else if (DelayImpl.validInstance(sayable)) { /** * 7. Delay for a while */ await sayable.wait() } else if (PostImpl.validInstance(sayable)) { /** * 8. Post */ msgId = await puppet.messageSendPost( conversationId, sayable.payload, ) } else if (ChannelImpl.validInstance(sayable)) { msgId = await puppet.messageSendChannel( conversationId, sayable.payload, ) } else if (ChannelCardImpl.validInstance(sayable)) { msgId = await puppet.messageSendChannelCard( conversationId, sayable.payload, ) } else if (ConsultCardImpl.validInstance(sayable)) { msgId = await puppet.messageSendConsultCard( conversationId, sayable.payload, ) } else if (PremiumOnlineAppointmentCardImpl.validInstance(sayable)) { msgId = await puppet.messageSendPremiumOnlineAppointmentCard( conversationId, { cardType: sayable.payload.cardType, componentId: sayable.componentId(), }, ) } else if (DouyinOneClickPhoneCollectionImpl.validInstance(sayable)) { msgId = await puppet.messageSendDouyinOneClickPhoneCollection( conversationId, {}, ) } else if (WxxdProductImpl.validInstance(sayable)) { msgId = await puppet.messageSendWxxdProduct( conversationId, sayable.id, ) } else if (WxxdOrderImpl.validInstance(sayable)) { msgId = await puppet.messageSendWxxdOrder( conversationId, sayable.id, ) } else { throw new Error('unsupported arg: ' + sayable) } return msgId } export { deliverSayableConversationPuppet, }