From acb562db7104350a2f39c519f2f103a80f8a2c63 Mon Sep 17 00:00:00 2001 From: "Zhuohuan LI (CARPE DIEM)" Date: Sat, 1 Oct 2016 23:05:30 +0800 Subject: [PATCH] #32 add Room.modTopic --- src/puppet-web/bridge.js | 23 +++++++++++++++++ src/puppet-web/browser.js | 8 +++--- src/puppet-web/puppet-web.js | 11 ++++++++ src/puppet-web/wechaty-bro.js | 10 ++++++-- src/room.js | 47 ++++++++++++++++++++++++++++++++--- 5 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/puppet-web/bridge.js b/src/puppet-web/bridge.js index 69c64fb4..f989af63 100644 --- a/src/puppet-web/bridge.js +++ b/src/puppet-web/bridge.js @@ -152,6 +152,10 @@ class Bridge { } roomDelMember(roomId, contactId) { + if (!roomId || !contactId) { + throw new Error('no roomId or contactId') + } + return this.proxyWechaty('roomDelMember', roomId, contactId) .catch(e => { log.error('PuppetWebBridge', 'roomDelMember(%s, %s) exception: %s', roomId, contactId, e.message) @@ -160,6 +164,9 @@ class Bridge { } roomAddMember(roomId, contactId) { + if (!roomId || !contactId) { + throw new Error('no roomId or contactId') + } return this.proxyWechaty('roomAddMember', roomId, contactId) .catch(e => { log.error('PuppetWebBridge', 'roomAddMember(%s, %s) exception: %s', roomId, contactId, e.message) @@ -167,7 +174,23 @@ class Bridge { }) } + roomModTopic(roomId, topic) { + if (!roomId) { + throw new Error('no roomId') + } + + return this.proxyWechaty('roomModTopic', roomId, topic) + .catch(e => { + log.error('PuppetWebBridge', 'roomModTopic(%s, %s) exception: %s', roomId, topic, e.message) + throw e + }) + } + roomCreate(contactIdList) { + if (!contactIdList || !Array.isArray(contactIdList)) { + throw new Error('no valid contactIdList') + } + return this.proxyWechaty('roomCreate', contactIdList) .catch(e => { log.error('PuppetWebBridge', 'roomCreate(%s) exception: %s', contactIdList, e.message) diff --git a/src/puppet-web/browser.js b/src/puppet-web/browser.js index 6cfc23cd..6705a571 100644 --- a/src/puppet-web/browser.js +++ b/src/puppet-web/browser.js @@ -415,10 +415,10 @@ this.onResourceRequested = function(request, net) { // log.verbose('PuppetWebBrowser', `Browser.execute() driver.getSession: %s`, util.inspect(this.driver.getSession())) if (this.dead()) { return Promise.reject(new Error('browser dead')) } -// XXX -console.log('#############') -console.log(script) -console.log(args) + // XXX + // console.log('#############') + // console.log(script) + // console.log(args) return this.driver.executeScript.apply(this.driver, arguments) .catch(e => { diff --git a/src/puppet-web/puppet-web.js b/src/puppet-web/puppet-web.js index 1ea5071b..f83af54c 100644 --- a/src/puppet-web/puppet-web.js +++ b/src/puppet-web/puppet-web.js @@ -376,7 +376,18 @@ class PuppetWeb extends Puppet { log.warn('PuppetWeb', 'roomAddMember(%s) rejected: %s', contact, e.message) throw e }) + } + roomModTopic(room, topic) { + if (!this.bridge) { + return Promise.reject(new Error('fail: no bridge(yet)!')) + } + const roomId = room.get('id') + return this.bridge.roomModTopic(roomId, topic) + .catch(e => { + log.warn('PuppetWeb', 'roomModTopic(%s) rejected: %s', topic, e.message) + throw e + }) } roomCreate(contactList) { diff --git a/src/puppet-web/wechaty-bro.js b/src/puppet-web/wechaty-bro.js index 57056421..99408692 100644 --- a/src/puppet-web/wechaty-bro.js +++ b/src/puppet-web/wechaty-bro.js @@ -474,11 +474,16 @@ function roomAddMember(ChatRoomName, UserName) { const chatroomFactory = WechatyBro.glue.chatroomFactory // XXX - log(ChatRoomName) - log(UserName) + // log(ChatRoomName) + // log(UserName) return chatroomFactory.addMember(ChatRoomName, UserName) } + function roomModTopic(ChatRoomName, topic) { + const chatroomFactory = WechatyBro.glue.chatroomFactory + return chatroomFactory.modTopic(ChatRoomName, topic) + } + function roomCreate(UserNameList) { const UserNameListArg = UserNameList.map(n => { return { UserName: n } }) @@ -558,6 +563,7 @@ , roomCreate , roomAddMember , roomDelMember + , roomModTopic // test purpose , isLogin: isLogin diff --git a/src/room.js b/src/room.js index 5275f6c8..2210038a 100644 --- a/src/room.js +++ b/src/room.js @@ -14,6 +14,7 @@ class Room { log.silly('Room', `constructor(${id})`) this.id = id this.obj = {} + this.dirtyObj = {} // when refresh, use this to save dirty data for query if (!Room.puppet) { throw new Error('no puppet attached to Room') } @@ -23,10 +24,11 @@ class Room { toStringEx() { return `Room(${this.obj.name}[${this.id}])` } isReady() { - return this.obj.members && this.obj.members.length + return this.obj.memberList && this.obj.memberList.length } refresh() { + this.dirtyObj = this.obj this.obj = {} return this.ready() } @@ -40,7 +42,7 @@ class Room { } else if (this.isReady()) { return Promise.resolve(this) } else if (this.obj.id) { - log.warn('Room', 'ready() has obj.id but members list empty in room %s. reloading', this.obj.name) + log.warn('Room', 'ready() has obj.id but memberList empty in room %s. reloading', this.obj.name) } contactGetter = contactGetter || Room.puppet.getContact.bind(Room.puppet) @@ -57,7 +59,7 @@ class Room { } name() { return UtilLib.plainText(this.obj.name) } - get(prop) { return this.obj[prop] } + get(prop) { return this.obj[prop] || this.dirtyObj[prop] } parse(rawObj) { if (!rawObj) { @@ -67,7 +69,7 @@ class Room { id: rawObj.UserName , encryId: rawObj.EncryChatRoomId // ??? , name: rawObj.NickName - , members: this.parseMemberList(rawObj.MemberList) + , memberList: this.parseMemberList(rawObj.MemberList) } } @@ -99,6 +101,37 @@ class Room { throw new Error('contact not found') } return Room.puppet.roomDelMember(this, contact) + .then(r => this.delLocal(contact)) + } + + delLocal(contact) { + log.verbose('Room', 'delLocal(%s)', contact) + + const memberList = this.obj.memberList + if (!memberList || memberList.length === 0) { + return true // already in refreshing + } + + let i + for (i=0; i