提交 abf5b258 编写于 作者: Huan (李卓桓)'s avatar Huan (李卓桓)

#32 room doc & global `room-join` & `room-leave` events

上级 d4e3b0b8
......@@ -292,13 +292,14 @@ I'll try my best to keep the api as sample as it can be.
## Events
Wechaty support the following 5 events:
Wechaty support the following 6 events:
1. scan
2. login
3. logout
4. message
5. error
6. friend
### 1. Event: `scan`
......@@ -365,6 +366,22 @@ wechaty.on('friend', (contact: Contact, request: FriendRequest) => {
})
```
### 7. Event: `room-join`
```typescript
wechaty.on('room-join', (room: Room, invitee: Contact, inviter: Contact) => {
console.log(`Room ${room} got new member ${invitee}, invited by ${inviter}`)
})
```
### 8. Event: `room-leave`
```typescript
wechaty.on('room-leave', (room: Room, leaver: Contact) => {
console.log(`Room ${room} lost member ${leaver}`)
})
```
## Class Wechaty
Main bot class.
......@@ -510,6 +527,65 @@ room.ready()
})
```
## Room Class of Wechaty
```typescript
type Query = { name: string|Regex }
Room.find(query : Query) : Room | null
Room.findAll(query : Query) : Room[]
```
### Event: `join`
```javascript
Room.on('join', (invitee, inviter) => void)
```
Event `join`: Room New Member
```typescript
room.on('join', (invitee, inviter) => {
console.log(`user ${invitee} joined the room ${room}, invited by ${inviter}`)
})
```
### Event: `leave`
```typescript
Room.on('leave', (leaver) => void)
```
### static Room.find(query: Query): Promise<Room|null>
### static Room.findAll(query: Query): Promise<Room[]>
### static Room.create(contactList: Contact[]): Promise<any>
### Room.add(contact: Contact): Promise<any>
```javascript
const friend = message.get('from')
const room = Room.find({ name: 'Group Name' })
if (room) {
room.add(friend)
}
```
### Room.del(contact: Contact): void
### Room.topic(newTopic?: string): string
### Room.nick(contact: Contact): string
### Room.has(contact Contact): boolean
### Room.refresh(): Promise<Room>
### Room.owner(): Contact|null
### Room.member(name: string): Contact|null
## Class FriendRequest
Send, receive friend request, and friend confirmation events.
......
......@@ -158,6 +158,7 @@ function fireRoomJoin(m) {
}
yield inviteeContact.ready()
yield inviterContact.ready()
this.emit('room-join', room, inviteeContact, inviterContact)
room.emit('join', inviteeContact, inviterContact)
}).catch(e => {
......@@ -196,6 +197,7 @@ function fireRoomLeave(m) {
co.call(this, function* () {
yield leaverContact.ready()
this.emit('room-leave', room, leaverContact)
room.emit('leave', leaverContact)
room.refresh()
}).catch(e => {
......
......@@ -68,25 +68,6 @@ class Room extends EventEmitter{
})
}
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) {
......@@ -130,14 +111,26 @@ class Room extends EventEmitter{
Object.keys(this.obj).forEach(k => console.error(`${k}: ${this.obj[k]}`))
}
add(contact) {
log.verbose('Room', 'add(%s) to %s', contact, this)
if (!contact) {
throw new Error('contact not found')
}
return Config.puppetInstance()
.roomAdd(this, contact)
}
del(contact) {
log.verbose('Room', 'del(%s) from %s', contact, this)
if (!contact) {
throw new Error('contact not found')
}
return Config.puppetInstance().roomDel(this, contact)
.then(r => this.delLocal(contact))
return Config.puppetInstance()
.roomDel(this, contact)
.then(_ => this.delLocal(contact))
}
// @private
......@@ -151,21 +144,12 @@ class Room extends EventEmitter{
let i
for (i=0; i<memberList.length; i++) {
// XXX
// console.log('########################')
// console.log(i)
// console.log(memberList[i].id)
// console.log(contact.get('id'))
// console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!')
if (memberList[i].id === contact.get('id')) {
break
}
}
// console.log('found i=' + i)
if (i < memberList.length) {
// console.log('splicing before: ' + memberList.length)
memberList.splice(i, 1)
// console.log('splicing after: ' + memberList.length)
return true
}
return false
......@@ -176,16 +160,6 @@ class Room extends EventEmitter{
// WechatyBro.glue.chatroomFactory.quit("@@1c066dfcab4ef467cd0a8da8bec90880035aa46526c44f504a83172a9086a5f7"
}
add(contact) {
log.verbose('Room', 'add(%s) to %s', contact, this)
if (!contact) {
throw new Error('contact not found')
}
return Config.puppetInstance().roomAdd(this, contact)
}
topic(newTopic) {
log.verbose('Room', 'topic(%s)', newTopic)
......@@ -213,6 +187,25 @@ class Room extends EventEmitter{
.length > 0
}
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]
} else {
return null
}
}
member(name) {
log.verbose('Room', 'member(%s)', name)
......@@ -239,7 +232,8 @@ class Room extends EventEmitter{
if (!contactList || ! typeof contactList === 'array') {
throw new Error('contactList not found')
}
return Config.puppetInstance().roomCreate(contactList)
return Config.puppetInstance()
.roomCreate(contactList)
}
// private
......@@ -326,13 +320,6 @@ class Room extends EventEmitter{
return Room.pool[id] = new Room(id)
}
// static attach(puppet) {
// // if (!puppet) {
// // throw new Error('Room.attach got no puppet to attach!')
// // }
// Config.puppetInstance() = puppet
// }
}
Room.init()
......
......@@ -143,6 +143,8 @@ class Wechaty extends EventEmitter {
, 'error'
, 'heartbeat'
, 'friend'
, 'room-join'
, 'room-leave'
].map(e => {
// https://strongloop.com/strongblog/an-introduction-to-javascript-es6-arrow-functions/
// We’ve lost () around the argument list when there’s just one argument (rest arguments are an exception, eg (...args) => ...)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册