code-warrior
Version:
code like a warrior
134 lines (118 loc) • 3.75 kB
JavaScript
var request = require('request'),
fs = require('fs'),
utils = require('../utils'),
mkdirp = require('mkdirp'),
slug = require('slug'),
Github = require('github'),
read = require('read'),
testCommand = require('./test');
var help = function() {
console.log("Commit: Commit code and run the test cases on server.");
console.log(" return success and points you get by answering the question");
console.log("Usage : war commit ");
}
module.exports = function(options) {
if (options.help) return help();
if (!fs.existsSync(utils.arena('index.js')) || !fs.existsSync(utils.arena('test.js'))) {
console.log('no file');
return;
}
testCommand(options, commit);
}
var commit = function(options) {
var package = require(utils.local('/package.json')),
config = require(utils.local('.config.json')),
code = fs.readFileSync(utils.arena('index.js'), 'utf8'),
test = fs.readFileSync(utils.arena('test.js'), 'utf8'),
meta = require(utils.arena('package.json')),
url = options.url;
request.post(url + '/api/commit',
{
'json': {
'code': code,
'test': test,
'level': meta.level,
'name': meta.name,
'id': meta.id,
'user': config.id,
'token': meta.token
},
'headers': {
'Cookie': config.cookie
}
}, function(err, res) {
if(err) {
console.log(err.message);
return;
}
if (res.statusCode !== 200) {
console.log(res.body);
return;
};
if(!res.body.success) {
console.log('YOU SHALL NOT PASS');
return;
}
console.log("=====CHALLANGE COMPLETE!!!=====");
if (!res.body.answered) {
console.log("=====YOU GAIN " + res.body.point + " points=======");
console.log("===============================");
};
read({prompt: 'share your solution to github:gist? (yes/no)'}, function(err, answer) {
if(answer.toLowerCase() == 'y' || answer.toLowerCase() == 'yes') {
uploadGist(meta, config, function(err, res) {
if(err) return;
var gist = res.html_url;
clearArena(meta, package, function() {
request.post(url + '/api/commit/gist', {
'json': {
'user': package.id,
'gist': gist
}
}, function() {
console.log('upload complete');
});
});
});
} else {
clearArena(meta, package);
}
});
});
}
var clearArena = function(meta, package, callback) {
var dir = utils.history(meta.level + '/' + slug(meta.name));
mkdirp(dir, function (err) {
utils.copyFileSync(utils.arena('index.js'), dir + '/index.js', 'utf8');
utils.copyFileSync(utils.arena('test.js'), dir + '/test.js');
utils.copyFileSync(utils.arena('readme.md'), dir + '/readme.md');
if (callback) {
callback(err);
};
});
}
var uploadGist = function(meta, config, callback) {
var github = new Github({ version: "3.0.0" });
github.authenticate({
type: "oauth",
token: config.token
});
github.gists.create({
description: 'Solving ' + meta.name +' problem from http://code-warrior.herokuapp.com.',
public: true,
'files': {
'readme.md': {
content: fs.readFileSync(utils.arena('readme.md'), 'utf8')
},
'index.js': {
content: fs.readFileSync(utils.arena('index.js'), 'utf8')
},
'test.js': {
content: fs.readFileSync(utils.arena('test.js'), 'utf8')
},
'package.json': {
content: fs.readFileSync(utils.arena('package.json'), 'utf8')
}
}
}, callback);
}