diff --git a/src/contact.ts b/src/contact.ts index 65cf3a7a120617657c2d7a27358466814f646b8d..fb85716b2bf8ab3645264c190ef2b42bf9289746 100644 --- a/src/contact.ts +++ b/src/contact.ts @@ -186,6 +186,11 @@ export class Contact extends Accessory implements Sayable { } } + // TODO + public static async delete(contact: Contact): Promise { + log.verbose('Cotnact', 'static delete(%s)', contact.id) + } + /** * * Instance properties @@ -600,6 +605,28 @@ export class Contact extends Accessory implements Sayable { return this.payload && this.payload.weixin || null } + /** + * + * Need a new class for manage user profile + * + */ + // TODO: + public async qrcode(): Promise { + log.verbose('Contact', 'qrcode()') + + if (!this.self()) { + throw new Error('only can get qrcode for the login userself') + } + + return 'url of qrcode data for this contact(self only)' + } + + public async setAvatar(file: FileBox): Promise { + log.verbose('Contact', 'setAvatar(%s)', file.name) + + // should not in contact class ? + // too many methods that can only use on the login-ed userself. + } } export default Contact diff --git a/src/puppet-padchat/bridge.ts b/src/puppet-padchat/bridge.ts index 729a477082fa40da19b47024c9cd931c60a48de6..04b285ddf486966efd76a8be875d1842da3b503d 100644 --- a/src/puppet-padchat/bridge.ts +++ b/src/puppet-padchat/bridge.ts @@ -86,9 +86,6 @@ export class Bridge extends EventEmitter { super() // for EventEmitter log.verbose('PuppetPadchatBridge', 'constructor()') - // this.userId = options.token - // this.initCache() - this.autoData = {} this.padchatRpc = new PadchatRpc(options.endpoint, options.token) @@ -215,7 +212,9 @@ export class Bridge extends EventEmitter { public logout(): void { if (!this.selfId) { - throw new Error('no username') + // throw new Error('no username') + log.warn('PuppetPadchatBridge', 'logout() selfId not exist, already logout-ed') + return } this.selfId = undefined @@ -568,7 +567,7 @@ export class Bridge extends EventEmitter { public async syncRoomMember( roomId: string, ): Promise<{ [contactId: string]: PadchatRoomMemberPayload }> { - log.verbose('PuppetPadchatBridge', 'syncRoomMember(%s)', roomId) + log.silly('PuppetPadchatBridge', 'syncRoomMember(%s)', roomId) const memberListPayload = await this.padchatRpc.WXGetChatRoomMember(roomId) @@ -576,15 +575,14 @@ export class Bridge extends EventEmitter { throw new Error('no memberListPayload') } + log.silly('PuppetPadchatBridge', 'syncRoomMember(%s) total %d members', + roomId, + Object.keys(memberListPayload).length, + ) + const memberDict: { [contactId: string]: PadchatRoomMemberPayload } = {} for (const memberPayload of memberListPayload.member) { - log.info('PuppetPadchatBridge', 'syncRoomMember(%s) member(%s)="%s"', - roomId, - memberPayload.user_name, - JSON.stringify(memberPayload), - ) - const contactId = memberPayload.user_name memberDict[contactId] = memberPayload } @@ -628,10 +626,10 @@ export class Bridge extends EventEmitter { throw new Error('no cache') } - log.verbose('PuppetPadchatBridge', 'syncContactsAndRooms() update %d to Contact(%d) & Room(%d) ...', + log.silly('PuppetPadchatBridge', 'syncContactsAndRooms() updating %d to Contact(%d) & Room(%d) ...', syncContactList.length, - [...this.cacheContactRawPayload.keys()].length, - [...this.cacheRoomRawPayload.keys()].length, + this.cacheContactRawPayload.size, + this.cacheRoomRawPayload.size, ) for (const syncContact of syncContactList) { @@ -647,7 +645,7 @@ export class Bridge extends EventEmitter { /** * Room */ - log.verbose('PuppetPadchatBridge', 'syncContactsAndRooms() sync Room %s(%s)', + log.silly('PuppetPadchatBridge', 'syncContactsAndRooms() updating Room %s(%s)', syncContact.nick_name, syncContact.user_name, ) @@ -661,7 +659,7 @@ export class Bridge extends EventEmitter { /** * Contact */ - log.verbose('PuppetPadchatBridge', 'syncContactsAndRooms() sync Contact %s(%s)', + log.silly('PuppetPadchatBridge', 'syncContactsAndRooms() updating Contact %s(%s)', syncContact.nick_name, syncContact.user_name, ) @@ -693,41 +691,23 @@ export class Bridge extends EventEmitter { } } - // private async WXGetContact(id: string): Promise { - // const result = await this.jsonRpcCall('WXGetContact', [id]) - - // if (!result) { - // throw Error('PuppetPadchatBridge, WXGetContact, cannot get result from websocket server!') - // } - - // log.silly('PuppetPadchatBridge', 'WXGetContact(%s) result: %s', id, JSON.stringify(result)) - - // if (!result.user_name) { - // log.warn('PuppetPadchatBridge', 'WXGetContact cannot get user_name, id: %s', id) - // } - // if (result.member) { - // result.member = JSON.parse(decodeURIComponent(result.member)) - // } - // return result - // } - - public async contactRawPayload(id: string): Promise { - log.verbose('PuppetPadchatBridge', 'contactRawPayload(%s)', id) + public async contactRawPayload(contactid: string): Promise { + log.silly('PuppetPadchatBridge', 'contactRawPayload(%s)', contactid) const rawPayload = await Misc.retry(async (retry, attempt) => { - log.verbose('PuppetPadchatBridge', 'contactRawPayload(%s) retry() attempt=%d', id, attempt) + log.silly('PuppetPadchatBridge', 'contactRawPayload(%s) retry() attempt=%d', contactid, attempt) if (!this.cacheContactRawPayload) { throw new Error('no cache') } - if (this.cacheContactRawPayload.has(id)) { - return this.cacheContactRawPayload.get(id) + if (this.cacheContactRawPayload.has(contactid)) { + return this.cacheContactRawPayload.get(contactid) } - const tryRawPayload = await this.padchatRpc.WXGetContactPayload(id) + const tryRawPayload = await this.padchatRpc.WXGetContactPayload(contactid) if (tryRawPayload) { - this.cacheContactRawPayload.set(id, tryRawPayload) + this.cacheContactRawPayload.set(contactid, tryRawPayload) return tryRawPayload } return retry(new Error('tryRawPayload empty')) @@ -831,4 +811,12 @@ export class Bridge extends EventEmitter { public async WXAddUser(strangerV1: string, strangerV2: string, type: string, verify: string): Promise { await this.padchatRpc.WXAddUser(strangerV1, strangerV2, type, verify) } + + public async WXSetChatroomAnnouncement(chatroom: string, content: string): Promise { + await this.padchatRpc.WXSetChatroomAnnouncement(chatroom, content) + } + public async WXGetChatroomAnnouncement(chatroom: string): Promise { + return await this.padchatRpc.WXGetChatroomAnnouncement(chatroom) + } + } diff --git a/src/puppet-padchat/padchat-rpc.ts b/src/puppet-padchat/padchat-rpc.ts index e8f93115e4f74d1752e3482ef213a10c3b2dff22..247d74b0fdac1eaa36b13dc5dc6901108d1ddefe 100644 --- a/src/puppet-padchat/padchat-rpc.ts +++ b/src/puppet-padchat/padchat-rpc.ts @@ -259,6 +259,7 @@ export class PadchatRpc extends EventEmitter { if (padchatPayload.type === PadchatPayloadType.Logout) { // this.emit('logout', this.selfId()) + console.log('onSocketPadchat: ', JSON.stringify(padchatPayload)) this.emit('logout') } @@ -552,17 +553,36 @@ export class PadchatRpc extends EventEmitter { return emptyResult } - // tslint:disable-next-line:max-line-length - // change '[{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/DpS0ZssJ5s8tEpSr9JuPTRxEUrCK0USrZcR3PjOMfUKDwpnZLxWXlD4Q38bJpcXBtwXWwevsul1lJqwsQzwItQ/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"李佳芮","small_head":"http://wx.qlogo.cn/mmhead/ver_1/DpS0ZssJ5s8tEpSr9JuPTRxEUrCK0USrZcR3PjOMfUKDwpnZLxWXlD4Q38bJpcXBtwXWwevsul1lJqwsQzwItQ/132","user_name":"qq512436430"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/kcBj3gSibfFd2I9vQ8PBFyQ77cpPIfqkFlpTdkFZzBicMT6P567yj9IO6xG68WsibhqdPuG82tjXsveFATSDiaXRjw/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"梦君君","small_head":"http://wx.qlogo.cn/mmhead/ver_1/kcBj3gSibfFd2I9vQ8PBFyQ77cpPIfqkFlpTdkFZzBicMT6P567yj9IO6xG68WsibhqdPuG82tjXsveFATSDiaXRjw/132","user_name":"mengjunjun001"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/3CsKibSktDV05eReoAicV0P8yfmuHSowfXAMvRuU7HEy8wMcQ2eibcaO1ccS95PskZchEWqZibeiap6Gpb9zqJB1WmNc6EdD6nzQiblSx7dC1eGtA/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"苏轼","small_head":"http://wx.qlogo.cn/mmhead/ver_1/3CsKibSktDV05eReoAicV0P8yfmuHSowfXAMvRuU7HEy8wMcQ2eibcaO1ccS95PskZchEWqZibeiap6Gpb9zqJB1WmNc6EdD6nzQiblSx7dC1eGtA/132","user_name":"wxid_zj2cahpwzgie12"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/piaHuicak41b6ibmcEVxoWKnnhgGDG5EbaD0hibwkrRvKeDs3gs7XQrkym3Q5MlUeSKY8vw2FRVVstialggUxf2zic2O8CvaEsicSJcghf41nibA940/0","chatroom_nick_name":"","invited_by":"wxid_zj2cahpwzgie12","nick_name":"王宁","small_head":"http://wx.qlogo.cn/mmhead/ver_1/piaHuicak41b6ibmcEVxoWKnnhgGDG5EbaD0hibwkrRvKeDs3gs7XQrkym3Q5MlUeSKY8vw2FRVVstialggUxf2zic2O8CvaEsicSJcghf41nibA940/132","user_name":"wxid_7708837087612"}]' - // to Array (PadchatRoomRawMember[]) - if (Array.isArray(JSON.parse(decodeURIComponent(result.member)))) { - result.member = JSON.parse(decodeURIComponent(result.member)) as PadchatRoomMemberPayload[] - } else { - log.warn('PadchatRpc', 'WXGetChatRoomMember(%s) member is not array: %s', roomId, JSON.stringify(result.member)) - // throw Error('faild to parse chatroom member!') + try { + // tslint:disable-next-line:max-line-length + // change '[{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/DpS0ZssJ5s8tEpSr9JuPTRxEUrCK0USrZcR3PjOMfUKDwpnZLxWXlD4Q38bJpcXBtwXWwevsul1lJqwsQzwItQ/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"李佳芮","small_head":"http://wx.qlogo.cn/mmhead/ver_1/DpS0ZssJ5s8tEpSr9JuPTRxEUrCK0USrZcR3PjOMfUKDwpnZLxWXlD4Q38bJpcXBtwXWwevsul1lJqwsQzwItQ/132","user_name":"qq512436430"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/kcBj3gSibfFd2I9vQ8PBFyQ77cpPIfqkFlpTdkFZzBicMT6P567yj9IO6xG68WsibhqdPuG82tjXsveFATSDiaXRjw/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"梦君君","small_head":"http://wx.qlogo.cn/mmhead/ver_1/kcBj3gSibfFd2I9vQ8PBFyQ77cpPIfqkFlpTdkFZzBicMT6P567yj9IO6xG68WsibhqdPuG82tjXsveFATSDiaXRjw/132","user_name":"mengjunjun001"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/3CsKibSktDV05eReoAicV0P8yfmuHSowfXAMvRuU7HEy8wMcQ2eibcaO1ccS95PskZchEWqZibeiap6Gpb9zqJB1WmNc6EdD6nzQiblSx7dC1eGtA/0","chatroom_nick_name":"","invited_by":"wxid_7708837087612","nick_name":"苏轼","small_head":"http://wx.qlogo.cn/mmhead/ver_1/3CsKibSktDV05eReoAicV0P8yfmuHSowfXAMvRuU7HEy8wMcQ2eibcaO1ccS95PskZchEWqZibeiap6Gpb9zqJB1WmNc6EdD6nzQiblSx7dC1eGtA/132","user_name":"wxid_zj2cahpwzgie12"},{"big_head":"http://wx.qlogo.cn/mmhead/ver_1/piaHuicak41b6ibmcEVxoWKnnhgGDG5EbaD0hibwkrRvKeDs3gs7XQrkym3Q5MlUeSKY8vw2FRVVstialggUxf2zic2O8CvaEsicSJcghf41nibA940/0","chatroom_nick_name":"","invited_by":"wxid_zj2cahpwzgie12","nick_name":"王宁","small_head":"http://wx.qlogo.cn/mmhead/ver_1/piaHuicak41b6ibmcEVxoWKnnhgGDG5EbaD0hibwkrRvKeDs3gs7XQrkym3Q5MlUeSKY8vw2FRVVstialggUxf2zic2O8CvaEsicSJcghf41nibA940/132","user_name":"wxid_7708837087612"}]' + // to Array (PadchatRoomRawMember[]) + if (Array.isArray(JSON.parse(decodeURIComponent(result.member)))) { + result.member = JSON.parse(decodeURIComponent(result.member)) as PadchatRoomMemberPayload[] + } else { + log.warn('PadchatRpc', 'WXGetChatRoomMember(%s) member is not array: %s', roomId, JSON.stringify(result.member)) + // throw Error('faild to parse chatroom member!') + result.member = [] + } + } catch (e) { + // 18:27:54 SILL Puppet contactPayload(shanzhifeng644634) cache MISS + // tslint:disable-next-line:max-line-length + // 18:27:55 SILL PadchatRpc WXGetChatRoomMember() result: {"chatroom_id":700002836,"count":442,"member":"[{\"big_head\":\"http://wx.qlogo.cn/mmhead/ver_1/VCnC8c3icQpcsCpMeSq1w2MZm6Q3ZNqHINoOUhUic9icB3Tm6BK9hyyB9XiaFxjVNIHF0oO11zZTez0nictu2nRWLH7OaKcRkZQdiaz0UjjYlBeWk/0\",\"chatroom_nick_name\":\"宁杰+野生土蜂蜜\",\"invited_by\":\"\",\"nick_name\":\"宁杰¥野生土蜂蜜\",\"small_head\":\"http://wx.qlogo.cn/mmhead/ver_1/VCnC8c3icQpcsCpMeSq1w2MZm6Q3ZNqHINoOUhUic9icB3Tm6BK9hyyB9XiaFxjVNIHF0oO11zZTez0nictu2nRWLH7OaKcRkZQdiaz0UjjYlBeWk/132\",\"user_name\":\"jack_85802\"},{\"b + // 18:27:55 ERR Config ########################### + // 18:27:55 ERR Config unhandledRejection: URIError: URI malformed [object Promise] + // 18:27:55 ERR Config ########################### + // 18:27:55 ERR Config process.on(unhandledRejection) promise.catch(URI malformed) + // Config URIError: URI malformed + // at decodeURIComponent () + // at PadchatRpc. (/home/zixia/chatie/wechaty/src/puppet-padchat/padchat-rpc.ts:559:34) + // at Generator.next () + // at fulfilled (/home/zixia/chatie/wechaty/src/puppet-padchat/padchat-rpc.ts:4:58) + // at process._tickCallback (internal/process/next_tick.js:68:7) + // (node:22232) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 834) + console.error(e) + log.warn('PadchatRpc', 'WXGetChatRoomMember(%s) result.member decode error: %s', roomId, e) result.member = [] } - return result } @@ -1337,4 +1357,16 @@ export class PadchatRpc extends EventEmitter { } return result } + + // FIXME: does Get exist? + // FIXME2: what's the structure of result? result.data??? + public async WXGetChatroomAnnouncement(chatroom: string): Promise { + const result = await this.rpcCall('WXGetChatroomAnnouncement', chatroom) + log.silly('PadchatRpc', 'WXGetChatroomAnnouncement ,result: %s', JSON.stringify(result)) + if (!result || result.status !== 0) { + throw Error('WXGetChatroomAnnouncement , error! canot get result from websocket server') + } + return result.data + } + } diff --git a/src/puppet-padchat/padchat-schemas.ts b/src/puppet-padchat/padchat-schemas.ts index 97ce178948c34b48dbe66d67891ace0a7ed7b889..094bdc37f334494ba2f411a8b3e05d957cf7da2b 100644 --- a/src/puppet-padchat/padchat-schemas.ts +++ b/src/puppet-padchat/padchat-schemas.ts @@ -27,6 +27,7 @@ export enum PadchatContactRoomStatus { } export enum PadchatRoomMemberStatus { + Zero = 0, Todo, } diff --git a/src/puppet-padchat/puppet-padchat.ts b/src/puppet-padchat/puppet-padchat.ts index d1fb78f99a3f162896d45dc59589a6f89805571b..e6d4d0243754d27b4b2dde1f26036fe9f6982812 100644 --- a/src/puppet-padchat/puppet-padchat.ts +++ b/src/puppet-padchat/puppet-padchat.ts @@ -74,6 +74,7 @@ import { PadchatRoomPayload, // PadchatRoomMemberListPayload, PadchatRoomMemberPayload, + PadchatMessageType, // PadchatMessageType, // PadchatContinue, @@ -89,7 +90,7 @@ export type ScanFoodType = 'scan' | 'login' | 'logout' export class PuppetPadchat extends Puppet { // private readonly cachePadchatContactPayload : LRU.Cache - // private readonly cachePadchatFriendRequestRawPayload : LRU.Cache + private readonly cachePadchatFriendRequestPayload : LRU.Cache private readonly cachePadchatMessagePayload : LRU.Cache // private readonly cachePadchatRoomPayload : LRU.Cache @@ -110,7 +111,7 @@ export class PuppetPadchat extends Puppet { } // this.cachePadchatContactPayload = new LRU(lruOptions) - // this.cacheFriendRequestPayload = new LRU(lruOptions) + this.cachePadchatFriendRequestPayload = new LRU(lruOptions) this.cachePadchatMessagePayload = new LRU(lruOptions) // this.cachePadchatRoomPayload = new LRU(lruOptions) @@ -218,13 +219,8 @@ export class PuppetPadchat extends Puppet { this.bridge.on('logout', () => { this.logout() }) - this.bridge.on('message', (messagePayload: PadchatMessagePayload) => { - log.silly('PuppetPadchat', 'startBridge() bridge.on(message)') - this.cachePadchatMessagePayload.set( - messagePayload.msg_id, - messagePayload, - ) - this.emit('message', messagePayload.msg_id) + this.bridge.on('message', (rawPayload: PadchatMessagePayload) => { + this.onPadchatMessage(rawPayload) }) this.bridge.on('scan', (qrCode: string, status: number, data?: string) => { this.emit('scan', qrCode, status, data) @@ -233,6 +229,28 @@ export class PuppetPadchat extends Puppet { await this.bridge.start() } + protected onPadchatMessage(rawPayload: PadchatMessagePayload) { + log.verbose('PuppetPadchat', 'onPadchatMessage({id=%s, type=%s(%s)})', + rawPayload.msg_id, + PadchatMessageType[rawPayload.sub_type], + rawPayload.msg_type, + ) + switch (rawPayload.sub_type) { + case PadchatMessageType.VerifyMsg: + this.cachePadchatFriendRequestPayload.set(rawPayload.msg_id, rawPayload) + this.emit('friend', rawPayload.msg_id) + break + + default: + this.cachePadchatMessagePayload.set( + rawPayload.msg_id, + rawPayload, + ) + this.emit('message', rawPayload.msg_id) + break + } + } + public async stop(): Promise { log.verbose('PuppetPadchat', 'quit()') @@ -311,14 +329,14 @@ export class PuppetPadchat extends Puppet { } public async contactRawPayload(contactId: string): Promise { - log.verbose('PuppetPadchat', 'contactRawPayload(%s)', contactId) + log.silly('PuppetPadchat', 'contactRawPayload(%s)', contactId) const rawPayload = await this.bridge.contactRawPayload(contactId) return rawPayload } public async contactRawPayloadParser(rawPayload: PadchatContactPayload): Promise { - log.verbose('PuppetPadchat', 'contactRawPayloadParser(rawPayload.user_name="%s")', rawPayload.user_name) + log.silly('PuppetPadchat', 'contactRawPayloadParser({user_name="%s"})', rawPayload.user_name) const payload: ContactPayload = pfHelper.contactRawPayloadParser(rawPayload) return payload @@ -562,6 +580,18 @@ export class PuppetPadchat extends Puppet { await this.bridge.WXQuitChatRoom(roomId) } + public async roomAnnounce(roomId: string) : Promise + public async roomAnnounce(roomId: string, text: string) : Promise + + public async roomAnnounce(roomId: string, text?: string): Promise { + log.verbose('PuppetPadchat', 'roomAnnounce(%s, %s)', roomId, text ? text : '') + if (text) { + await this.bridge.WXSetChatroomAnnouncement(roomId, text) + } else { + return await this.bridge.WXGetChatroomAnnouncement(roomId) + } + } + /** * * FriendRequest @@ -615,23 +645,22 @@ export class PuppetPadchat extends Puppet { // ) } - public async friendRequestRawPayloadParser(rawPayload: any) : Promise { + public async friendRequestRawPayloadParser(rawPayload: PadchatMessagePayload) : Promise { log.verbose('PuppetPadchat', 'friendRequestRawPayloadParser(%s)', rawPayload) const payload: FriendRequestPayload = pfHelper.friendRequestRawPayloadParser(rawPayload) return payload } - public async friendRequestRawPayload(id: string): Promise { - // log.verbose('PuppetPadchat', 'friendRequestRawPayload(%s)', id) + public async friendRequestRawPayload(friendRequestId: string): Promise { + log.verbose('PuppetPadchat', 'friendRequestRawPayload(%s)', friendRequestId) - throw new Error('todo: ' + id) - // const rawPayload = this.cacheMessageRawPayload.get(id) - // if (!rawPayload) { - // throw new Error('no rawPayload') - // } + const rawPayload = this.cachePadchatFriendRequestPayload.get(friendRequestId) + if (!rawPayload) { + throw new Error('no rawPayload') + } - // return rawPayload + return rawPayload } } diff --git a/src/puppet-padchat/pure-function-helper.ts b/src/puppet-padchat/pure-function-helper.ts index 7d0179b49572b68ba65f594b6fb21d34978c73f4..e14400bb75d406c359c4a1bde951802917cf91c8 100644 --- a/src/puppet-padchat/pure-function-helper.ts +++ b/src/puppet-padchat/pure-function-helper.ts @@ -135,7 +135,7 @@ export class PadchatPureFunctionHelper { rawPayload: PadchatMessagePayload, ): MessagePayload { - console.log(rawPayload) + // console.log(rawPayload) let type: MessageType @@ -189,10 +189,11 @@ export class PadchatPureFunctionHelper { // Msg from room if (this.isRoomId(rawPayload.from_user)) { + const parts = rawPayload.content.split(':\n') // update fromId to actual sender instead of the room - payloadBase.fromId = rawPayload.content.split(':\n')[0] + payloadBase.fromId = parts[0] // update the text to actual text of the message - payloadBase.text = rawPayload.content.split(':\n')[1] + payloadBase.text = parts[1] roomId = rawPayload.from_user @@ -236,39 +237,22 @@ export class PadchatPureFunctionHelper { public static roomRawPayloadParser( rawPayload : PadchatRoomPayload, - // roomRawMemberList : PadchatRoomMember[], ): RoomPayload { - // const aliasDict = {} as { [id: string]: string | undefined } - - // if (Array.isArray(roomRawMemberList)) { - // roomRawMemberList.forEach( - // rawMember => { - // aliasDict[rawMember.user_name] = rawMember.chatroom_nick_name - // }, - // ) - // } - - // const memberIdList = roomRawMemberList.map(m => m.user_name) - const payload: RoomPayload = { id : rawPayload.user_name, topic : rawPayload.nick_name, ownerId : rawPayload.chatroom_owner, - // memberIdList, - // aliasDict, } return payload } public static friendRequestRawPayloadParser( - rawPayload: any, + rawPayload: PadchatMessagePayload, ) : FriendRequestPayload { - // to do: - throw new Error('todo' + rawPayload) - - // switch (rawPayload.MsgType) { - // case WebMessageType.VERIFYMSG: + throw new Error('to do ' + rawPayload) + // switch (rawPayload.sub_type) { + // case PadchatMessageType.VerifyMsg: // if (!rawPayload.RecommendInfo) { // throw new Error('no RecommendInfo') // } @@ -287,7 +271,7 @@ export class PadchatPureFunctionHelper { // } // return payloadReceive - // case WebMessageType.SYS: + // case PadchatMessageType.Sys: // const payloadConfirm: FriendRequestPayloadConfirm = { // id : rawPayload.MsgId, // contactId : rawPayload.FromUserName, @@ -298,7 +282,6 @@ export class PadchatPureFunctionHelper { // default: // throw new Error('not supported friend request message raw payload') // } - } public static async imageBase64ToQrCode(base64: string): Promise { diff --git a/src/puppet/puppet.ts b/src/puppet/puppet.ts index c1eaa472ce5d56243f7640c3483082047d3f9da6..383ce28c5926ea8a05cac85ee68869c28c88c0e6 100644 --- a/src/puppet/puppet.ts +++ b/src/puppet/puppet.ts @@ -354,7 +354,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { */ public abstract async contactAlias(contactId: string) : Promise public abstract async contactAlias(contactId: string, alias: string | null) : Promise - public abstract async contactAlias(contactId: string, alias?: string|null) : Promise + // public abstract async contactAlias(contactId: string, alias?: string|null) : Promise public abstract async contactAvatar(contactId: string) : Promise public abstract async contactList() : Promise @@ -464,7 +464,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { } if (noCache) { - log.silly('Puppet', 'contactPayload() cache PURGE') + log.silly('Puppet', 'contactPayload(%s) cache PURGE', contactId) this.cacheContactPayload.del(contactId) @@ -484,7 +484,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { const payload = await this.contactRawPayloadParser(rawPayload) this.cacheContactPayload.set(contactId, payload) - log.silly('Puppet', 'contactPayload() cache SET') + log.silly('Puppet', 'contactPayload(%s) cache SET', contactId) return payload } @@ -527,7 +527,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { } if (noCache) { - log.silly('Puppet', 'friendRequestPayload() cache PURGE') + log.silly('Puppet', 'friendRequestPayload(%s) cache PURGE', friendRequestId) this.cacheFriendRequestPayload.del(friendRequestId) @@ -590,7 +590,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { } if (noCache) { - log.silly('Puppet', 'messagePayload() cache PURGE') + log.silly('Puppet', 'messagePayload(%s) cache PURGE', messageId) this.cacheMessagePayload.del(messageId) @@ -610,7 +610,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { const payload = await this.messageRawPayloadParser(rawPayload) this.cacheMessagePayload.set(messageId, payload) - log.silly('Puppet', 'messagePayload() cache SET') + log.silly('Puppet', 'messagePayload(%s) cache SET', messageId) return payload } @@ -639,6 +639,9 @@ export abstract class Puppet extends EventEmitter implements Sayable { public abstract async roomMemberRawPayload(roomId: string, contactId: string) : Promise public abstract async roomMemberRawPayloadParser(rawPayload: any) : Promise + public abstract async roomAnnounce(roomId: string) : Promise + public abstract async roomAnnounce(roomId: string, text: string) : Promise + public async roomMemberSearch( roomId : string, query : string | RoomMemberQueryFilter, @@ -790,7 +793,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { } if (noCache) { - log.silly('Puppet', 'roomPayload() cache PURGE') + log.silly('Puppet', 'roomPayload(%s) cache PURGE', roomId) this.cacheRoomPayload.del(roomId) @@ -810,7 +813,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { const payload = await this.roomRawPayloadParser(rawPayload) this.cacheRoomPayload.set(roomId, payload) - log.silly('Puppet', 'roomPayload() cache SET') + log.silly('Puppet', 'roomPayload(%s) cache SET', roomId) return payload } @@ -833,9 +836,9 @@ export abstract class Puppet extends EventEmitter implements Sayable { const cachedPayload = this.cacheRoomMemberPayload.get(cacheKey) if (cachedPayload) { - log.silly('Puppet', 'roomMemberPayloadCache() cache HIT') + log.silly('Puppet', 'roomMemberPayloadCache(%s) cache HIT', roomId) } else { - log.silly('Puppet', 'roomMemberPayloadCache() cache MISS') + log.silly('Puppet', 'roomMemberPayloadCache(%s) cache MISS', roomId) } return cachedPayload @@ -855,7 +858,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { const cacheKey = this.cacheKeyRoomMember(roomId, contactId) if (noCache) { - log.silly('Puppet', 'roomMemberPayload() cache PURGE') + log.silly('Puppet', 'roomMemberPayload(%s) cache PURGE', roomId) this.cacheRoomMemberPayload.del(cacheKey) @@ -874,7 +877,7 @@ export abstract class Puppet extends EventEmitter implements Sayable { const payload = await this.roomMemberRawPayloadParser(rawPayload) this.cacheRoomMemberPayload.set(cacheKey, payload) - log.silly('Puppet', 'roomMemberPayload() cache SET') + log.silly('Puppet', 'roomMemberPayload(%s) cache SET', roomId) return payload } diff --git a/src/room.ts b/src/room.ts index d1d1b45a19e4897e7a24c27bb476b746c99202a4..83097ff633a898723b026b1ac39f92db158d79b2 100644 --- a/src/room.ts +++ b/src/room.ts @@ -538,6 +538,25 @@ export class Room extends Accessory implements Sayable { return future } + public async announce() : Promise + public async announce(text: string) : Promise + + public async announce(text?: string): Promise { + log.verbose('Room', 'announce(%s)', text ? text : '') + + if (text) { + await this.puppet.roomAnnounce(this.id, text) + } else { + return await this.puppet.roomAnnounce(this.id) + } + } + + // TODO + public async qrcode(): Promise { + log.verbose('Room', 'qrcode()') + return 'qrcode url for entry room' + } + /** * Return contact's roomAlias in the room, the same as roomAlias * @param {Contact} contact