Source

plugins/meme.js

// Modules to install separately
const request = require('request');
const ConvertBase64 = require('../lib/convertBase64');
const convert64 = new ConvertBase64();

const subreddits = {
    "en": ['dankmemes', 'wholesomeanimemes', 'wholesomememes', 'AdviceAnimals', 'MemeEconomy', 'memes', 'terriblefacebookmemes', 'teenagers', 'historymemes'],
    "es": ['LatinoPeopleTwitter', 'chistes', 'Divertido', 'SpanishMeme', 'memexico']
}

const evaluateMeme = (_info) => {
    return new Promise((resolve, reject) => {
        let type = '';
        if (_info.url.indexOf(".mp4") !== -1) {
            type = 'video';
        } else if (_info.url.indexOf(".gif") !== -1) {
            type = 'gif';
        } else if (_info.url.indexOf(".jpg") !== -1
            || _info.url.indexOf(".jpeg") !== -1
            || _info.url.indexOf(".png") !== -1
        ) { 
            type = 'image';
        }

        if (type !== ''){
            resolve({
                'type': type, 
                'caption': _info.title, 
                'meme': _info.url
            });
        } else {
            resolve({
                'type': '', 
                'caption': '', 
                'meme': ''
            });
        }
    });
}

const defaultConfig = {
    idChat: '',
    language: 'en',
    messageError: '*Ooops, an error occurred while trying to search, try again later*',
    messageNoSubReddit: '*No subreddits found for the indicated language*',
    messageTypeNoSupport: '*Type of meme not supported*'
}
/**
 * Plugin that allows you to send different memes from subreddits in English and Spanish
 * @function meme
 * @memberof Plugins
 * @param {string} idChat - Chat id to send the new image to
 * @param {string} language - Language to search memes (en / es)
 * @param {string} messageError - Message to send in case of error
 * @param {string} messageNoSubReddit - Message to send when no subreddits are found for the indicated language
 * @param {string} messageTypeNoSupport - Message to send when the received meme is not supported
 */
module.exports = {
	/**
    * Id - Name of the plugin to use
    * @property {string}  id - Name of the plugin to use
    */
    id: 'meme',
    plugin(_args) {
        const _this = this;
        const args = this.mergeOpts(defaultConfig, _args);
        if (args.idChat !== '') {
            args.language = args.language.toLowerCase();
            if (subreddits[args.language] !== undefined) {
                const _sub = subreddits[args.language][Math.floor(Math.random() * subreddits[args.language].length)] || subreddits[args.language][0];
                request('https://meme-api.herokuapp.com/gimme/' + _sub, (error, response, body) => {
                    if (error) { 
                        _this.sendMessage({
                            "idChat": args.idChat, 
                            "message": args.messageError
                        });        
                    } else {
                        let _info = JSON.parse(body.toString('utf8'));
                        evaluateMeme(_info) 
                        .then((data) => {
                            if (data.type === '') {
                                _this.sendMessage({
                                    "idChat": args.idChat, 
                                    "message": args.messageTypeNoSupport
                                });    
                            } else if (data.type === 'image') {
                                _this.sendImage({
                                    "idChat": args.idChat,
                                    "caption": data.caption,
                                    "file": data.meme
                                });
                            } else if (data.type === 'gif') { 
                                _this.sendGif({
                                    "idChat": args.idChat,
                                    "caption": data.caption,
                                    "file": data.meme
                                })
                            } else if (data.type === 'video') { 
                                _this.sendVideo({
                                    "idChat": args.idChat,
                                    "caption": data.caption,
                                    "file": data.meme
                                })
                            }
                        })
                        .catch((err) => {
                            _this.sendMessage({
                                "idChat": args.idChat, 
                                "message": args.messageError
                            });
                        })
                    }
                })
            } else {
                _this.sendMessage({
                    "idChat": args.idChat, 
                    "message": args.messageNoSubReddit
                });
            }
        }
    }
};