diff --git a/src/room.js b/src/room.js index 1dddfbf4f4ad9449238aac558fcd7cf48ee58f8a..5e415cd7110bfc2f8011628f2bd0fa31055ea8d7 100644 --- a/src/room.js +++ b/src/room.js @@ -68,8 +68,25 @@ class Room extends EventEmitter{ }) } - owner() { return this.obj.memberList && this.obj.memberList[0] } - topic() { return UtilLib.plainText(this.obj.topic) } + owner() { + const ownerUin = this.obj.ownerUin + let memberList = this.obj.memberList || [] + + let user = Config.puppetInstance() + .user + + if (user && user.get('uin') === ownerUin) { + return user + } + + memberList = memberList.filter(m => m.Uin === ownerUin) + if (memberList.length > 0) { + return memberList[0] + } + + return null + } + get(prop) { return this.obj[prop] || this.dirtyObj[prop] } parse(rawObj) { @@ -77,9 +94,11 @@ class Room extends EventEmitter{ return {} } return { - id: rawObj.UserName - , encryId: rawObj.EncryChatRoomId // ??? - , topic: rawObj.NickName + id: rawObj.UserName + , encryId: rawObj.EncryChatRoomId // ??? + , topic: rawObj.NickName + , ownerUin: rawObj.OwnerUin + , memberList: this.parseMemberList(rawObj.MemberList) , nickMap: this.parseNickMap(rawObj.MemberList) } @@ -95,7 +114,9 @@ class Room extends EventEmitter{ parseNickMap(memberList) { const nickMap = {} if (memberList && memberList.map) { - memberList.forEach(m => nickMap[m.UserName] = m.DisplayName) + memberList.forEach(m => { + nickMap[m.UserName] = m.DisplayName || m.NickName + }) } return nickMap } @@ -172,7 +193,8 @@ class Room extends EventEmitter{ Config.puppetInstance().roomTopic(this, newTopic) return newTopic } - return this.get('topic') + // return this.get('topic') + return UtilLib.plainText(this.obj.topic) } nick(contact) { diff --git a/test/room.spec.js b/test/room.spec.js index 77301058ec203e42900ea7b28b88c2dc8ca06d42..acba381f616e100c47d6dc2bbc6f6f1297c1dbe2 100644 --- a/test/room.spec.js +++ b/test/room.spec.js @@ -13,61 +13,106 @@ import { Config.puppetInstance(new PuppetWeb()) // Room.attach(new PuppetWeb()) -test('Room smoke testing', async t => { +// test('Room smoke testing', async t => { + +// const UserName = '@0bb3e4dd746fdbd4a80546aef66f4085' +// const NickName = 'Nick Name Test' +// const EncryChatRoomId = '123456abcdef' + +// // Mock +// const mockContactGetter = function (id) { +// return new Promise((resolve,reject) => { +// if (id!=UserName) return resolve({}); +// setTimeout(() => { +// return resolve({ +// UserName: UserName +// , NickName: NickName +// , EncryChatRoomId: EncryChatRoomId +// }) +// }, 200) +// }) +// } + +// const r = new Room(UserName) + +// t.is(r.id, UserName, 'id/UserName right') + +// await r.ready(mockContactGetter) + +// // .then(r => { +// t.is(r.get('id') , UserName, 'UserName set') +// t.is(r.get('topic') , NickName, 'NickName set') +// t.is(r.get('encryId') , EncryChatRoomId, 'EncryChatRoomId set') + +// const s = r.toString() +// t.is(typeof s, 'string', 'toString()') +// // }) +// // .catch(e => t.fail('ready() rejected: ' + e)) +// // .then(_ => t.end()) // test end +// }) + +test('Room smoking test', async t => { + const RAW_OBJ = JSON.parse(` + {"RemarkPYQuanPin":"","RemarkPYInitial":"","PYInitial":"TZZGQNTSHGFJ","PYQuanPin":"tongzhizhongguoqingniantianshihuiguanfangjia","Uin":0,"UserName":"@@e2355db381dc46a77c0b95516d05e7486135cb6370d8a6af66925d89d50ec278","NickName":"(通知)中国青年天使会官方家","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=670397504&username=@@e2355db381dc46a77c0b95516d05e7486135cb6370d8a6af66925d89d50ec278&skey=","ContactFlag":2,"MemberCount":146,"MemberList":[{"Uin":0,"UserName":"@ecff4a7a86f23455dc42317269aa36ab","NickName":"童玮亮","AttrStatus":103423,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"","KeyWord":"dap","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@ecff4a7a86f23455dc42317269aa36ab&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":0,"UserName":"@eac4377ecfd59e4321262f892177169f","NickName":"麦刚","AttrStatus":33674247,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"","KeyWord":"mai","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@eac4377ecfd59e4321262f892177169f&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":0,"UserName":"@ad85207730aa94e006ddce28f74e6878","NickName":"田美坤Maggie","AttrStatus":112679,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"田美坤","KeyWord":"tia","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@ad85207730aa94e006ddce28f74e6878&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":2351423900,"UserName":"@33cc239d22b20d56395bbbd0967b28b9","NickName":"周宏光","AttrStatus":327869,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"周宏光","KeyWord":"acc","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@33cc239d22b20d56395bbbd0967b28b9&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":0,"UserName":"@5e77381e1e3b5641ddcee44670b6e83a","NickName":"牛文文","AttrStatus":100349,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"","KeyWord":"niu","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@5e77381e1e3b5641ddcee44670b6e83a&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":0,"UserName":"@56941ef97f3e9c70af88667fdd613b44","NickName":"羊东 东方红酒窖","AttrStatus":33675367,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"","KeyWord":"Yan","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@56941ef97f3e9c70af88667fdd613b44&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":0,"UserName":"@72c4767ce32db488871fdd1c27173b81","NickName":"李竹~英诺天使(此号已满)","AttrStatus":235261,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"","KeyWord":"liz","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@72c4767ce32db488871fdd1c27173b81&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":0,"UserName":"@0b0e2eb9501ab2d84f9f800f6a0b4216","NickName":"周静彤 杨宁助理","AttrStatus":230885,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"","KeyWord":"zlo","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@0b0e2eb9501ab2d84f9f800f6a0b4216&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":0,"UserName":"@4bfa767be0cd3fb78409b9735d1dcc57","NickName":"周哲 Jeremy","AttrStatus":33791995,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"","KeyWord":"zho","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@4bfa767be0cd3fb78409b9735d1dcc57&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"},{"Uin":0,"UserName":"@ad954bf2159a572b7743a5bc134739f4","NickName":"vicky张","AttrStatus":100477,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"","KeyWord":"hua","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@ad954bf2159a572b7743a5bc134739f4&skey=@crypt_f9cec94b_f23a307a23231cfb5098faf91ff759ca&chatroomid=@4b8baa99bdfc354443711412126d2aaf"}],"RemarkName":"","HideInputBarFlag":0,"Sex":0,"Signature":"","VerifyFlag":0,"OwnerUin":2351423900,"StarFriend":0,"AppAccountFlag":0,"Statues":0,"AttrStatus":0,"Province":"","City":"","Alias":"","SnsFlag":0,"UniFriend":0,"DisplayName":"","ChatRoomId":0,"KeyWord":"","EncryChatRoomId":"@4b8baa99bdfc354443711412126d2aaf","MMFromBatchGet":true,"MMOrderSymbol":"TONGZHIZHONGGUOQINGNIANTIANSHIHUIGUANFANGJIA","MMFromBatchget":true,"MMInChatroom":true} + `) - const UserName = '@0bb3e4dd746fdbd4a80546aef66f4085' - const NickName = 'Nick Name Test' - const EncryChatRoomId = '123456abcdef' + const EXPECTED = { + id: '@@e2355db381dc46a77c0b95516d05e7486135cb6370d8a6af66925d89d50ec278' + , topic: '(通知)中国青年天使会官方家' + , encryId: '@4b8baa99bdfc354443711412126d2aaf' + , memberId1: '@ad85207730aa94e006ddce28f74e6878' + , memberNick1: '田美坤' + , memberId2: '@72c4767ce32db488871fdd1c27173b81' + , memberNick2: '李竹~英诺天使(此号已满)' + , ownerId: '@33cc239d22b20d56395bbbd0967b28b9' + } // Mock const mockContactGetter = function (id) { return new Promise((resolve,reject) => { - if (id!=UserName) return resolve({}); + if (id!=EXPECTED.id) return resolve({}); setTimeout(() => { - return resolve({ - UserName: UserName - , NickName: NickName - , EncryChatRoomId: EncryChatRoomId - }) - }, 200) + return resolve(RAW_OBJ) + }, 10) }) } - const r = new Room(UserName) + const r = new Room(EXPECTED.id) - t.is(r.id, UserName, 'id/UserName right') + t.is(r.id, EXPECTED.id, 'should set id/UserName right') await r.ready(mockContactGetter) - // .then(r => { - t.is(r.get('id') , UserName, 'UserName set') - t.is(r.get('topic') , NickName, 'NickName set') - t.is(r.get('encryId') , EncryChatRoomId, 'EncryChatRoomId set') + t.is(r.get('id') , EXPECTED.id, 'should set id/UserName') + t.is(r.get('encryId') , EXPECTED.encryId, 'should set EncryChatRoomId') - const s = r.toString() - t.is(typeof s, 'string', 'toString()') - // }) - // .catch(e => t.fail('ready() rejected: ' + e)) - // .then(_ => t.end()) // test end -}) -/* - const rawData = JSON.parse('{"MsgId":"1120003476579027592","FromUserName":"@@4aa0ae1e1ebc568b613fa43ce93b478df0339f73340d87083822c2016d2e53d9","ToUserName":"@94e4b0db79ccc844d7bb4a2b1efac3ff","MsgType":1,"Content":"@9ad4ba13fac52c55d323521b67f7cc39:
[Strong]","Status":3,"ImgStatus":1,"CreateTime":1462889712,"VoiceLength":0,"PlayLength":0,"FileName":"","FileSize":"","MediaId":"","Url":"","AppMsgType":0,"StatusNotifyCode":0,"StatusNotifyUserName":"","RecommendInfo":{"UserName":"","NickName":"","QQNum":0,"Province":"","City":"","Content":"","Signature":"","Alias":"","Scene":0,"VerifyFlag":0,"AttrStatus":0,"Sex":0,"Ticket":"","OpCode":0},"ForwardFlag":0,"AppInfo":{"AppID":"","Type":0},"HasProductId":0,"Ticket":"","ImgHeight":0,"ImgWidth":0,"SubMsgType":0,"NewMsgId":1120003476579027600,"MMPeerUserName":"@@4aa0ae1e1ebc568b613fa43ce93b478df0339f73340d87083822c2016d2e53d9","MMDigest":"感恩的心 ","MMIsSend":false,"MMIsChatRoom":true,"MMUnread":false,"LocalID":"1120003476579027592","ClientMsgId":"1120003476579027592","MMActualContent":"HTML-CODE","MMActualSender":"@9ad4ba13fac52c55d323521b67f7cc39","MMDigestTime":"22:15","MMDisplayTime":1462889712,"MMTime":"22:15","_h":126,"_index":0,"_offsetTop":0,"$$hashKey":"0QK", "MemberList": [{"Uin":0,"UserName":"@94e4b0db79ccc844d7bb4a2b1efac3ff","NickName":"李卓桓","AttrStatus":37996631,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"北京阿布","KeyWord":"liz"},{"Uin":0,"UserName":"@34887973779b7dd827366a31772cd83df223e6f71d9a79e44fe619aafe2901a4","NickName":"Tiger","AttrStatus":4292711,"PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","MemberStatus":0,"DisplayName":"DisplayNameTiger","KeyWord":"","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@34887973779b7dd827366a31772cd83df223e6f71d9a79e44fe619aafe2901a4&skey=@crypt_f9cec94b_8517b7f9fec85f5a78a804c4f45f5536&chatroomid=@7b3dcd218431d79045cda3493c3179ae"}]}') + t.is(r.topic() , EXPECTED.topic, 'should set topic/NickName') - const EXPECTED = { - id: '1120003476579027592' - , from: '@0bb3e4dd746fdbd4a80546aef66f4085' - } - const g = new Room(rawData) + const contact1 = new Contact(EXPECTED.memberId1) + const nick1 = r.nick(contact1) + t.is(nick1, EXPECTED.memberNick1, 'should get nick1 from DisplayName') - t.is(g.id , EXPECTED.id , 'id right') - t.is(g.from.id , EXPECTED.from , 'from right') + const contact2 = new Contact(EXPECTED.memberId2) + const nick2 = r.nick(contact2) + t.is(nick2, EXPECTED.memberNick2, 'should get nick2 from NickName because there is no DisplayName, ') - const s = g.toString() - t.is(typeof s, 'string', 'toString()') + t.truthy(r.has(contact1), 'should has contact1') + t.falsy(r.has(new Contact('not exist id'), 'should has no this member')) + + const owner = r.owner() + t.true(owner === null || owner instanceof Contact, 'should get Contact instance for owner, or null') + + // wxApp hide uin for all contacts. + // t.is(r.owner().id, EXPECTED.ownerId, 'should get owner right by OwnerUin & Uin') - t.end() + const contactA = r.member(EXPECTED.memberNick1) + const contactB = r.member(EXPECTED.memberNick2) + t.is(contactA.id, EXPECTED.memberId1, 'should get the right id from nick 1') + t.is(contactB.id, EXPECTED.memberId2, 'should get the right id from nick 2') + + const s = r.toString() + t.is(typeof s, 'string', 'toString()') }) -*/ test('Room static method', async t => { const room = await Room.find({