-
Notifications
You must be signed in to change notification settings - Fork 0
/
botscript.js
106 lines (96 loc) · 3.68 KB
/
botscript.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
var cleverbot = require('./cleverbot')
, vm = require('vm')
, util = require('util')
, express = require('express')
, fs = require('fs')
, request = require('request')
, client = redis.createClient();
var config = {
// this is the default config .. it will be completely overwritten if a config.json file is found
masters: ['einaros'],
masterChan: '#dynobot',
};
module.exports = function(irc, state, reloadScript) {
console.log('Reloaded bot script');
function reload(notify) {
client.end();
process.removeAllListeners('uncaughtException');
fs.writeFileSync('config.json', JSON.stringify(config));
var error = reloadScript();
if (error) irc.notice(notify, 'Error during reload: ' + error.message);
else irc.notice(notify, 'Reloaded bot script');
}
// Configure
try {
config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
}
catch (e) {}
// Watch bot script .. and reload
fs.unwatchFile(__filename);
fs.watchFile(__filename, function (curr, prev) {
if (curr.mtime != prev.mtime) reload(config.masters[0]);
});
// Uncaught exceptions
process.on('uncaughtException', function(err) {
console.log(err);
});
// Re-add IRC bindings
irc.removeAllListeners();
var logFiles = {};
irc.on('privmsg', function(from, to, message) {
if (to[0] == '#') { // Message to a channel
// Log
if (typeof logFiles[to] == 'undefined') {
logFiles[to] = {
stream: fs.createWriteStream(__dirname + '/logs/' + to, { flags: 'a', encoding: 'utf8', mode: 0666 }),
};
}
var now = new Date();
var timestamp = now.getDate() + '/' + (now.getMonth()+1) + '/' + now.getFullYear() + ' ' + now.toTimeString().substr(0, 8);
logFiles[to].stream.write(timestamp + ' <' + from + '> ' + message + '\n');
// Weather stuff
var weatherDescr = {1:"Skyfritt", 2:"Lettskyet", 3:"Halvskyet", 4:"Skyet", 5:"Halvskyet og regnbyger", 6:"Halvskyet og regnbyger med tordenvær", 7:"Halvskyet og sluddbyger", 8:"Halvskyet og snøbyger", 9:"Lett regn", 10:"Regn", 11:"Regn med tordenvær", 12:"Sludd", 13:"Snø", 14:"Snø med tordenvær", 15:"Tåke", 16:"Skyfritt, mørketid", 17:"Halvskyet, mørketid", 18:"Regnbyger, mørketid", 19:"Snøbyger, mørketid"};
if(/^vær(et)?\??$/.test(message)) {
request('http://www.vg.no/content/ajaxWeather.php?do=getLocation&id=30360', function(error, resp, body) {
var info = JSON.parse(body);
irc.privmsg(to, weatherDescr[info.symbol] + ', ' + info.temperature + ' grader.');
});
}
// Use cleverbot for talk
if (message.indexOf(irc.whoami() + ':') == 0) {
cleverbot.ask(message.substr((irc.whoami() + ':').length), function(text) {
irc.privmsg(to, from + ': ' + text);
});
return;
}
}
// Execute javascript
if (message[0] == '!') {
var replyTo = to[0] == '#' ? to : from;
try {
var context = {};
if (config.masters.indexOf(from) != -1) {
// Build master context
for (var member in global) {
context[member] = global[member];
}
context.irc = irc;
context.config = config;
context.require = require;
context.request = request;
context.respond = function(t) {
irc.notice(replyTo, t);
};
context.reload = function() {
reload(replyTo);
};
}
var res = vm.runInNewContext(message.substr(1), context);
if (typeof res != 'undefined') irc.notice(replyTo, util.inspect(res).replace(/\n/g, ' '));
}
catch (e) {
irc.notice(replyTo, 'Error: ' + e.message);
}
}
});
}