var quotes = function(dbot) { var name = 'quotes'; 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) { 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]; console.log(thisParam); if(thisParam < params.length) { quoteString = quoteString.replace("~~$" + thisParam + "~~", params[thisParam]); } } */ return quoteString; }; var commands = { '~': function(data, params) { var q = data.message.valMatch(/^~([\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)); } else { dbot.say(data.channel, dbot.t('category_not_found', {'category': q[1]})); } } }, '~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)); } else { dbot.say(data.channel, dbot.t('category_not_found', {'category': 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 = dbot.t('large_categories'); for(var i=0;i 0) { dbot.say(data.channel, dbot.t('prune', {'categories': pruned.join(", ")})); } else { dbot.say(data.channel, dbot.t('no_prune')); } } }; return { 'onLoad': function() { dbot.timers.addTimer(1000 * 60 * 3, function() { rmAllowed = true; }); return commands; }, // For automatic quote retrieval 'listener': function(data, params) { if((dbot.db.ignores.hasOwnProperty(data.user) && dbot.db.ignores[data.user].include(name)) == false) { 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, dbot.t('command_ban', {'user': data.user})); } 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', 'name': name, 'ignorable': true }; }; exports.fetch = function(dbot) { return quotes(dbot); };