This repository has been archived by the owner on May 16, 2023. It is now read-only.
forked from nrkno/MMM-Slack
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnode_helper.js
111 lines (100 loc) · 3.76 KB
/
node_helper.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
var NodeHelper = require('node_helper');
var RtmClient = require('@slack/client').RtmClient;
var RTM_EVENTS = require('@slack/client').RTM_EVENTS;
var MemoryDataStore = require('@slack/client').MemoryDataStore;
var CLIENT_EVENTS = require('@slack/client').CLIENT_EVENTS;
var WebClient = require('@slack/client').WebClient;
var emoji = require('node-emoji');
var userName = '';
var messageText = '';
var messages = [];
module.exports = NodeHelper.create({
start: function() {
console.log('Starting node helper for: ' + this.name);
},
socketNotificationReceived: function(notification, payload) {
if (notification === 'START_CONNECTION') {
this.startSlackConnection(payload.config);
}
},
sendChannelMessages: function(rtm, err, result) {
if (err)
return console.log(err);
if (!result.ok)
return console.log(result.error);
if (result.warning)
console.log(result.warning);
var slackMessages = [];
result.messages.forEach(function(message) {
if(!message.subtype) {
var slackMessage = {
'messageId': message.ts,
'user': rtm.dataStore.getUserById(message.user).name,
'message': message.text
};
slackMessages.push(slackMessage);
}
});
this.messages = slackMessages;
this.broadcastMessage();
},
startSlackConnection: function(config) {
var self = this;
var token = process.env.SLACK_API_TOKEN || config.slackToken;
var rtm = new RtmClient(token, {
logLevel: 'error',
dataStore: new MemoryDataStore()
});
rtm.start();
rtm.on(CLIENT_EVENTS.RTM.RTM_CONNECTION_OPENED, function () {
var web = new WebClient(token);
var channel = rtm.dataStore.getChannelByName(config.slackChannel) || rtm.dataStore.getGroupByName(config.slackChannel);
if(channel.is_channel) {
web.channels.history(channel.id, function(err, result) {
self.sendChannelMessages(rtm, err, result);
});
}
else {
web.groups.history(channel.id, function(err, result) {
self.sendChannelMessages(rtm, err, result);
});
}
});
rtm.on(RTM_EVENTS.MESSAGE, function handleRtmMessage(slackMessage) {
var channelName = rtm.dataStore.getChannelGroupOrDMById(slackMessage.channel).name;
if(channelName != config.slackChannel)
return;
if(slackMessage.subtype != null)
{
switch(slackMessage.subtype)
{
case 'message_changed':
for(var i =0; i < self.messages.length -1; i++) {
if(self.messages[i].messageId === slackMessage.message.ts) {
var userName = rtm.dataStore.getUserById(slackMessage.message.user).name;
self.messages[i].user = userName;
self.messages[i].message = slackMessage.message.text;
}
}
break;
case 'message_deleted':
for(var i =0; i < self.messages.length -1; i++) {
if(self.messages[i].messageId === slackMessage.deleted_ts) {
self.messages.splice(i, 1);
}
}
break;
}
}
else
{
var userName = rtm.dataStore.getUserById(slackMessage.user).name;
self.messages.unshift({'messageId': slackMessage.ts, 'user': userName, 'message': emoji.emojify(slackMessage.text)});
}
self.broadcastMessage();
});
},
broadcastMessage: function() {
this.sendSocketNotification('SLACK_DATA', this.messages);
}
});