提交 1c58f9d3 编写于 作者: ruiruibupt's avatar ruiruibupt

add bug-compatible for dirty fix

......@@ -56,7 +56,7 @@ export async function onMessage(this: Wechaty, message: Message): Promise<void>
const myRoom = await this.Room.find({ topic: 'ding' })
if (!myRoom) return
if (myRoom.has(sender)) {
if (await myRoom.has(sender)) {
await sender.say('no need to ding again, because you are already in ding room')
return
}
......
......@@ -34,7 +34,7 @@
* vvvvvvvvv
* vvvvvvvvv
*/
const HELPER_CONTACT_NAME = 'Huan LI'
const HELPER_CONTACT_NAME = '李佳芮'
/**
* ^^^^^^^^^
......@@ -162,6 +162,11 @@ bot
* Global Event: message
*/
.on('message', async function(msg) {
if (msg.age() > 3 * 60) {
log.info('Bot', 'on(message) skip age(%d) > 3 * 60 seconds: %s', msg.age(), msg)
return
}
const room = msg.room()
const from = msg.from()
const text = msg.text()
......@@ -210,9 +215,9 @@ bot
/**
* room found
*/
log.info('Bot', 'onMessage: got dingRoom: %s', dingRoom.topic())
log.info('Bot', 'onMessage: got dingRoom: %s', await dingRoom.topic())
if (dingRoom.has(from)) {
if (await dingRoom.has(from)) {
/**
* speaker is already in room
*/
......
{
"name": "wechaty",
"version": "0.15.169",
"version": "0.15.170",
"description": "Wechat for Bot(Personal Account)",
"main": "dist/src/index.js",
"typings": "dist/src/index.d.ts",
......
......@@ -72,8 +72,8 @@ export class Contact extends Accessory implements Sayable {
* About the Generic: https://stackoverflow.com/q/43003970/1123955
*/
public static load<T extends typeof Contact>(
this : T,
id : string,
this : T,
id : string,
): T['prototype'] {
if (!this.pool) {
log.verbose('Contact', 'load(%s) init pool', id)
......
......@@ -290,9 +290,11 @@ export class Message extends Accessory implements Sayable {
textOrContactOrFile : string | Contact | FileBox,
mention? : Contact | Contact[],
): Promise<void> {
log.verbose('Message', 'say(%s, %s)',
log.verbose('Message', 'say(%s%s)',
textOrContactOrFile.toString(),
mention,
mention
? ', ' + mention
: '',
)
// const user = this.puppet.userSelf()
......@@ -416,8 +418,8 @@ export class Message extends Accessory implements Sayable {
* const contactList = message.mentioned()
* console.log(contactList)
*/
public async mentioned(): Promise<Contact[]> {
log.verbose('Message', 'mentioned()')
public async mention(): Promise<Contact[]> {
log.verbose('Message', 'mention()')
const room = this.room()
if (this.type() !== MessageType.Text || !room ) {
......@@ -432,7 +434,7 @@ export class Message extends Accessory implements Sayable {
if (atList.length === 0) return []
// Using `filter(e => e.indexOf('@') > -1)` to filter the string without `@`
const rawMentionedList = atList
const rawMentionList = atList
.filter(str => str.includes('@'))
.map(str => multipleAt(str))
......@@ -455,11 +457,11 @@ export class Message extends Accessory implements Sayable {
let mentionNameList: string[] = []
// Flatten Array
// see http://stackoverflow.com/a/10865042/1123955
mentionNameList = mentionNameList.concat.apply([], rawMentionedList)
mentionNameList = mentionNameList.concat.apply([], rawMentionList)
// filter blank string
mentionNameList = mentionNameList.filter(s => !!s)
log.verbose('Message', 'mentioned() text = "%s", mentionNameList = "%s"',
log.verbose('Message', 'mention() text = "%s", mentionNameList = "%s"',
this.text(),
JSON.stringify(mentionNameList),
)
......@@ -474,11 +476,19 @@ export class Message extends Accessory implements Sayable {
contactList = contactList.concat.apply([], contactListNested)
if (contactList.length === 0) {
log.warn('Message', `message.mentioned() can not found member using room.member() from mentionList, metion string: ${JSON.stringify(mentionNameList)}`)
log.silly('Message', `message.mention() can not found member using room.member() from mentionList, metion string: ${JSON.stringify(mentionNameList)}`)
}
return contactList
}
/**
* @deprecated: use mention() instead
*/
public async mentioned(): Promise<Contact[]> {
log.warn('Message', 'mentioned() DEPRECATED. use mention() instead.')
return this.mention()
}
/**
* @private
*/
......
......@@ -25,7 +25,6 @@ import {
import {
MessagePayload,
// ContactQueryFilter,
ContactGender,
ContactType,
ContactPayload,
......@@ -33,9 +32,6 @@ import {
FriendshipPayload,
RoomPayload,
RoomMemberPayload,
// RoomQueryFilter,
WATCHDOG_TIMEOUT,
} from '../puppet/'
import {
Puppet,
......@@ -70,12 +66,6 @@ export interface MockRoomRawPayload {
}
export class PuppetMock extends Puppet {
/**
* Watchdog Timeout in Seconds
* if set this value, the default timeout value will be overwrited,
* and the parent Puppet class will use it to init watchdog
*/
protected [WATCHDOG_TIMEOUT] = 30
constructor(
public options: PuppetOptions,
......
......@@ -668,10 +668,10 @@ export class PadchatManager extends PadchatRpc {
return roomIdList
}
public purgeRoomMemberIdList(
public roomMemberRawPayloadDirty(
roomId: string,
): void {
log.verbose('PuppetPadchatManager', 'purgeRoomMemberIdList(%d)', roomId)
log.verbose('PuppetPadchatManager', 'roomMemberRawPayloadDirty(%d)', roomId)
if (!this.cacheRoomMemberRawPayload) {
throw new Error('cache not inited' )
}
......@@ -680,16 +680,15 @@ export class PadchatManager extends PadchatRpc {
public async getRoomMemberIdList(
roomId: string,
noCache = false,
dirty = false,
): Promise<string[]> {
log.verbose('PuppetPadchatManager', 'getRoomMemberIdList(%d)', roomId)
if (!this.cacheRoomMemberRawPayload) {
throw new Error('cache not inited' )
}
if (noCache) {
log.verbose('PuppetPadchatManager', 'getRoomMemberIdList(%d) cache PURGE', roomId)
this.cacheRoomMemberRawPayload.delete(roomId)
if (dirty) {
this.roomMemberRawPayloadDirty(roomId)
}
const memberRawPayloadDict = this.cacheRoomMemberRawPayload.get(roomId)
......@@ -702,11 +701,22 @@ export class PadchatManager extends PadchatRpc {
const memberIdList = Object.keys(memberRawPayloadDict)
// console.log('memberRawPayloadDict:', memberRawPayloadDict)
log.verbose('PuppetPadchatManager', 'getRoomMemberIdList(%d) length=%d', roomId, memberIdList.length)
return memberIdList
}
public async roomMemberRawPayload(roomId: string, contactId: string): Promise<PadchatRoomMemberPayload> {
public roomRawPayloadDirty(
roomId: string,
): void {
log.verbose('PuppetPadchatManager', 'roomRawPayloadDirty(%d)', roomId)
if (!this.cacheRoomRawPayload) {
throw new Error('cache not inited' )
}
this.cacheRoomRawPayload.delete(roomId)
}
public async roomMemberRawPayload(roomId: string): Promise<{ [contactId: string]: PadchatRoomMemberPayload }> {
log.verbose('PuppetPadchatManager', 'roomMemberRawPayload(%s)', roomId)
if (!this.cacheRoomMemberRawPayload) {
......@@ -720,12 +730,12 @@ export class PadchatManager extends PadchatRpc {
throw new Error('roomId not found: ' + roomId)
}
const memberRawPayload = memberRawPayloadDict[contactId]
if (!memberRawPayload) {
throw new Error('contactId not found in room member dict')
}
// const memberRawPayload = memberRawPayloadDict[contactId]
// if (!memberRawPayload) {
// throw new Error('contactId not found in room member dict')
// }
return memberRawPayload
return memberRawPayloadDict
}
public async syncRoomMember(
......@@ -737,7 +747,7 @@ export class PadchatManager extends PadchatRpc {
const memberListPayload = await this.WXGetChatRoomMember(roomId)
if (!memberListPayload || !('user_name' in memberListPayload)) { // check user_name too becasue the server might return {}
console.log('memberListPayload', memberListPayload)
// console.log('memberListPayload', memberListPayload)
throw new Error('no memberListPayload')
}
......@@ -782,8 +792,7 @@ export class PadchatManager extends PadchatRpc {
// console.log('syncContactList:', syncContactList)
if (!Array.isArray(syncContactList) || syncContactList.length <= 0) {
console.log('syncContactList:', syncContactList)
log.error('PuppetPadchatManager', 'syncContactsAndRooms() cannot get array result!')
log.warn('PuppetPadchatManager', 'syncContactsAndRooms() cannot get array result: %s', JSON.stringify(syncContactList))
continue
}
......@@ -867,6 +876,16 @@ export class PadchatManager extends PadchatRpc {
}
}
public contactRawPayloadDirty(
contactId: string,
): void {
log.verbose('PuppetPadchatManager', 'contactRawPayloadDirty(%d)', contactId)
if (!this.cacheContactRawPayload) {
throw new Error('cache not inited' )
}
this.cacheContactRawPayload.delete(contactId)
}
public async contactRawPayload(contactId: string): Promise<PadchatContactPayload> {
log.silly('PuppetPadchatManager', 'contactRawPayload(%s)', contactId)
......
......@@ -985,7 +985,9 @@ export class PadchatRpc extends EventEmitter {
}
// {"message":"\n\u0010Everything is OK","status":0,"user_name":"\n\u00135907139882@chatroom"}
public async WXCreateChatRoom(userList: string[]): Promise<any> {
// BUG compitable: "\n\u00135907139882@chatroom" -> "5907139882@chatroom"
// https://github.com/lijiarui/wechaty-puppet-padchat/issues/62
public async WXCreateChatRoom(userList: string[]): Promise<string> {
const result = await this.rpcCall('WXCreateChatRoom', JSON.stringify(userList))
log.silly('PadchatRpc', 'WXCreateChatRoom(userList.length=%d) = "%s"', userList.length, JSON.stringify(result))
if (!result || result.status !== 0) {
......
......@@ -46,8 +46,6 @@ import {
FriendshipPayload,
FriendshipPayloadReceive,
WATCHDOG_TIMEOUT,
} from '../puppet/'
import {
......@@ -102,9 +100,6 @@ import {
export class PuppetPadchat extends Puppet {
// in seconds, 4 minute for padchat
protected [WATCHDOG_TIMEOUT] = 4 * 60
// private readonly cachePadchatContactPayload : LRU.Cache<string, PadchatContactRawPayload>
// private readonly cachePadchatFriendshipPayload : LRU.Cache<string, PadchatMessagePayload>
private readonly cachePadchatMessagePayload : LRU.Cache<string, PadchatMessagePayload>
......@@ -115,7 +110,10 @@ export class PuppetPadchat extends Puppet {
constructor(
public options: PuppetOptions,
) {
super(options)
super({
timeout: 60 * 4, // Default set timeout to 4 minutes
...options,
})
const lruOptions: LRU.Options = {
max: 1000,
......@@ -141,7 +139,7 @@ export class PuppetPadchat extends Puppet {
}
public startWatchdog(): void {
log.verbose('PuppetPadchat', 'initWatchdogForPuppet()')
log.verbose('PuppetPadchat', 'startWatchdog()')
if (!this.padchatManager) {
throw new Error('no bridge')
......@@ -264,7 +262,10 @@ export class PuppetPadchat extends Puppet {
* 1. Sometimes will get duplicated same messages from rpc, drop the same message from here.
*/
if (this.cachePadchatMessagePayload.has(rawPayload.msg_id)) {
log.warn('PuppetPadchat', 'onPadchatMessage({id=%s, type=%s(%s)}) duplicate message')
log.warn('PuppetPadchat', 'onPadchatMessage(id=%s) duplicate message: %s',
rawPayload.msg_id,
JSON.stringify(rawPayload).substr(0, 500),
)
return
}
......@@ -335,6 +336,7 @@ export class PuppetPadchat extends Puppet {
const inviteeNameList = roomJoinEvent.inviteeNameList
const inviterName = roomJoinEvent.inviterName
const roomId = roomJoinEvent.roomId
log.silly('PuppetPadchat', 'onPadchatMessageRoomEventJoin() roomJoinEvent="%s"', JSON.stringify(roomJoinEvent))
const inviteeIdList = await Misc.retry(async (retry, attempt) => {
log.verbose('PuppetPadchat', 'onPadchatMessageRoomEvent({id=%s}) roomJoin retry(attempt=%d)', attempt)
......@@ -356,9 +358,9 @@ export class PuppetPadchat extends Puppet {
}
/**
* PURGE Cache and Reload
* Dirty Cache
*/
this.padchatManager.purgeRoomMemberIdList(roomId)
this.roomMemberPayloadDirty(roomId)
return retry(new Error('roomMemberSearch() not found'))
......@@ -393,6 +395,7 @@ export class PuppetPadchat extends Puppet {
const leaverNameList = roomLeaveEvent.leaverNameList
const removerName = roomLeaveEvent.removerName
const roomId = roomLeaveEvent.roomId
log.silly('PuppetPadchat', 'onPadchatMessageRoomEventLeave() roomLeaveEvent="%s"', JSON.stringify(roomLeaveEvent))
const leaverIdList = flatten<string>(
await Promise.all(
......@@ -414,10 +417,9 @@ export class PuppetPadchat extends Puppet {
}
/**
* Update L1 Cache & PURGE L2 Cache
* Dirty Cache
*/
this.cacheRoomMemberPayload.del(roomId)
this.padchatManager.purgeRoomMemberIdList(roomId)
this.roomMemberPayloadDirty(roomId)
this.emit('room-leave', roomId, leaverIdList, removerId)
}
......@@ -435,6 +437,7 @@ export class PuppetPadchat extends Puppet {
const changerName = roomTopicEvent.changerName
const newTopic = roomTopicEvent.topic
const roomId = roomTopicEvent.roomId
log.silly('PuppetPadchat', 'onPadchatMessageRoomEventTopic() roomTopicEvent="%s"', JSON.stringify(roomTopicEvent))
const roomPayload = await this.roomPayload(roomId)
const oldTopic = roomPayload.topic
......@@ -456,7 +459,8 @@ export class PuppetPadchat extends Puppet {
const updateRoomPayload = await this.roomPayload(roomId)
updateRoomPayload.topic = newTopic
this.cacheRoomPayload.set(roomId, updateRoomPayload)
this.padchatManager.purgeRoomMemberIdList(roomId)
this.roomPayloadDirty(roomId)
this.emit('room-topic', roomId, newTopic, oldTopic, changerId)
}
......@@ -622,6 +626,16 @@ export class PuppetPadchat extends Puppet {
return qrcode
}
public async contactPayloadDirty(contactId: string): Promise<void> {
log.verbose('PuppetPadchat', 'contactPayloadDirty(%s)', contactId)
if (this.padchatManager) {
this.padchatManager.contactRawPayloadDirty(contactId)
}
super.contactPayloadDirty(contactId)
}
public async contactRawPayload(contactId: string): Promise<PadchatContactPayload> {
log.silly('PuppetPadchat', 'contactRawPayload(%s)', contactId)
......@@ -701,6 +715,16 @@ export class PuppetPadchat extends Puppet {
return file
}
public async messagePayloadDirty(messageId: string): Promise<void> {
log.verbose('PuppetPadchat', 'messagePayloadDirty(%s)', messageId)
if (this.padchatManager) {
// this.padchatManager.messageRawPayloadDirty(messageId)
}
super.messagePayloadDirty(messageId)
}
public async messageRawPayload(id: string): Promise<PadchatMessagePayload> {
// throw Error('should not call messageRawPayload: ' + id)
......@@ -839,6 +863,16 @@ export class PuppetPadchat extends Puppet {
* Room
*
*/
public async roomMemberPayloadDirty(roomId: string) {
log.silly('PuppetPadchat', 'roomMemberRawPayloadDirty(%s)', roomId)
if (this.padchatManager) {
await this.padchatManager.roomMemberRawPayloadDirty(roomId)
}
super.roomMemberPayloadDirty(roomId)
}
public async roomMemberRawPayload(
roomId : string,
contactId : string,
......@@ -849,8 +883,9 @@ export class PuppetPadchat extends Puppet {
throw new Error('no bridge')
}
const rawPayload = await this.padchatManager.roomMemberRawPayload(roomId, contactId)
return rawPayload
const memberDictRawPayload = await this.padchatManager.roomMemberRawPayload(roomId)
return memberDictRawPayload[contactId]
}
public async roomMemberRawPayloadParser(
......@@ -867,6 +902,16 @@ export class PuppetPadchat extends Puppet {
return payload
}
public async roomPayloadDirty(roomId: string): Promise<void> {
log.verbose('PuppetPadchat', 'roomPayloadDirty(%s)', roomId)
if (this.padchatManager) {
this.padchatManager.roomRawPayloadDirty(roomId)
}
super.roomPayloadDirty(roomId)
}
public async roomRawPayload(
roomId: string,
): Promise<PadchatRoomPayload> {
......@@ -883,11 +928,7 @@ export class PuppetPadchat extends Puppet {
public async roomRawPayloadParser(rawPayload: PadchatRoomPayload): Promise<RoomPayload> {
log.verbose('PuppetPadchat', 'roomRawPayloadParser(rawPayload.user_name="%s")', rawPayload.user_name)
// const memberIdList = await this.bridge.getRoomMemberIdList()
// WXGetChatRoomMember(rawPayload.user_name)
const payload: RoomPayload = roomRawPayloadParser(rawPayload)
return payload
}
......@@ -929,6 +970,7 @@ export class PuppetPadchat extends Puppet {
// Should check whether user is in the room. WXDeleteChatRoomMember won't check if user in the room automatically
await this.padchatManager.WXDeleteChatRoomMember(roomId, contactId)
await this.roomMemberPayloadDirty(roomId)
}
public async roomQrcode(roomId: string): Promise<string> {
......@@ -975,6 +1017,7 @@ export class PuppetPadchat extends Puppet {
log.verbose('PuppetPadchat', 'roomAdd(%s, %s) try to Invite', roomId, contactId)
await this.padchatManager.WXInviteChatRoomMember(roomId, contactId)
}
await this.roomMemberPayloadDirty(roomId)
}
public async roomTopic(roomId: string) : Promise<string>
......@@ -996,6 +1039,7 @@ export class PuppetPadchat extends Puppet {
}
await this.padchatManager.WXSetChatroomName(roomId, topic)
await this.roomPayloadDirty(roomId)
return
}
......@@ -1125,6 +1169,16 @@ export class PuppetPadchat extends Puppet {
return payload
}
public async friendshipPayloadDirty(friendshipId: string): Promise<void> {
log.verbose('PuppetPadchat', 'friendshipPayloadDirty(%s)', friendshipId)
if (this.padchatManager) {
// this.padchatManager.friendshipRawPayloadDirty(friendshipId)
}
this.friendshipPayloadDirty(friendshipId)
}
public async friendshipRawPayload(friendshipId: string): Promise<PadchatMessagePayload> {
log.verbose('PuppetPadchat', 'friendshipRawPayload(%s)', friendshipId)
......
......@@ -10,6 +10,5 @@ export {
} from './puppet'
export {
WATCHDOG_TIMEOUT,
YOU,
} from './schemas/puppet'
......@@ -68,7 +68,6 @@ import {
PuppetOptions,
Receiver,
WATCHDOG_TIMEOUT,
YOU,
} from './schemas/puppet'
......@@ -94,13 +93,6 @@ export abstract class Puppet extends EventEmitter implements Sayable {
protected readonly watchdog : Watchdog
protected readonly counter : number
/**
* Watchdog Timeout in Seconds
* if set this value, the default timeout value will be overwrited,
* and the parent Puppet class will use it to init watchdog
*/
protected [WATCHDOG_TIMEOUT]?: number // Watchdog timeout, in seconds
/**
* childPkg stores the `package.json` that the NPM module who extends the `Puppet`
*/
......@@ -122,13 +114,16 @@ export abstract class Puppet extends EventEmitter implements Sayable {
public options: PuppetOptions,
) {
super()
log.verbose('Puppet', 'constructor(%s)', JSON.stringify(options))
this.counter = PUPPET_COUNTER++
this.state = new StateSwitch(this.constructor.name, log)
const timeout = this[WATCHDOG_TIMEOUT] || DEFAULT_WATCHDOG_TIMEOUT
this.watchdog = new Watchdog(1000 * timeout, 'Puppet')
this.options.timeout = this.options.timeout || DEFAULT_WATCHDOG_TIMEOUT
log.verbose('Puppet', 'constructor() watchdog timeout set to %d seconds', this.options.timeout)
this.watchdog = new Watchdog(1000 * this.options.timeout, 'Puppet')
const lruOptions: LRU.Options = {
max: 10000,
......@@ -377,6 +372,11 @@ export abstract class Puppet extends EventEmitter implements Sayable {
public abstract async contactRawPayload(contactId: string) : Promise<any>
public abstract async contactRawPayloadParser(rawPayload: any) : Promise<ContactPayload>
protected async contactPayloadDirty(contactId: string): Promise<void> {
log.verbose('Puppet', 'contactPayloadDirty(%s)', contactId)
this.cacheContactPayload.del(contactId)
}
public async contactSearch(
query? : ContactQueryFilter,
searchIdList? : string[],
......@@ -512,8 +512,9 @@ export abstract class Puppet extends EventEmitter implements Sayable {
*/
public abstract async friendshipVerify(contactId: string, hello?: string) : Promise<void>
public abstract async friendshipAccept(friendshipId: string) : Promise<void>
public abstract async friendshipRawPayload(friendshipId: string) : Promise<any>
public abstract async friendshipRawPayloadParser(rawPayload: any) : Promise<FriendshipPayload>
public abstract async friendshipRawPayload(friendshipId: string) : Promise<any>
public abstract async friendshipRawPayloadParser(rawPayload: any) : Promise<FriendshipPayload>
public friendshipPayloadCache(friendshipId: string): undefined | FriendshipPayload {
// log.silly('Puppet', 'friendshipPayloadCache(id=%s) @ %s', friendshipId, this)
......@@ -531,6 +532,11 @@ export abstract class Puppet extends EventEmitter implements Sayable {
return cachedPayload
}
protected async friendshipPayloadDirty(friendshipId: string): Promise<void> {
log.verbose('Puppet', 'friendshipPayloadDirty(%s)', friendshipId)
this.cacheFriendshipPayload.del(friendshipId)
}
public async friendshipPayload(
friendshipId: string,
noCache = false,
......@@ -595,6 +601,11 @@ export abstract class Puppet extends EventEmitter implements Sayable {
return cachedPayload
}
protected async messagePayloadDirty(messageId: string): Promise<void> {
log.verbose('Puppet', 'messagePayloadDirty(%s)', messageId)
this.cacheMessagePayload.del(messageId)
}
public async messagePayload(
messageId: string,
noCache = false,
......@@ -669,6 +680,9 @@ export abstract class Puppet extends EventEmitter implements Sayable {
if (!this.id) {
throw new Error('no puppet.id. need puppet to be login-ed for a search')
}
if (!query) {
throw new Error('no query')
}
/**
* 0. for YOU: 'You', '你' in sys message
......@@ -807,6 +821,11 @@ export abstract class Puppet extends EventEmitter implements Sayable {
return cachedPayload
}
protected async roomPayloadDirty(roomId: string): Promise<void> {
log.verbose('Puppet', 'roomPayloadDirty(%s)', roomId)
this.cacheRoomPayload.del(roomId)
}
public async roomPayload(
roomId: string,
noCache = false,
......@@ -869,12 +888,24 @@ export abstract class Puppet extends EventEmitter implements Sayable {
return cachedPayload
}
protected async roomMemberPayloadDirty(roomId: string): Promise<void> {
log.verbose('Puppet', 'roomMemberPayloadDirty(%s)', roomId)
const contactIdList = await this.roomMemberList(roomId)
let cacheKey
contactIdList.forEach(contactId => {
cacheKey = this.cacheKeyRoomMember(roomId, contactId)
this.cacheRoomMemberPayload.del(cacheKey)
})
}
public async roomMemberPayload(
roomId : string,
contactId : string,
noCache = false,
dirty = false,
): Promise<RoomMemberPayload> {
log.verbose('Puppet', 'roomMemberPayload(roomId=%s, contactId=%s noCache=%s)', roomId, contactId, noCache)
log.verbose('Puppet', 'roomMemberPayload(roomId=%s, contactId=%s noCache=%s)', roomId, contactId, dirty)
if (!roomId || !contactId) {
throw new Error('no id')
......@@ -882,11 +913,8 @@ export abstract class Puppet extends EventEmitter implements Sayable {
const cacheKey = this.cacheKeyRoomMember(roomId, contactId)
if (noCache) {
log.silly('Puppet', 'roomMemberPayload(%s) cache PURGE', roomId)
this.cacheRoomMemberPayload.del(cacheKey)
if (dirty) {
this.roomMemberPayloadDirty(roomId)
} else {
const cachedPayload = this.roomMemberPayloadCache(roomId, contactId)
......
......@@ -2,12 +2,6 @@ import {
MemoryCard,
} from 'memory-card'
/**
* Watchdog timeout
* in seconds
*/
export const WATCHDOG_TIMEOUT = Symbol('WATCHDOG_TIMEOUT')
/**
* This is used internally to as a placeholder for the bot name.
*
......@@ -66,8 +60,12 @@ export const PUPPET_EVENT_DICT = {
export type PuppetEventName = keyof typeof PUPPET_EVENT_DICT
/**
* timeout: WatchDog Timeout in Seconds
*/
export interface PuppetOptions {
memory: MemoryCard,
memory : MemoryCard,
timeout? : number,
}
export interface Receiver {
......
......@@ -606,7 +606,7 @@ export class Room extends Accessory implements Sayable {
* const contact = await Contact.find({name: 'lijiarui'}) // change 'lijiarui' to any of contact in your wechat
* const room = await Room.find({topic: 'wechaty'}) // change 'wechaty' to any of the room in your wechat
* if (contact && room) {
* if (room.has(contact)) {
* if (await room.has(contact)) {
* console.log(`${contact.name()} is in the room ${room.topic()}!`)
* } else {
* console.log(`${contact.name()} is not in the room ${room.topic()} !`)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册