forked from statusdashboard/statusdashboard
/
irc_plugin.js
123 lines (106 loc) · 4.05 KB
/
irc_plugin.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
115
116
117
118
119
120
121
122
123
var _ = require('underscore')._,
log;
exports.create = function(api, settings) {
log = settings.logger ? settings.logger : require('util').log;
if (settings.plugins && settings.plugins.irc && settings.plugins.irc.enable) {
log('Creating the plugin: ' + __filename);
var irc = require('irc');
var channels = settings.plugins.irc.options.channels;
var bot = new irc.Client(settings.plugins.irc.server, settings.plugins.irc.nick, settings.plugins.irc.options);
var lastCount = 0;
var lastService = {};
var connected = false;
var cache = [];
var maxElements = settings.plugins.irc.maxElements || 10;
bot.on('connect', function() {
api.on('up', function(service) {
checkChanges(service);
});
api.on('down', function(service) {
checkChanges(service);
});
api.on('unknown', function(service) {
checkChanges(service);
});
api.on('critical', function(service) {
checkChanges(service);
});
checkChanges = function(service) {
if (!lastService[service.name]) {
lastService[service.name] = {};
lastService[service.name].status = 'up';
}
if (lastService[service.name].status != service.status) {
if (service.status == 'up') {
pushMessage("[" + service.status.toUpperCase() + "] " + service.name);
} else {
pushMessage("[" + service.status.toUpperCase() + "] " + service.name + ", Code: " + service.statusCode + ", Message: " + service.message);
}
}
lastService[service.name].status = service.status;
};
api.on('refresh', function(status) {
var count = (status.summarize.critical + status.summarize.down + status.summarize.unknown).toString();
if (lastCount != count) {
var msg = 'Up: ' + status.summarize.up + ', ' + 'Critical: ' + status.summarize.critical + ', Down: ' + status.summarize.down + ', Unknown: ' + status.summarize.unknown;
bot.say(channels, msg);
lastCount = count;
}
});
});
bot.on('error', function(message) {
logger.error('ERROR: '+ message.command + ': '+ message.args.join(' '));
});
bot.on('join', function(channel, who) {
log(who + ' has joined ' + channel);
if (who == settings.plugins.irc.nick) {
// TODO : Let's do it for each channel of the list...
log('You are now connected to channel ' + channel + ' and ready to send messages');
connected = true;
_.each(cache, function(message){
bot.say(channels, message);
});
cache = [];
}
});
// Add a private message listener to interact with the IRC bot
bot.addListener('pm', function(nick, message) {
log('Got private message from ' + nick + ': ' + message);
var callme = commands[trim(message)];
if (typeof callme !== 'undefined') {
bot.say(nick, callme.call(null, api));
} else {
bot.say(nick, commands.help.call(null, api));
}
});
}
// Send the message or cache it
var pushMessage = function(message) {
log('Pushing message ' + message);
if (connected) {
bot.say(channels, message);
} else {
if (_.size(cache) < maxElements) {
cache.push(message);
}
}
};
var commands = {
status : function(api) {
return 'Up: ' + api.getStatus().summarize.up + ', ' + 'Critical: ' + api.getStatus().summarize.critical + ', Down: ' + api.getStatus().summarize.down + ', Unknown: ' + api.getStatus().summarize.unknown;
},
list : function(api) {
var result = '';
_.each(api.getStatus().services, function(service){
result += "[" + service.status.toUpperCase() + "] " + service.name + ", Code: " + service.statusCode + ", Message: " + service.message + "\n";
});
return result;
},
help: function(api) {
return "Available commands : \'list\', \'status\', \'help\'";
}
};
var trim = function(string) {
return string.replace(/^\s+/g,'').replace(/\s+$/g,'');
};
};