diff --git a/modules/command.js b/modules/command.js index ed7451f..7c23cec 100644 --- a/modules/command.js +++ b/modules/command.js @@ -3,17 +3,57 @@ var command = function(dbot) { var dbot = dbot; + var ignoreCommands = function (data, params) { + if(data.channel == dbot.name) data.channel = data.user; + var targetCommand = params[1]; + var ignoreMins = parseFloat(params[2]); + + if(!dbot.sessionData.hasOwnProperty("ignoreCommands")) { + dbot.sessionData.ignoreCommands = {}; + } + if(!dbot.sessionData.ignoreCommands.hasOwnProperty(targetCommand)) { + dbot.sessionData.ignoreCommands[targetCommand] = []; + } + + if(dbot.sessionData.ignoreCommands[targetCommand].include(data.channel)) { + dbot.say(data.channel, "Already ignoring '" + targetCommand + "' in '" + data.channel + "'."); + } else { + dbot.sessionData.ignoreCommands[targetCommand].push(data.channel); + dbot.timers.addOnceTimer(ignoreMins * 60 * 1000, function() { + dbot.sessionData.ignoreCommands[targetCommand].splice(dbot.sessionData.ignoreCommands[targetCommand].indexOf(data.channel), 1); + dbot.say(data.channel, "No longer ignoring '" + targetCommand + "' in '" + data.channel + "'."); + }); + dbot.say(data.channel, "Ignoring '" + targetCommand + "' in '" + data.channel + "' for the next " + ignoreMins + " minute" + (ignoreMins == 1 ? "" : "s") + "."); + } + }; + return { + 'onLoad': function() { + return { + '~ignore': ignoreCommands + }; + }, 'listener': function(data) { params = data.message.split(' '); if(data.channel == dbot.name) data.channel = data.user; + var ignoringCommand = false; + if(dbot.sessionData.hasOwnProperty("ignoreCommands")) { + if(dbot.sessionData.ignoreCommands.hasOwnProperty(params[0])) { + if(dbot.sessionData.ignoreCommands[params[0]].include(data.channel)) { + ignoringCommand = true; + } + } + } + if(dbot.commands.hasOwnProperty(params[0])) { if((dbot.db.bans.hasOwnProperty(params[0]) && - dbot.db.bans[params[0]].include(data.user)) || dbot.db.bans['*'].include(data.user)) + dbot.db.bans[params[0]].include(data.user)) || dbot.db.bans['*'].include(data.user)) { dbot.say(data.channel, data.user + ' is banned from using this command. Commence incineration.'); - else { + } else if(ignoringCommand) { + // do nothing, this stops us falling through to the non-command stuff + } else { dbot.commands[params[0]](data, params); dbot.save(); } diff --git a/modules/quotes.js b/modules/quotes.js index cedd678..f08b3e1 100644 --- a/modules/quotes.js +++ b/modules/quotes.js @@ -247,6 +247,9 @@ var quotes = function(dbot) { dbot.db.bans['*'].include(data.user)) { dbot.say(data.channel, data.user + ' is banned from using this command. Commence incineration.'); } else { + if(!dbot.db.quoteArrs.hasOwnProperty('realityonce')) { + dbot.db.quoteArrs['realityonce'] = []; + } dbot.db.quoteArrs['realityonce'].push('reality ' + once[1] + '.'); addStack.push('realityonce'); rmAllowed = true; diff --git a/modules/web.js b/modules/web.js index b188487..e3ac0fa 100644 --- a/modules/web.js +++ b/modules/web.js @@ -37,7 +37,7 @@ var webInterface = function(dbot) { res.render('quotes', { 'name': dbot.name, 'quotes': dbot.db.quoteArrs[rCategory], locals: { 'url_regex': RegExp.prototype.url_regex() } }); }); - app.listen(443); + app.listen(dbot.webPort); return { 'onDestroy': function() { diff --git a/run.js b/run.js index 8401192..29167ed 100644 --- a/run.js +++ b/run.js @@ -6,35 +6,38 @@ 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 { - this.db = JSON.parse(fs.readFileSync('db.json', 'utf-8')); + var rawDB = fs.readFileSync('db.json', 'utf-8'); } catch (e) { - this.db = {}; - } finally { /* fill any missing parts of the db; if this is a new DB, that's all of them */ - 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.quoteArrs.hasOwnProperty("realityonce")) { - this.db.quoteArrs.realityonce = []; - } - 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 = []; - } + 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 @@ -44,7 +47,9 @@ var DBot = function(timers) { this.nickserv = this.config.nickserv || 'zippy'; this.server = this.config.server || 'elara.ivixor.net'; this.port = this.config.port || 6667; + 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(); diff --git a/timer.js b/timer.js index de260dd..7d494a6 100644 --- a/timer.js +++ b/timer.js @@ -1,15 +1,23 @@ var timers = function() { var timers = []; + var timeouts = []; return { 'addTimer': function(interval, callback) { // Because who puts the callback first. Really. timers.push(setInterval(callback, interval)); }, + + 'addOnceTimer': function(delay, callback) { // Because who seriously puts the callback first here too? + timeouts.push(setTimeout(callback, delay)); + }, 'clearTimers': function() { for(var i;i