var spelling = function(dbot) { var dbot = dbot; var last = {}; var correct = function (data, correction, candidate, output_callback) { var rawCandidates = last[data.channel][candidate].split(' ').allGroupings(); var candidates = []; for(var i=0;i 0)) { winner = candidates[i]; winnerDistance = distance; } } if(winnerDistance < Math.ceil(correction.length * 1.33)) { if(winner !== correction) { var fix = last[data.channel][candidate].replace(winner, correction); if (/^.ACTION/.test(fix)) { fix = fix.replace(/^.ACTION/, '/me'); } last[data.channel][candidate] = fix; var output = { 'fix': fix, 'correcter': data.user, 'candidate': candidate }; output_callback(output); } } } return { 'listener': function(data, params) { var q = data.message.valMatch(/^(?:\*\*?([\d\w\s']*)|([\d\w\s']*)\*\*?)$/, 3); var otherQ = data.message.valMatch(/^([\d\w\s]*): (?:\*\*?([\d\w\s']*)|([\d\w\s']*)\*\*?)$/, 4); if(q) { correct(data, q[1] || q[2], data.user, function (e) { dbot.say(data.channel, e.correcter + ' meant: ' + e.fix); }); } else if(otherQ) { correct(data, otherQ[2] || otherQ[3], otherQ[1], function (e) { dbot.say(data.channel, e.correcter + ' thinks ' + e.candidate + ' meant: ' + e.fix); }); } else { if(last.hasOwnProperty(data.channel)) { last[data.channel][data.user] = data.message; } else { last[data.channel] = { }; last[data.channel][data.user] = data.message; } } }, 'on': 'PRIVMSG' } } exports.fetch = function(dbot) { return spelling(dbot); };