/** * Wechaty - https://github.com/chatie/wechaty * * @copyright 2016-2018 Huan LI * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ import path from 'path' import { FileBox, } from 'file-box' import { MessagePayload, ContactGender, ContactType, ContactPayload, FriendshipPayload, RoomPayload, RoomMemberPayload, } from '../puppet/' import { Puppet, PuppetOptions, Receiver, MessageType, } from '../puppet/' import { log, qrCodeForChatie, } from '../config' export type PuppetFoodType = 'scan' | 'ding' export type ScanFoodType = 'scan' | 'login' | 'logout' export interface MockContactRawPayload { name : string, } export interface MockMessageRawPayload { id : string, from : string, to : string, text : string } export interface MockRoomRawPayload { topic : string, memberList : string[], ownerId : string, } export class PuppetMock extends Puppet { constructor( public options: PuppetOptions, ) { super(options) } public async start(): Promise { log.verbose('PuppetMock', `start() with ${this.options.memory.name}`) this.state.on('pending') // await some tasks... this.state.on(true) this.id = 'logined_user_id' // const user = this.Contact.load(this.id) this.emit('login', this.id) const MOCK_MSG_ID = 'mockid' this.cacheMessagePayload.set(MOCK_MSG_ID, { id : MOCK_MSG_ID, type : MessageType.Text, text : 'mock text', timestamp : Date.now(), fromId : 'xxx', toId : 'xxx', }) setInterval(() => { log.verbose('PuppetMock', `start() setInterval() pretending received a new message: ${MOCK_MSG_ID}`) this.emit('message', MOCK_MSG_ID) }, 3000) } public async stop(): Promise { log.verbose('PuppetMock', 'quit()') if (this.state.off()) { log.warn('PuppetMock', 'quit() is called on a OFF puppet. await ready(off) and return.') await this.state.ready('off') return } this.state.off('pending') // await some tasks... this.state.off(true) } public async logout(): Promise { log.verbose('PuppetMock', 'logout()') if (!this.id) { throw new Error('logout before login?') } this.emit('logout', this.id) // becore we will throw above by logonoff() when this.user===undefined this.id = undefined // TODO: do the logout job } /** * * Contact * */ public contactAlias(contactId: string) : Promise public contactAlias(contactId: string, alias: string | null): Promise public async contactAlias(contactId: string, alias?: string|null): Promise { log.verbose('PuppetMock', 'contactAlias(%s, %s)', contactId, alias) if (typeof alias === 'undefined') { return 'mock alias' } return } public async contactList(): Promise { log.verbose('PuppetMock', 'contactList()') return [] } public async contactQrcode(contactId: string): Promise { if (contactId !== this.selfId()) { throw new Error('can not set avatar for others') } throw new Error('not supported') // return await this.bridge.WXqr } public async contactAvatar(contactId: string) : Promise public async contactAvatar(contactId: string, file: FileBox) : Promise public async contactAvatar(contactId: string, file?: FileBox): Promise { log.verbose('PuppetMock', 'contactAvatar(%s)', contactId) /** * 1. set */ if (file) { return } /** * 2. get */ const WECHATY_ICON_PNG = path.resolve('../../docs/images/wechaty-icon.png') return FileBox.fromFile(WECHATY_ICON_PNG) } public async contactRawPayload(id: string): Promise { log.verbose('PuppetMock', 'contactRawPayload(%s)', id) const rawPayload: MockContactRawPayload = { name : 'mock name', } return rawPayload } public async contactRawPayloadParser(rawPayload: MockContactRawPayload): Promise { log.verbose('PuppetMock', 'contactRawPayloadParser(%s)', rawPayload) const payload: ContactPayload = { id : 'id', gender : ContactGender.Unknown, type : ContactType.Unknown, } return payload } /** * * Message * */ public async messageFile(id: string): Promise { return FileBox.fromBase64( 'cRH9qeL3XyVnaXJkppBuH20tf5JlcG9uFX1lL2IvdHRRRS9kMMQxOPLKNYIzQQ==', 'mock-file' + id + '.txt', ) } public async messageRawPayload(id: string): Promise { log.verbose('PuppetMock', 'messageRawPayload(%s)', id) const rawPayload: MockMessageRawPayload = { id : 'id', from : 'from_id', text : 'mock message text', to : 'to_id', } return rawPayload } public async messageRawPayloadParser(rawPayload: MockMessageRawPayload): Promise { log.verbose('PuppetMock', 'messagePayload(%s)', rawPayload) const payload: MessagePayload = { id : rawPayload.id, timestamp : Date.now(), fromId : 'xxx', text : 'mock message text', toId : this.selfId(), type : MessageType.Text, } return payload } public async messageSendText( receiver : Receiver, text : string, ): Promise { log.verbose('PuppetMock', 'messageSend(%s, %s)', receiver, text) } public async messageSendFile( receiver : Receiver, file : FileBox, ): Promise { log.verbose('PuppetMock', 'messageSend(%s, %s)', receiver, file) } public async messageSendContact( receiver : Receiver, contactId : string, ): Promise { log.verbose('PuppetMock', 'messageSend("%s", %s)', JSON.stringify(receiver), contactId) return } public async messageForward( receiver : Receiver, messageId : string, ): Promise { log.verbose('PuppetMock', 'messageForward(%s, %s)', receiver, messageId, ) } /** * * Room * */ public async roomRawPayload( id: string, ): Promise { log.verbose('PuppetMock', 'roomRawPayload(%s)', id) const rawPayload: MockRoomRawPayload = { ownerId : 'mock_room_owner_id', topic : 'mock topic', memberList : [], } return rawPayload } public async roomRawPayloadParser( rawPayload: MockRoomRawPayload, ): Promise { log.verbose('PuppetMock', 'roomRawPayloadParser(%s)', rawPayload) const payload: RoomPayload = { id : 'id', topic : 'mock topic', } return payload } public async roomList(): Promise { log.verbose('PuppetMock', 'roomList()') return [] } public async roomDel( roomId : string, contactId : string, ): Promise { log.verbose('PuppetMock', 'roomDel(%s, %s)', roomId, contactId) } public async roomAvatar(roomId: string): Promise { log.verbose('PuppetMock', 'roomAvatar(%s)', roomId) const payload = await this.roomPayload(roomId) if (payload.avatar) { return FileBox.fromUrl(payload.avatar) } log.warn('PuppetMock', 'roomAvatar() avatar not found, use the chatie default.') return qrCodeForChatie() } public async roomAdd( roomId : string, contactId : string, ): Promise { log.verbose('PuppetMock', 'roomAdd(%s, %s)', roomId, contactId) } public async roomTopic(roomId: string) : Promise public async roomTopic(roomId: string, topic: string) : Promise public async roomTopic( roomId: string, topic?: string, ): Promise { log.verbose('PuppetMock', 'roomTopic(%s, %s)', roomId, topic) if (typeof topic === 'undefined') { return 'mock room topic' } return } public async roomCreate( contactIdList : string[], topic : string, ): Promise { log.verbose('PuppetMock', 'roomCreate(%s, %s)', contactIdList, topic) return 'mock_room_id' } public async roomQuit(roomId: string): Promise { log.verbose('PuppetMock', 'roomQuit(%s)', roomId) } public async roomQrcode(roomId: string): Promise { return roomId + ' mock qrcode' } public async roomMemberList(roomId: string) : Promise { log.verbose('PuppetMock', 'roommemberList(%s)', roomId) return [] } public async roomMemberRawPayload(roomId: string, contactId: string): Promise { log.verbose('PuppetMock', 'roomMemberRawPayload(%s, %s)', roomId, contactId) return {} } public async roomMemberRawPayloadParser(rawPayload: any): Promise { log.verbose('PuppetMock', 'roomMemberRawPayloadParser(%s)', rawPayload) return { id: 'xx', roomAlias: 'yy', } } public async roomAnnounce(roomId: string) : Promise public async roomAnnounce(roomId: string, text: string) : Promise public async roomAnnounce(roomId: string, text?: string) : Promise { if (text) { return } return 'mock announcement for ' + roomId } /** * * Friendship * */ public async friendshipRawPayload(id: string) : Promise { return {id} as any } public async friendshipRawPayloadParser(rawPayload: any) : Promise { return rawPayload } public async friendshipVerify( contactId : string, hello : string, ): Promise { log.verbose('PuppetMock', 'friendshipVerify(%s, %s)', contactId, hello) } public async friendshipAccept( friendshipId : string, ): Promise { log.verbose('PuppetMock', 'friendshipAccept(%s)', friendshipId) } public ding(data?: any): Promise { return data } } export default PuppetMock