ticketvr
Version:
check your ticketVR balance in the command line - Brazilian tickets only
220 lines (190 loc) • 6.81 kB
JavaScript
(function() {
var Insight, checkCards, clc, defaults, fs, getTransactionList, insight, makeRequest, notifier, pkg, request, showError, showResult, showScheduling, showTransactionList, ticketVR, updateNotifier, userhome, writeFile;
ticketVR = require('commander');
request = require('request');
fs = require('fs');
userhome = require('userhome');
clc = require('cli-color');
updateNotifier = require('update-notifier');
Insight = require('insight');
pkg = require('../package.json');
insight = new Insight({
packageName: pkg.name,
packageVersion: pkg.version,
trackingCode: 'UA-5427757-46'
});
if (insight.optOut === void 0) {
return insight.askPermission();
}
String.prototype.clean = function() {
return this.replace(/[ -.]/g, '');
};
defaults = {
base: "http://www.ticket.com.br/portal-web/consult-card",
random: function() {
return Math.random();
},
url: function(type, card) {
return "" + this.base + "/balance/json?chkProduto=TR&card=" + card + "&rand=" + this.random;
},
tUrl: function(card, token, rows) {
return "" + this.base + "/release/json?txtOperacao=lancamentos&token=" + token + "&card=" + card + "&rows=" + rows + "&rand=" + this.random;
},
list: ['Ticket Restaurante', 'Ticket Alimentação'],
types: ['TR', 'TA'],
file: userhome('.ticketVR.json')
};
ticketVR.version(pkg.version).option('-r, --remove', 'Remover os cartões salvos').option('-l, --list [value]', 'Listar últimas transações. Ex: ticketVR -l 10', parseInt).parse(process.argv);
notifier = updateNotifier({
packagePath: '../package'
});
if (notifier.update) {
notifier.notify();
}
makeRequest = function(type, card, callback) {
var options;
options = {
headers: {
"Host": "www.ticket.com.br",
"Referer": "http://www.ticket.com.br/portal/portalcorporativo/home/home.htm",
"X-Requested-With": "XMLHttpRequest",
"Accept": "application/json, text/javascript, */*; q=0.01"
},
url: defaults.url(type, card)
};
return request(options, function(err, res, body) {
var result, val;
if (!err && res.statusCode === 200) {
result = JSON.parse(body);
if (err || !result.status) {
return showError(result.messageError, card);
} else {
showResult(type, clc.blue(result.card.balance.value));
if (ticketVR.list) {
val = typeof ticketVR.list === 'number' ? ticketVR.list : 6;
getTransactionList(card, result.token, val);
}
showScheduling(result.card.scheduling);
if (typeof callback === "function") {
return callback();
}
}
} else {
console.log('----------------------------------');
console.log(clc.red("Não foi possível conectar com o servidor :(\nVerifique sua conexão com a internet."));
console.log('----------------------------------');
return process.stdin.destroy();
}
});
};
getTransactionList = function(card, token, rows) {
var options;
options = {
headers: {
"Host": "www.ticket.com.br",
"Referer": "http://www.ticket.com.br/portal/portalcorporativo/usuario/consulte-seu-saldo/consulte-seu-saldo.htm?card=" + card + "&token=" + token,
"X-Requested-With": "XMLHttpRequest",
"Accept": "application/json, text/javascript, */*; q=0.01"
},
url: defaults.tUrl(card, token, rows)
};
return request(options, function(err, res, body) {
var result;
result = JSON.parse(body);
if (err || !result.status) {
return showError(result.messageError, token);
} else {
return showTransactionList(result.card.release);
}
});
};
checkCards = function(type, file, callback) {
var data, json;
if (fs.existsSync(file)) {
data = fs.readFileSync(file, 'utf8');
json = JSON.parse(data);
if (!!json[type]) {
defaults.cards = json[type];
return callback(true);
} else {
return callback(false);
}
} else {
return callback(false);
}
};
showTransactionList = function(itens) {
if (itens.length > 0) {
console.log("Últimas transações:");
itens.forEach(function(iten) {
return console.log(" • " + iten.date + " | %s | " + iten.description, clc.red("R$" + iten.value));
});
return console.log('----------------------------------');
}
};
showScheduling = function(itens) {
if (itens.length > 0) {
return itens.forEach(function(iten) {
console.log("Próximo depósito no dia %s no valor de R$ %s", clc.blue(iten.date), clc.blue(iten.value));
console.log("Motivo: " + iten.description);
return console.log('----------------------------------');
});
}
};
showResult = function(type, value) {
console.log('----------------------------------');
console.log(' O saldo do seu %s é R$ %s', type, value);
console.log('----------------------------------');
return process.stdin.destroy();
};
showError = function(err, card) {
console.log(clc.red('ERRO'));
console.log(clc.red('%s: %s'), err, card);
insight.track('error', 'err');
return process.stdin.destroy();
};
writeFile = function(file, type, card) {
var data, json;
if (fs.existsSync(file)) {
data = fs.readFileSync(file, 'utf8');
json = JSON.parse(data);
} else {
json = {};
}
json[type] = card.clean();
fs.writeFileSync(file, JSON.stringify(json, null, 4));
console.log("Seu cartão foi salvo com sucesso!\nPara apagar use o comando 'ticketVR -r'\n----------------------------------");
return insight.track('cards', 'saved');
};
console.log('----------------------------------');
console.log("Escolha o tipo de cartão:");
if (ticketVR.remove) {
fs.unlinkSync(defaults.file);
insight.track('cards', 'deleted');
}
ticketVR.choose(defaults.list, function(i) {
var list, type;
type = defaults.types[i];
list = defaults.list[i];
if (ticketVR.list) {
insight.track('cards', 'list', 'type', type);
} else {
insight.track('cards', 'type', type);
}
return checkCards(type, defaults.file, function(exist) {
if (exist) {
return makeRequest(type, defaults.cards.clean());
} else {
return ticketVR.prompt("Número do " + list + ": ", /\b(?:\d[ -.]*?){16}\b/, function(card) {
return makeRequest(type, card.clean(), function() {
return writeFile(defaults.file, type, card);
});
});
}
});
});
}).call(this);
/*
//@ sourceMappingURL=ticketVR.js.map
*/