Source

plugins/wiki.js

// Modules to install separately
const request = require('request');
const fs = require('fs');
const path = require('path');
var Xray = require('x-ray');
var cheerio = require('cheerio');
const googleIt = require('google-it');

const urlWiki = 'https://{{language}}.wikipedia.org/wiki/';

function escapeRegExp(string){
    return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}

function replaceAll(str, term, replacement) {
  	return str.replace(new RegExp(escapeRegExp(term), 'g'), replacement);
}

var searchWikipedia = function(in_url, in_language){
	return new Promise(function(resolve, reject) {
		var xray = Xray();

		var metadata = {
			'TITLE': decodeURIComponent(replaceAll(in_url.replace(urlWiki.replace('{{language}}', in_language), ''), '_', ' ')),
			'DEFINITION': '',
			'IMAGE': ''
		};
		
        xray(in_url, 'body@html')(function(err, body){
            if (!err){
                var $ = cheerio.load(body);
                var results = [];
                var definicion = '';

				const summaries = [];
				let display = true;
				let title
				$('div#mw-content-text > .mw-parser-output').children('div,p').each((index, element) => {
					if (display){
						const node = $(element)
						const nodeId = node.attr('id') || '';
						if (  nodeId !== 'toc' ) {
							const text = node.text().trim()
							if (text.length >= 100){
								summaries.push(text)
							}
						}else{
							display = false;
						}
					}
				})
				metadata.DEFINITION = summaries.join('\n')
            }
            resolve(metadata);
        })
	})
}

var searchGoogle = function(in_search, in_language){
	return new Promise(function(resolve, reject) {
		googleIt({ query: in_language+'.wikipedia '+in_search, limit: 3, 'only-urls': true, 'no-display': true })
		.then(results => {
			let url_ = results.find(obj => obj.link.indexOf(urlWiki.replace('{{language}}', in_language)) !== -1);
			if (url_ != undefined){				
				searchWikipedia(url_.link, in_language)
				.then(data => {
					if (data.DEFINITION !== ''){
						resolve(data);
					}else {
						reject('Definition not found');
					}
				})
				.catch(err => {
					reject('error');
				})
			}else {
				reject('Definition not found');
			}
		})
		.catch(e => {
			reject('error');
		});
	})
}

const defaultConfig = {
    idChat: '',
    search: '',
    language: 'en',
    messageError: '*Ooops, an error occurred while trying to search, try again later*',
    messageNoDataFound: '*No information about your search could be found*'
}
/**
 * Plugin that allows the search of different things in wikipedia
 * @function wiki
 * @memberof Plugins
 * @param {string} idChat - Chat id to send the new image to
 * @param {string} search - Search parameter to perform
 * @param {string} language - Language in which to search
 * @param {string} messageError - Message to send in case of error
 * @param {string} messageNoDataFound - Message to send in case of not finding information
 */
module.exports = {
	/**
    * Id - Name of the plugin to use
    * @property {string}  id - Name of the plugin to use
    */
    id: 'wiki',
    plugin(_args) {
        const args = this.mergeOpts(defaultConfig, _args);
        if (args.idChat !== '' && args.search !== '') {
            args.language = args.language.toLowerCase();
            searchGoogle(args.search.trim(), args.language)
			.then(data => {
                let msg = `*${ data.TITLE }* \n\n ${ data.DEFINITION }`
                this.sendMessage({
                    "idChat": args.idChat,
                    "message": msg
                });
			})
			.catch(err => {
				if (err === 'Definition not found'){
                    this.sendMessage({
                        "idChat": args.idChat, 
                        "message": args.messageNoDataFound
                    });
				}else {
					this.sendMessage({
                        "idChat": args.idChat, 
                        "message": args.messageError
                    });
				}
			});
        }
    }
};