teambot-club/teambot

View on GitHub
bot/skills-loader.js

Summary

Maintainability
B
6 hrs
Test Coverage
var SkillsLoader = function () {
    var npm = require('npm'),
        skillsProvider = require('server/providers/skills-provider'),
        fs = require('fs');


    function install(controller, middleware, skillsArr, callback) {

        npm.load({
            loaded: false
        }, function (err, npm) {

            // catch errors
            npm.commands.install(skillsArr, function (err, data) {

                if (err) {
                    callback(err, null);
                    return;
                }

                if (data.length === 0) {
                    callback(err, 'Modules already installed');
                    return;
                } else {
                    loadTeambotSkillsOnly(skillsArr, controller, middleware);
                    callback(err, data);
                    return;
                }
            });

            npm.on('log', function (message) {
                // log the progress of the installation
                console.log(message);
            });
        });
    }

    function loadTeambotSkillsOnly(skillsArr, controller, middleware) {
        for (var idx = 0; idx < skillsArr.length; idx++) {
            var skill = getSkillShortName(skillsArr[idx]);

            if (isTeamBotSkill(skill)) {
                require(skill)(controller, middleware);
                console.log(skill + ' IS installed successfully');
            } else {
                console.log(skill + ' IS NOT valid Teambot skill');
            }
        }
    }

    function getSkillShortName(name) {
        var versionIndex = name.indexOf('@');
        var shortName = versionIndex !== -1 ?
            name.substring(0, versionIndex) :
            name;
        return shortName;
    }

    function getKeywords(packageName) {
        var packageJsonFilePath = 'node_modules/' + packageName + '/package.json',
            keywords = 'undefined';
        try {
            keywords = JSON.parse(fs.readFileSync(packageJsonFilePath, 'utf8')).keywords;
        } catch (err) {
            console.log(err);
        }

        return keywords;
    }

    function isTeamBotSkill(packageName) {
        var isSkill = false;
        var skillKeywords = getKeywords(packageName);

        try {
            isSkill = skillKeywords.indexOf('ecosystem:teambot') > -1;
        } catch (err) {
            console.log(err);
        }

        return isSkill;
    }

    function installPredefinedSkills(controller, middleware, skill, callback) {
        ensureDefaultSkills(function () {
            skillsProvider.getSkills(function (err, installedSkills) {
                if (err) {
                    console.log(err);
                    return;
                }

                if (skill) {
                    installedSkills.push(skill);
                }

                installedSkills = installedSkills.map(function (skill) {
                    return skill.source;
                });
                install(controller, middleware, installedSkills, callback);
            });
        });
    }

    function ensureDefaultSkills(callback) {
        try {
            var defaultSkills = require('bot/default-skills.json');
            if (!defaultSkills) {
                return callback();
            }

            skillsProvider.upsertSkills(defaultSkills, function () {
                callback();
            });
        } catch (err) {
            console.log(err);
            callback();
        }
    }

    return {
        install: install,
        installPredefinedSkills: installPredefinedSkills
    };
} ();

module.exports = SkillsLoader;