room.js 2.3 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
const log = require('./npmlog-env')
10
const Contact = require('./contact')
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(${contactGetter})`)
27
    if (!this.id) {
28
      log.warn('Room', 'ready() on a un-inited Room')
29 30 31 32
      return Promise.resolve(this)
    } else if (this.obj.id) {
      return Promise.resolve(this)
    }
33

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

47 48
  name() { return this.obj.name }

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

58 59 60 61 62 63 64 65 66 67 68 69
  parseMemberList(memberList) {
    if (!memberList || !memberList.map) {
      return []
    }
    return memberList.map(m => {
      return {
        contact:  Contact.load(m.UserName)
        , name:   m.DisplayName
      }
    })
  }

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

  get(prop) { return this.obj[prop] }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
81
  static find() {
82 83
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
84
  static findAll() {
85 86
  }
}
87

88 89 90 91 92 93 94
Room.init = function() { Room.pool = {} }
Room.init()
Room.load = function(id) {
  if (!id) { return null }

  if (id in Room.pool) {
    return Room.pool[id]
95
  }
96
  return Room.pool[id] = new Room(id)
97
}
98
Room.attach = function(puppet) { Room.puppet = puppet }
99

100
module.exports = Room