forked from rauchg/slackin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
slack.js
114 lines (97 loc) · 2.56 KB
/
slack.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import request from 'superagent'
import { EventEmitter } from 'events'
export default class SlackData extends EventEmitter {
constructor ({ token, interval, org: host }){
super()
this.host = host
this.token = token
this.interval = interval
this.ready = false
this.org = {}
this.users = {}
this.channelsByName = {}
this.init()
this.fetch()
}
init (){
request
.get(`https://${this.host}.slack.com/api/channels.list`)
.query({ token: this.token })
.end((err, res) => {
if (err) {
throw err;
}
(res.body.channels || []).forEach(channel => {
this.channelsByName[channel.name] = channel
})
})
request
.get(`https://${this.host}.slack.com/api/team.info`)
.query({ token: this.token })
.end((err, res) => {
let team = res.body.team
if (!team) {
throw new Error('Bad Slack response. Make sure the team name and API keys are correct');
}
this.org.name = team.name
if (!team.icon.image_default) {
this.org.logo = team.icon.image_132
}
})
}
fetch (){
request
.get(`https://${this.host}.slack.com/api/users.list`)
.query({ token: this.token, presence: 1 })
.end((err, res) => {
this.onres(err, res)
})
this.emit('fetch')
}
getChannelId (name){
let channel = this.channelsByName[name]
return channel ? channel.id: null
}
retry (){
let interval = this.interval * 2
setTimeout(this.fetch.bind(this), interval)
this.emit('retry')
}
onres (err, res){
if (err) {
this.emit('error', err)
return this.retry()
}
let users = res.body.members
if (!users || (users && !users.length)) {
let err = new Error(`Invalid Slack response: ${res.status}`)
this.emit('error', err)
return this.retry()
}
// remove slackbot and bots from users
// slackbot is not a bot, go figure!
users = users.filter(x => {
return x.id != 'USLACKBOT' && !x.is_bot && !x.deleted
})
let total = users.length
let active = users.filter(user => {
return 'active' === user.presence
}).length
if (this.users) {
if (total != this.users.total) {
this.emit('change', 'total', total)
}
if (active != this.users.active) {
this.emit('change', 'active', active)
}
}
this.users.total = total
this.users.active = active
if (!this.ready) {
this.ready = true
this.emit('ready')
}
setTimeout(this.fetch.bind(this), this.interval)
this.emit('data')
}
}