room.js 2.7 KB
Newer Older
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
1 2 3 4 5 6 7 8
/**
 *
 * wechaty: Wechat for Bot. and for human who talk to bot/robot
 *
 * Licenst: ISC
 * https://github.com/zixia/wechaty
 *
 */
9 10
const log   = require('./npmlog-env')
const Util  = require('./util')
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
11

12
class Room {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
13
  constructor(id) {
14
    log.silly('Room', `constructor(${id})`)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
15
    this.id = id
16
    this.obj = {}
17 18
    if (!Room.puppet) {
      throw new Error('no puppet attached to Room')
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
19
    }
20
  }
21

22
  toString()   { return this.id }
23
  toStringEx() { return `Room(${this.obj.name}[${this.id}])` }
24 25

  ready(contactGetter) {
26
    log.silly('Room', 'ready(%s)', contactGetter ? contactGetter.constructor.name : '')
27
    if (!this.id) {
28
      log.warn('Room', 'ready() on a un-inited Room')
29
      return Promise.resolve(this)
30
    } else if (this.obj.members && this.obj.members.length) {
31
      return Promise.resolve(this)
32
    } else if (this.obj.id) {
33
      log.warn('Room', 'ready() ready but members list empty in room %s. reloading', this.obj.name)
34
    }
35

36
    contactGetter = contactGetter || Room.puppet.getContact.bind(Room.puppet)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
37
    return contactGetter(this.id)
38
    .then(data => {
39
      log.silly('Room', `contactGetter(${this.id}) resolved`)
40 41
      this.rawObj = data
      this.obj    = this.parse(data)
42
      return this
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
43
    }).catch(e => {
44 45
      log.error('Room', 'contactGetter(%s) exception: %s', this.id, e.message)
      throw e
46 47 48
    })
  }

49
  name() { return Util.plainText(this.obj.name) }
50
  get(prop) { return this.obj[prop] }
51

52 53 54
  parse(rawObj) {
    return !rawObj ? {} : {
      id:         rawObj.UserName
55
      , encryId:  rawObj.EncryChatRoomId // ???
56
      , name:     rawObj.NickName
57
      , members:  this.parseMemberList(rawObj.MemberList)
58 59 60
    }
  }

61 62 63 64 65 66
  parseMemberList(memberList) {
    if (!memberList || !memberList.map) {
      return []
    }
    return memberList.map(m => {
      return {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
67
        id:       m.UserName
68
        , name:   m.DisplayName // nick name for this room?
69 70 71 72
      }
    })
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
73
  dumpRaw() {
74
    console.error('======= dump raw Room =======')
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
75
    Object.keys(this.rawObj).forEach(k => console.error(`${k}: ${this.rawObj[k]}`))
76
  }
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
77
  dump()    {
78
    console.error('======= dump Room =======')
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
79
    Object.keys(this.obj).forEach(k => console.error(`${k}: ${this.obj[k]}`))
80 81
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
82
  static find() {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
83
    return new Room('-1')
84
  }
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
85
  
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
86
  static findAll() {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
87 88 89 90
    return [
      new Room('-2')
      , new Room('-3')
    ]
91 92
  }
}
93

94 95 96 97 98 99 100
Room.init = function() { Room.pool = {} }
Room.init()
Room.load = function(id) {
  if (!id) { return null }

  if (id in Room.pool) {
    return Room.pool[id]
101
  }
102
  return Room.pool[id] = new Room(id)
103
}
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
104 105 106 107 108 109
Room.attach = function(puppet) {
  // if (!puppet) {
  //   throw new Error('Room.attach got no puppet to attach!')
  // }
  Room.puppet = puppet
}
110

111
module.exports = Room