var quotes = function(dbot) { var quotes = dbot.db.quoteArrs; var addStack = []; var rmAllowed = true; // Retrieve a random quote from a given category, interpolating any quote references (~~QUOTE CATEGORY~~) within it var interpolatedQuote = function(key, quoteTree, params) { if(quoteTree !== undefined && quoteTree.indexOf(key) != -1) { return ''; } else if(quoteTree === undefined) { quoteTree = []; } var quoteString = quotes[key].random(); // Parse quote interpolations var quoteRefs = quoteString.match(/~~([\d\w\s-]*)~~/g); var thisRef; while(quoteRefs && (thisRef = quoteRefs.shift()) !== undefined) { var cleanRef = dbot.cleanNick(thisRef.replace(/^~~/,'').replace(/~~$/,'').trim()); if (quotes.hasOwnProperty(cleanRef)) { quoteTree.push(key); quoteString = quoteString.replace("~~" + cleanRef + "~~", interpolatedQuote(cleanRef, quoteTree.slice())); quoteTree.pop(); } } // Parse quote parameters var paramRefs = quoteString.match(/~~\$([1-9])~~/g); var thisParam; while(paramRefs && (thisParam = paramRefs.shift()) !== undefined) { thisParam = thisParam[1]; if(thisParam < params.length) { quoteString = quoteString.replace("~~$" + thisParam + "~~", params[thisParam]); } } return quoteString; }; var commands = { '~q': function(data, params) { var q = data.message.valMatch(/^~q ([\d\w\s-]*)/, 2); if(q) { q[1] = q[1].trim(); key = q[1].toLowerCase(); if(quotes.hasOwnProperty(key)) { dbot.say(data.channel, q[1] + ': ' + interpolatedQuote(key, params)); } else { dbot.say(data.channel, 'Nobody loves ' + q[1]); } } }, // shows the biggest categories '~qstats': function(data, params) { var qSizes = []; for(var cat in quotes) { if(quotes[cat].length != 0) { qSizes.push([cat, quotes[cat].length]); } } qSizes = qSizes.sort(function(a, b) { return a[1] - b[1]; }); qSizes = qSizes.slice(qSizes.length - 10).reverse(); var qString = "Largest categories: "; for(var i=0;i 0) { dbot.say(data.channel, "Pruning empty quote categories: " + pruned.join(", ")); } else { dbot.say(data.channel, "No empty quote categories. Commence incineration."); } } }; return { 'onLoad': function() { dbot.timers.addTimer(1000 * 60 * 3, function() { rmAllowed = true; }); return commands; }, // For automatic quote retrieval 'listener': function(data, params) { if(data.user == 'reality') { var once = data.message.valMatch(/^I ([\d\w\s,'-]* once)/, 2); } else { var once = data.message.valMatch(/^reality ([\d\w\s,'-]* once)/, 2); } if(once) { if((dbot.db.bans.hasOwnProperty('~qadd') && dbot.db.bans['~qadd'].include(data.user)) || 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; dbot.instance.say(data.channel, '\'reality ' + once[1] + '.\' saved.'); } } }, 'on': 'PRIVMSG' }; }; exports.fetch = function(dbot) { return quotes(dbot); };