/** * Module name: Wikipedia */ var _ = require('underscore')._, request = require('request'); var wikipedia = function(dbot) { this.api = { 'getSentence': function(term, random, cb) { request.get('https://en.wikipedia.org/w/api.php', { 'qs': { 'action': 'opensearch', 'search': term }, 'json': true }, function(error, response, body) { if(body && body[1].length != 0) { request.get('https://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&&titles='+body[1][0], {'json': true}, function(error, response, body) { body = body.query.pages for(var prop in body) { break; } body = body[prop].revisions[0]['*']; var oBody = body; var redirect = body.match(/#redirect \[\[(.+)\]\]/i); if(redirect) { return this.api.getSentence(redirect[1], random, cb); } var refer = body.match(/may refer to:/i); if(refer) { var links = body.match(/\[\[(.+)\]\]/g); return this.api.getSentence(links[_.random(0,links.length-1)], random, cb); } body = body.replace(/=(.+)=/g,''); body = body.replace(/\t/g,''); body = body.replace(/\{(.+)\}/g,''); body = body.replace(/(\[|\])/g,''); body = body.replace(/(\(|\))/g,''); body = body.replace(/\*\s?/g,''); body = body.replace(/<.+?>.+<.+?>/g,''); body = body.replace(/<.+?>/g,''); body = body.replace(/(\w+)\|([^ ^, ^\.]+)/g,'$2'); body = body.replace(/'+/g, '\''); body = body.split('\n'); if(random == false) { var newBody = []; _.each(body, function(line) { console.log(line.split('. ')); newBody = _.union(newBody, line.split('. ')); }); body = newBody; } body = _.filter(body, function(line) { var spaces = line.match(/\s/g); return line != '' && !line.match(/{|}/) && !line.match(/^\s+$/) && !line.match(/^!/) && !line.match(/^#/) && !line.match(/^File:/) && !line.match(/^Image:/) && !line.match(/^Category:/) && !line.match(/http:\/\//) && !line.match(/^\s*\|/) && !line.match(/:$/) && spaces && spaces.length > 5 && spaces.length < 100; }); if(random == true) { var sentence = body[_.random(0, body.length -1)]; } else { var sentence = body[0]; } if(_.isUndefined(sentence)) { var links = oBody.match(/\[\[(.+)\]\]/g); return this.api.getSentence(links[_.random(0,links.length-1)], random, cb); } var w = sentence.split(' '); if(w.length > 50) { sentence = w.slice(0, 60).join(' ') + '...'; } cb(sentence); }.bind(this)); } }.bind(this)); } }; this.commands = { '~lol': function(event) { this.api.getSentence(event.input[1], true, function(sentence) { event.reply(sentence); }); }, '~summary': function(event) { this.api.getSentence(event.input[1], false, function(sentence) { event.reply(sentence); }); }, '~w': function(event) { request.get('http://wikipedia.org/w/api.php', { 'qs': { 'action': 'opensearch', 'search': event.input[1].replace(/\s/,'_'), 'limit': 1, 'namespace': 0, 'format': 'json' }, 'json': true }, function(err, res, body) { if(!err && body[1].length !== 0) { event.reply(event.input[1] + ': https://wikipedia.org/wiki/'+body[1][0].replace(/\s/g, '_')); } else { event.reply(event.input[1] + ' not found.'); } }); } }; this.commands['~lol'].regex = [/^lol ([\d\w\s-]*)/, 2]; this.commands['~summary'].regex = [/^summary ([\d\w\s-]*)/, 2]; this.commands['~w'].regex = [/^w (.+)/, 2]; }; exports.fetch = function(dbot) { return new wikipedia(dbot); };