diff --git a/examples/ding-dong-bot.ts b/examples/ding-dong-bot.ts index b82c2764811b8f53072719494afb3a26a4a0456f..8055a91d96b5539c799a439eadac0623b1690f2a 100644 --- a/examples/ding-dong-bot.ts +++ b/examples/ding-dong-bot.ts @@ -90,7 +90,7 @@ bot * 1. reply 'dong' */ log.info('Bot', 'REPLY: dong') - msg.say('dong') + await msg.say('dong') const joinWechaty = `Join Wechaty Developers' Community\n\n` + `Wechaty is used in many ChatBot projects by hundreds of developers.\n\n` + @@ -107,7 +107,7 @@ bot BOT_QR_CODE_IMAGE_FILE, ) - log.info('Bot', 'REPLY: %s', fileBox) + log.info('Bot', 'REPLY: %s', fileBox.toString()) await msg.say(fileBox) /** diff --git a/package.json b/package.json index 9278a07c9570966edb033cf12a56340bea1bc40e..073a3acdd98f7b9d87b1cc3edc983568f6398f02 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "clone-class": "^0.6.11", "cuid": "^2.1.1", "express": "^4.16.3", - "file-box": "^0.8.3", + "file-box": "^0.8.14", "hot-import": "^0.2.1", "lru-cache": "^4.1.3", "memory-card": "0.0.6", diff --git a/src/friend-request.ts b/src/friend-request.ts index 7a4256cb3ccee3544786a31da6719b4d1744f12f..78516532148a94845febd3c34e0bdb1c3a23719d 100644 --- a/src/friend-request.ts +++ b/src/friend-request.ts @@ -61,11 +61,7 @@ export class FriendRequest extends Accessory { id : string, ): T['prototype'] { const newFriendRequest = new (this as any)(id) - - const hitPayload = this.puppet.cacheFriendRequestPayload.get(id) - if (hitPayload) { - newFriendRequest.payload = hitPayload - } + newFriendRequest.payload = this.puppet.cacheFriendRequestPayload.get(id) return newFriendRequest } diff --git a/src/message.ts b/src/message.ts index 77b94648ae3ef181011ba29d6e62b01cf9af3331..046205dc4103016230f2e03886a32c84f3f6aa1f 100644 --- a/src/message.ts +++ b/src/message.ts @@ -152,15 +152,16 @@ export class Message extends Accessory implements Sayable { // `#${MessageDirection[this.direction]}`, `#${MessageType[this.type()]}`, '(', + this.room() ? (this.room() + '▲') : '', this.from(), - this.room() ? '@' + this.room() : '', + '►', this.to(), ')', ] if (this.type() === Message.Type.Text) { msgStrList.push(`<${this.text()}>`) } else { - log.verbose('Message', 'toString() this.type()=%s', Message.Type[this.type()]) + log.silly('Message', 'toString() for message type: ', Message.Type[this.type()]) if (!this.payload) { throw new Error('no payload') diff --git a/src/puppet-puppeteer/bridge.ts b/src/puppet-puppeteer/bridge.ts index 56652bcadbc84c60f284de666e79dba48d2abf11..acd35e1e58d577a73074e30d04e63d3bdec35f9e 100644 --- a/src/puppet-puppeteer/bridge.ts +++ b/src/puppet-puppeteer/bridge.ts @@ -528,8 +528,29 @@ export class Bridge extends EventEmitter { } public async getMessage(id: string): Promise { - const rawPayload = await this.proxyWechaty('getMessage', id) - return rawPayload + try { + return await Misc.retry(async (retry, attempt) => { + log.silly('PuppetPuppeteerBridge', 'getMessage(%s) retry attempt %d', + id, + attempt, + ) + try { + const rawPayload = await this.proxyWechaty('getMessage', id) + + if (rawPayload && Object.keys(rawPayload).length > 0) { + return rawPayload + } + throw new Error('got empty return value at attempt: ' + attempt) + } catch (e) { + log.verbose('PuppetPuppeteerBridge', 'getMessage() proxyWechaty(getMessage, %s) exception: %s', id, e.message) + retry(e) + } + }) + + } catch (e) { + log.error('PuppetPuppeteerBridge', 'promiseRetry() getContact() finally FAIL: %s', e.message) + throw e + } } public async getContact(id: string): Promise { @@ -552,20 +573,6 @@ export class Bridge extends EventEmitter { } }) - // return await retryPromise({ max: max, backoff: backoff }, async (attempt: number) => { - // log.silly('PuppetPuppeteerBridge', 'getContact() retryPromise: attampt %d/%d time for timeout %d', - // attempt, max, timeout) - // try { - // const r = await this.proxyWechaty('getContact', id) - // if (r) { - // return r - // } - // throw new Error('got empty return value at attempt: ' + attempt) - // } catch (e) { - // log.silly('PuppetPuppeteerBridge', 'proxyWechaty(getContact, %s) exception: %s', id, e.message) - // throw e - // } - // }) } catch (e) { log.error('PuppetPuppeteerBridge', 'promiseRetry() getContact() finally FAIL: %s', e.message) throw e diff --git a/src/puppet-puppeteer/firer.ts b/src/puppet-puppeteer/firer.ts index 020dddb756a85aac5dee98acc63a44b881b5fbc0..2ab0a996c29ec476b8570c45e65f8e298d8bc78b 100644 --- a/src/puppet-puppeteer/firer.ts +++ b/src/puppet-puppeteer/firer.ts @@ -308,7 +308,7 @@ export class Firer { try { [leaverName, removerName] = this.parseRoomLeave(rawPayload.Content) } catch (e) { - log.warn('PuppetPuppeteerFirer', 'fireRoomLeave() exception: %s', e.message) + log.silly('PuppetPuppeteerFirer', 'fireRoomLeave() %s', e.message) return false } log.silly('PuppetPuppeteerFirer', 'fireRoomLeave() got leaverName: %s', leaverName) diff --git a/src/puppet-puppeteer/puppet-puppeteer.ts b/src/puppet-puppeteer/puppet-puppeteer.ts index a3362a3bf6afa790266f491726c3437df3f4476c..4555c9c242c4c555ef38818d050721a151242f6e 100644 --- a/src/puppet-puppeteer/puppet-puppeteer.ts +++ b/src/puppet-puppeteer/puppet-puppeteer.ts @@ -355,6 +355,10 @@ export class PuppetPuppeteer extends Puppet { } else { throw new Error('parse found a room message, but neither FromUserName nor ToUserName is a room(/^@@/)') } + + // console.log('rawPayload.FromUserName: ', rawPayload.FromUserName) + // console.log('rawPayload.ToUserName: ', rawPayload.ToUserName) + // console.log('rawPayload.MMPeerUserName: ', rawPayload.MMPeerUserName) } if (rawPayload.ToUserName) { @@ -576,7 +580,7 @@ export class PuppetPuppeteer extends Puppet { receiver : Receiver, text : string, ): Promise { - log.verbose('PuppetPuppeteer', 'messageSendText(receiver=%s, text=%s)', receiver, text) + log.verbose('PuppetPuppeteer', 'messageSendText(receiver=%s, text=%s)', JSON.stringify(receiver), text) let destinationId @@ -860,7 +864,7 @@ export class PuppetPuppeteer extends Puppet { // let currNum = rawPayload.MemberList && rawPayload.MemberList.length || 0 // let prevNum = room.memberList().length // rawPayload && rawPayload.MemberList && this.rawObj.MemberList.length || 0 - let prevLength = -1 + let prevLength = 0 /** * @todo use Misc.retry() to replace the following loop @@ -870,19 +874,27 @@ export class PuppetPuppeteer extends Puppet { rawPayload = await this.bridge.getContact(id) as undefined | WebRoomRawPayload if (rawPayload) { - const currLength = rawPayload.MemberList && rawPayload.MemberList.length || 0 + const currLength = rawPayload.MemberList && rawPayload.MemberList.length || -1 - log.silly('PuppetPuppeteer', `roomPayload() this.bridge.getContact(%s) MemberList.length:%d at ttl:%d`, + log.silly('PuppetPuppeteer', `roomPayload() this.bridge.getContact(%s) MemberList.length:(prev:%d, curr:%d) at ttl:%d`, id, + prevLength, currLength, ttl, ) if (prevLength === currLength) { - log.silly('PuppetPuppeteer', `roomPayload() puppet.getContact(${id}) done at ttl:%d`, ttl) + log.silly('PuppetPuppeteer', `roomPayload() puppet.getContact(%s) done at ttl:%d with length:%d`, this.id, ttl, currLength) return rawPayload } - prevLength = currLength + if (currLength >= prevLength) { + prevLength = currLength + } else { + log.warn('PuppetPuppeteer', 'roomRawPayload() currLength(%d) <= prevLength(%d) ???', + currLength, + prevLength, + ) + } } log.silly('PuppetPuppeteer', `roomPayload() puppet.getContact(${id}) retry at ttl:%d`, ttl) @@ -1589,7 +1601,7 @@ export class PuppetPuppeteer extends Puppet { file : FileBox, ): Promise { log.verbose('PuppetPuppeteer', 'messageSendFile(receiver=%s, file=%s)', - receiver, + JSON.stringify(receiver), file.toString(), ) diff --git a/src/puppet/puppet.ts b/src/puppet/puppet.ts index eb0bef3f981b3a02f9b1ce9eff75a60376f33a92..4a27c4b1e8a1d8fc85d5f57e0984f07399f406e9 100644 --- a/src/puppet/puppet.ts +++ b/src/puppet/puppet.ts @@ -457,6 +457,10 @@ export abstract class Puppet extends EventEmitter implements Sayable { ): Promise { log.silly('Puppet', 'contactPayload(id=%s, noCache=%s) @ %s', id, noCache, this) + if (!id) { + throw new Error('no id') + } + if (noCache) { log.silly('Puppet', 'contactPayload() cache PURGE') this.cacheContactPayload.del(id) @@ -494,6 +498,10 @@ export abstract class Puppet extends EventEmitter implements Sayable { ): Promise { log.verbose('Puppet', 'friendRequestPayload(id=%s, noCache=%s)', id, noCache) + if (!id) { + throw new Error('no id') + } + if (noCache) { log.silly('Puppet', 'friendRequestPayload() cache PURGE') this.cacheFriendRequestPayload.del(id) @@ -530,6 +538,10 @@ export abstract class Puppet extends EventEmitter implements Sayable { ): Promise { log.verbose('Puppet', 'messagePayload(id=%s, noCache=%s)', id, noCache) + if (!id) { + throw new Error('no id') + } + if (noCache) { log.silly('Puppet', 'messagePayload() cache PURGE') this.cacheMessagePayload.del(id) @@ -687,6 +699,10 @@ export abstract class Puppet extends EventEmitter implements Sayable { ): Promise { log.verbose('Puppet', 'roomPayload(id=%s, noCache=%s)', id, noCache) + if (!id) { + throw new Error('no id') + } + if (noCache) { log.silly('Puppet', 'roomPayload() cache PURGE') this.cacheRoomPayload.del(id) diff --git a/src/room.ts b/src/room.ts index e9205346bef29d82768dc9ade975ab48919e4862..ddfe3f17c6d8f526dc8827060beaf2e0c794a77b 100644 --- a/src/room.ts +++ b/src/room.ts @@ -219,7 +219,7 @@ export class Room extends Accessory implements Sayable { */ public toString() { if (this.payload && this.payload.topic) { - return `Room<${this.topic()}>` + return `Room<${this.payload.topic}>` } return `Room<${this.id || ''}>` } @@ -776,13 +776,7 @@ export class Room extends Accessory implements Sayable { * @returns {Promise} */ public async sync(): Promise { - // TODO: make it work with the old dirty payload when in re-syncing... - - // if (this.isReady()) { - // this.dirtyObj = this.payload - // } - this.payload = undefined - await this.ready() + await this.ready(true) } /**