3
0
mirror of https://github.com/reality/dbot.git synced 2024-11-27 22:39:26 +01:00
dbot/run.js

171 lines
5.4 KiB
JavaScript
Raw Normal View History

2011-08-16 18:41:29 +02:00
var fs = require('fs');
var timers = require('./timer');
var jsbot = require('./jsbot');
require('./snippets');
var DBot = function(timers) {
// Load external files
this.config = JSON.parse(fs.readFileSync('config.json', 'utf-8'));
this.db = null;
var rawDB;
try {
var rawDB = fs.readFileSync('db.json', 'utf-8');
} catch (e) {
this.db = {}; /* if no db file, make empty one */
}
if(!this.db) { /* if it wasn't empty */
this.db = JSON.parse(rawDB);
}
/* repair any deficiencies in the DB; if this is a new DB, that's everything */
if(!this.db.hasOwnProperty("bans")) {
this.db.bans = {};
}
if(!this.db.bans.hasOwnProperty("*")) {
this.db.bans["*"] = [];
}
if(!this.db.hasOwnProperty("quoteArrs")) {
this.db.quoteArrs = {};
}
if(!this.db.hasOwnProperty("kicks")) {
this.db.kicks = {};
}
if(!this.db.hasOwnProperty("kickers")) {
this.db.kickers = {};
}
if(!this.db.hasOwnProperty("modehate")) {
this.db.modehate = [];
}
if(!this.db.hasOwnProperty("locks")) {
this.db.locks = [];
}
// Populate bot properties with config data
this.name = this.config.name || 'dbox';
2012-03-10 15:38:47 +01:00
this.admin = this.config.admin || [ 'reality' ];
2011-11-24 14:19:18 +01:00
this.password = this.config.password || 'lolturtles';
this.nickserv = this.config.nickserv || 'zippy';
this.server = this.config.server || 'elara.ivixor.net';
this.port = this.config.port || 6667;
2012-03-10 19:21:50 +01:00
this.webPort = this.config.webPort || 443;
this.moduleNames = this.config.modules || [ 'command', 'js', 'admin', 'kick', 'modehate', 'quotes', 'puns', 'spelling', 'web', 'youare' ];
this.sessionData = {};
this.timers = timers.create();
2011-10-31 18:07:14 +01:00
this.instance = jsbot.createJSBot(this.name, this.server, this.port, this, function() {
2011-11-24 14:19:18 +01:00
if(this.config.hasOwnProperty('channels')) {
this.config.channels.each(function(channel) {
this.instance.join(channel);
}.bind(this));
}
}.bind(this), this.nickserv, this.password);
// Load the modules and connect to the server
this.reloadModules();
this.instance.connect();
};
2012-03-07 23:13:31 +01:00
// Retrieve a random quote from a given category, interpolating any quote references (~~QUOTE CATEGORY~~) within it
2012-03-12 22:29:29 +01:00
DBot.prototype.interpolatedQuote = function(key, quoteTree) {
2012-03-13 17:06:19 +01:00
if( quoteTree !== undefined && quoteTree.indexOf( key ) != -1 ) { console.log('nrll'); return ''; }
2012-03-12 22:29:29 +01:00
else if( quoteTree === undefined ) quoteTree = [];
2012-03-07 23:13:31 +01:00
var quoteString = this.db.quoteArrs[key].random();
2012-03-13 17:06:19 +01:00
var quoteRefs = quoteString.match(/~~([\d\w\s-]*)~~/g);
var thisRef;
while( quoteRefs && (thisRef = quoteRefs.shift()) !== undefined ) {
var cleanRef = this.cleanNick(thisRef.replace(/^~~/,'').replace(/~~$/,'').trim());
if (this.db.quoteArrs.hasOwnProperty(cleanRef)) {
quoteTree.push( key );
quoteString = quoteString.replace("~~"+cleanRef+"~~", this.interpolatedQuote(cleanRef, quoteTree.slice()));
quoteTree.pop();
2012-03-07 23:13:31 +01:00
}
}
return quoteString;
};
// Say something in a channel
DBot.prototype.say = function(channel, data) {
this.instance.say(channel, data);
};
2012-02-27 17:43:47 +01:00
DBot.prototype.act = function(channel, data) {
this.instance.send('PRIVMSG', channel, ':\001ACTION ' + data + '\001');
2012-02-27 17:43:47 +01:00
}
// Save the database file
DBot.prototype.save = function() {
2011-10-12 16:12:06 +02:00
fs.writeFile('db.json', JSON.stringify(this.db, null, ' '));
};
// Hot-reload module files.
DBot.prototype.reloadModules = function() {
if(this.modules) { // Run 'onDestroy' code for each module if it exists.
2011-09-14 18:31:26 +02:00
this.modules.each(function(module) {
if(module.onDestroy) {
module.onDestroy();
}
});
}
2011-09-14 18:30:39 +02:00
this.rawModules = [];
this.modules = [];
this.commands = {};
this.timers.clearTimers();
2011-10-12 15:52:58 +02:00
this.save();
// enforce having command. it can still be reloaded, but dbot _will not_ function without it, so not having it should be impossible
if(!this.moduleNames.include("command")) {
this.moduleNames.push("command");
}
// Reload Javascript snippets
var path = require.resolve('./snippets');
delete require.cache[path];
require('./snippets');
this.moduleNames.each(function(name) {
2011-08-24 17:15:42 +02:00
var cacheKey = require.resolve('./modules/' + name);
delete require.cache[cacheKey];
try {
this.rawModules.push(require('./modules/' + name));
} catch(err) {
console.log('Failed to load module: ' + name);
}
}.bind(this));
this.instance.removeListeners();
this.modules = this.rawModules.collect(function(rawModule) {
var module = rawModule.fetch(this);
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];
}
}
}
return module;
}.bind(this));
};
DBot.prototype.cleanNick = function(key) {
key = key.toLowerCase();
while(key.endsWith("_")) {
if(this.db.quoteArrs.hasOwnProperty(key)) {
return key;
}
key = key.substring(0, key.length-1);
}
return key;
}
new DBot(timers);