Source: lib/argv.js

var check = require("check-types");
var fs = require("fs");
var request = require("request");
var seed = require(__dirname + "/seed-reloader.js");
var edit = require('string-editor');
var _ = require("underscore");
/**
	Parses and executes or triggers messages for command line args.
	@constructor
	@author Tilak Patidar <tilakpatidar@gmail.com>
	@constructor 
	@param {Message} message_obj
*/
var ArgumentProcesser = function(message_obj) {

    var proto = require(__dirname + "/proto.js");
    var JSONX = proto.JSONX;
    var message = message_obj;
    var parent_dir = proto.getAbsolutePath(__dirname);
    var config = message.get('config');
    var seed = message.get('seed');
    var args = {};
    var argv = message.get('argv');

    /**
		Updates config in db.
		@param {Object} result - JSON rep of the config.
		@private
    */
    var updateConfig = function(result) {
        config.updateDbConfig(result, function(err) {
            setTimeout(function() {
                if (err) {
                    console.log("Config updated [ERROR]");
                } else {
                    console.log("Config updated [SUCCESS]");
                }
                message.set('stop_bot_and_exit');
            }, 2000);

        }); //regex safe json update to db
    };


    /**
		Key-Value pair rep Arg-callback
		@private
    */
    var actions = {
        "verbose": function() {
            var item = JSON.parse(argv["verbose"]);
            args['verbose'] = item;
        },
        "logging": function() {
            var item = JSON.parse(argv["logging"]);
            args['logging'] = item;
        },
        "childs": function() {
            var item = argv["childs"];
            args['childs'] = item;
        },
        "max_concurrent_sockets": function() {
            var item = argv["max_concurrent_sockets"];
            args['max_concurrent_sockets'] = item;
        },
        "batch_size": function() {
            var item = argv["batch_size"];
            args['batch_size'] = item;
        },
        "force": function() {
            message.set('force_mode', true);
        },
        "reset": function() {
            message.set('reset', true);
        },
        "loadSeedFile": function() {
            message.set('seedFilePath', argv['loadSeedFile']);
        },
        "editSeedFile": function() {
            message.set('editSeedFile', true);
            args["verbose"] = false;
            args["logging"] = false;
            message.set('webappOnly', true);
        },
        "removeSeed": function() {
            message.set('removeSeed', {});
            message.get('removeSeed')[argv["removeSeed"]] = true;
        },
        "webapp": function() {
            message.set('webappOnly', true);
        },
        "allow_robots": function() {
            var item = JSON.parse(argv["allow_robots"]);
            args['allow_robots'] = item;
        },
        "external_links": function() {
            var item = JSON.parse(argv["external_links"]);
            args['external_links'] = item;
        },
        "parse_sitemaps": function() {
            var item = JSON.parse(argv["parse_sitemaps"]);
            args['parse_sitemaps'] = item;
        },
        "config": function() {
            message.set('modifyConfig', true);
            config.getConfigFromDb(function(err, result) {
                if (err || (!check.assigned(err) && !check.assigned(result))) {
                    //config not present in the db user want to set it first time
                    var c = require(parent_dir + "/config/config.js").load();
                    //console.log(c);
                    var jsonx_str = new JSONX(c);

                    edit(jsonx_str.stringify(), "config.json", function(err, result) {
                        // when you are done editing result will contain the string 
                        console.log("Updating config please wait!");
                        //console.log(result)
                        var dic = JSONX.parse(result);
                        updateConfig(JSON.parse(result));

                    });
                } else {
                    //config update
                    var c = result;
                    var jsonx_str = new JSONX(c);
                    edit(JSON.stringify(c, null, 2), "config.json", function(err, result) {
                        // when you are done editing result will contain the string 
                        console.log("Updating config please wait!");
                        //console.log(result)
                        var dic = JSONX.parse(result);
                        updateConfig(JSON.parse(result));

                    });
                }
            });
            args["verbose"] = false;
            args["logging"] = false;
            message.set('webappOnly', true);
        },
        "dump-config": function() {
            message.set('modifyConfig', true);
            var p = require("path");
            var path_json = p.join(argv["dump-config"], "config.json");
            console.log(path_json);
            var config_str;
            config.getConfigFromDb(function(err, result) {
                if (err || (!check.assigned(err) && !check.assigned(result))) {
                    var c = require(parent_dir + "/config/config.js").load();
                    config_str = c;
                } else {
                    var c = result;
                    config_str = c;
                }
                var stream = fs.createWriteStream(path_json);
                stream.write(JSON.stringify(config_str, null, 2));
                stream.end();
                stream.on('finish', function() {
                    message.set('stop_bot_and_exit');
                });

            });
            args["verbose"] = false;
            args["logging"] = false;
            message.set('webappOnly', true);
        },
        "load-config": function() {
            message.set('modifyConfig', true);
            console.log("Updating config please wait!");
            //console.log(result)
            var path_json = argv["load-config"];
            var json_str = fs.readFileSync(path_json).toString();
            updateConfig(JSON.parse(json_str));


            args["verbose"] = false;
            args["logging"] = false;
            message.set('webappOnly', true);
        },
        "help": function() {
            console.log("For help options run \"man bot-marvin\"");
            message.set('stop_bot_and_exit');
        }
    }

    /**
		Set messages for supplied args and returns overriden config.
		@public
    */
    this.parse = function() {
        //console.log("Command line argv recieved "+JSON.stringify(argv), "info");
        _.each(actions, function(elem, key) {
            if (check.assigned(argv[key])) {
                actions[key]();
            }
        });
        //console.log(args);
        return args;
    };
};


module.exports = ArgumentProcesser;