2011-08-16 18:41:29 +02:00
|
|
|
var fs = require('fs');
|
2011-09-04 16:39:03 +02:00
|
|
|
var timers = require('./timer');
|
2011-08-18 19:03:00 +02:00
|
|
|
var jsbot = require('./jsbot');
|
2011-09-04 16:39:03 +02:00
|
|
|
require('./snippets');
|
2011-08-23 01:04:40 +02:00
|
|
|
|
2011-10-06 14:14:56 +02:00
|
|
|
var modules = ['user', 'web', 'admin', 'puns', 'kick', 'karma', 'youare', 'quotes'];
|
2011-08-16 18:41:29 +02:00
|
|
|
|
2011-09-04 16:39:03 +02:00
|
|
|
var DBot = function(dModules, timers) {
|
2011-08-24 02:57:52 +02:00
|
|
|
this.admin = 'reality';
|
|
|
|
this.waitingForKarma = false;
|
2011-09-04 16:52:44 +02:00
|
|
|
this.name = 'depressionbot';
|
2011-08-24 02:57:52 +02:00
|
|
|
this.db = JSON.parse(fs.readFileSync('db.json', 'utf-8'));
|
2011-09-04 16:39:03 +02:00
|
|
|
this.timers = timers.create();
|
2011-08-24 02:57:52 +02:00
|
|
|
|
2011-10-02 13:27:59 +02:00
|
|
|
this.instance = jsbot.createJSBot(this.name, 'irc.aberwiki.org', 6667, this, function() {
|
|
|
|
this.instance.join('#realitest');
|
|
|
|
this.instance.join('#42');
|
2011-10-09 17:06:28 +02:00
|
|
|
this.instance.join('#itonlygetsworse');
|
2011-08-24 02:57:52 +02:00
|
|
|
}.bind(this));
|
|
|
|
|
|
|
|
this.moduleNames = dModules;
|
|
|
|
this.reloadModules();
|
|
|
|
this.instance.connect();
|
|
|
|
};
|
|
|
|
|
|
|
|
DBot.prototype.say = function(channel, data) {
|
|
|
|
this.instance.say(channel, data);
|
|
|
|
};
|
|
|
|
|
|
|
|
DBot.prototype.save = function() {
|
2011-10-12 15:52:58 +02:00
|
|
|
fs.writeFileSync('db.json', JSON.stringify(this.db, null, ' '));
|
2011-10-12 15:53:33 +02:00
|
|
|
console.log('database saved');
|
2011-08-24 02:57:52 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
DBot.prototype.reloadModules = function() {
|
2011-09-14 18:31:26 +02:00
|
|
|
if(this.modules) {
|
|
|
|
this.modules.each(function(module) {
|
|
|
|
if(module.onDestroy) {
|
|
|
|
module.onDestroy();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2011-09-14 18:30:39 +02:00
|
|
|
|
2011-08-24 02:57:52 +02:00
|
|
|
this.rawModules = [];
|
|
|
|
this.modules = [];
|
2011-08-28 16:00:22 +02:00
|
|
|
this.commands = {};
|
2011-09-04 16:39:03 +02:00
|
|
|
this.timers.clearTimers();
|
2011-08-24 02:57:52 +02:00
|
|
|
|
2011-10-12 15:52:58 +02:00
|
|
|
this.save();
|
|
|
|
this.timers.addTimer(1000 * 60 * 10, function() {
|
|
|
|
this.save();
|
|
|
|
});
|
|
|
|
|
2011-08-25 18:54:59 +02:00
|
|
|
var path = require.resolve('./snippets');
|
|
|
|
require.cache[path] = undefined;
|
|
|
|
require('./snippets');
|
|
|
|
|
2011-08-24 02:57:52 +02:00
|
|
|
this.moduleNames.each(function(name) {
|
2011-08-24 17:15:42 +02:00
|
|
|
var cacheKey = require.resolve('./modules/' + name);
|
|
|
|
require.cache[cacheKey] = undefined; // TODO: snippet to remove element properly
|
2011-08-24 19:23:00 +02:00
|
|
|
try {
|
|
|
|
this.rawModules.push(require('./modules/' + name));
|
|
|
|
} catch(err) {
|
|
|
|
console.log('Failed to load module: ' + name);
|
|
|
|
}
|
2011-08-24 02:57:52 +02:00
|
|
|
}.bind(this));
|
|
|
|
|
|
|
|
this.instance.removeListeners();
|
|
|
|
|
|
|
|
this.modules = this.rawModules.collect(function(rawModule) {
|
|
|
|
var module = rawModule.fetch(this);
|
2011-08-28 16:00:22 +02:00
|
|
|
|
|
|
|
if(module.listener) {
|
|
|
|
this.instance.addListener(module.on, module.listener);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(module.onLoad) {
|
|
|
|
var newCommands = module.onLoad();
|
|
|
|
for(key in newCommands) {
|
|
|
|
if(newCommands.hasOwnProperty(key) && Object.prototype.isFunction(newCommands[key])) {
|
|
|
|
this.commands[key] = newCommands[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-24 02:57:52 +02:00
|
|
|
return module;
|
|
|
|
}.bind(this));
|
2011-08-28 16:00:22 +02:00
|
|
|
|
|
|
|
this.instance.addListener('PRIVMSG', function(data) {
|
|
|
|
params = data.message.split(' ');
|
|
|
|
if(data.channel == this.name) data.channel = data.user;
|
|
|
|
|
|
|
|
if(this.commands.hasOwnProperty(params[0])) {
|
2011-10-10 14:41:50 +02:00
|
|
|
if((this.db.bans.hasOwnProperty(params[0]) && this.db.bans[params[0]].include(data.user)) || this.db.bans['*'].include(data.user))
|
|
|
|
this.say(data.channel, data.user + ' is banned from using this command. Commence incineration.');
|
|
|
|
else {
|
2011-10-09 17:06:28 +02:00
|
|
|
this.commands[params[0]](data, params);
|
|
|
|
}
|
2011-08-28 16:00:22 +02:00
|
|
|
} else {
|
2011-08-28 18:16:28 +02:00
|
|
|
var q = data.message.valMatch(/^~([\d\w\s]*)/, 2);
|
2011-08-28 16:00:22 +02:00
|
|
|
if(q) {
|
2011-08-28 18:16:28 +02:00
|
|
|
key = q[1].trim().toLowerCase();
|
|
|
|
if(this.db.quoteArrs.hasOwnProperty(key)) {
|
|
|
|
this.say(data.channel, key + ': ' + this.db.quoteArrs[key].random());
|
|
|
|
} else {
|
2011-09-18 19:20:50 +02:00
|
|
|
this.say(data.channel, 'Nobody loves ' + key);
|
2011-08-28 18:16:28 +02:00
|
|
|
}
|
2011-08-28 16:00:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}.bind(this));
|
2011-08-24 02:57:52 +02:00
|
|
|
};
|
|
|
|
|
2011-09-04 16:39:03 +02:00
|
|
|
new DBot(modules, timers);
|