standings-graph/index.js

101 lines
4.0 KiB
JavaScript
Raw Normal View History

var fs = require('fs');
var parse = require('csv-parse');
const { DateTime } = require("luxon");
let matches = [];
let roundsInMatch = [];
function logLastMatch(){
var round1 = roundsInMatch[0];
if(roundsInMatch.length < 3){
matches.push(round1);
}else{
if(roundsInMatch.filter(rim => rim.victorious_deck == round1.victorious_deck).length >
roundsInMatch.filter(rim => rim.victorious_deck == round1.losing_deck).length){
matches.push(round1);
}else{
matches.push({
"victorious_deck": round1.losing_deck,
"victorious_player": round1.losing_player,
"losing_deck": round1.victorious_deck,
"losing_player": round1.victorious_player
});
}
}
}
var parser = parse({columns: true}, function (err, records) {
let sortedRecords = records.sort((lhs, rhs) => {
if (DateTime.fromISO(lhs.date) < DateTime.fromISO(rhs.date)){
return -1;
}else if (DateTime.fromISO(lhs.date) > DateTime.fromISO(rhs.date)){
return 1;
}
else return 0;
});
sortedRecords.forEach(rec => {
console.log(DateTime.fromISO(rec.date).toString());
let filterResultsSames = roundsInMatch.filter(round =>
(round.losing_player == rec.losing_player && round.losing_deck == rec.losing_deck &&
round.victorious_player == rec.victorious_player && round.victorious_deck == rec.victorious_deck)
);
let filterResultsOpposites = roundsInMatch.filter(round =>
(round.victorious_player == rec.losing_player && round.victorious_deck == rec.losing_deck &&
round.losing_player == rec.victorious_player && round.losing_deck == rec.victorious_deck)
);
if(roundsInMatch.length !== 0 && filterResultsSames.length == 0 && filterResultsOpposites.length == 0){
logLastMatch();
roundsInMatch = [];
}
roundsInMatch.push({
"victorious_deck": rec.victorious_deck,
"victorious_player": rec.victorious_player,
"losing_deck": rec.losing_deck,
"losing_player": rec.losing_player
});
});
logLastMatch();
let deckNodes = [];
let edges = [];
matches.forEach(match => {
let foundVictorNode = deckNodes.find(dn => dn.deck == match.victorious_deck && dn.player == match.victorious_player);
if(foundVictorNode === undefined){
foundVictorNode = {"deck": match.victorious_deck, "player": match.victorious_player, id: deckNodes.length};
deckNodes.push(foundVictorNode);
}else{
}
let foundLoserNode = deckNodes.find(dn => dn.deck == match.losing_deck && dn.player == match.losing_player);
if(foundLoserNode === undefined){
foundLoserNode = {"deck": match.losing_deck, "player": match.losing_player, id: deckNodes.length};
deckNodes.push(foundLoserNode);
}else{
}
let foundEdge = edges.find(e => e.victorId == foundVictorNode.id && e.loserId == foundLoserNode.id);
if(foundEdge === undefined){
foundEdge = {"victorId": foundVictorNode.id, "loserId": foundLoserNode.id, count: 0};
edges.push(foundEdge);
}else{
}
foundEdge.count++;
});
let dot = `digraph{\n\tbgcolor="silver";\n\tnode [shape="rectangle"];\n`;
deckNodes.forEach(dn => {
dot += "\td_" + dn.id + " [label=<" + dn.deck + "<br /><font point-size=\"10\">" + dn.player + "</font>>];\n"
});
dot += "\n";
edges.forEach(e => {
dot += "\td_" + e.victorId + " -> d_" + e.loserId;
if(e.count > 1){
dot += " [label=\"" + e.count + "\"]";
}
dot += ";\n";
});
dot += "}\n";
console.log(dot);
let writable = fs.createWriteStream(__dirname +'/standings.gv');
writable.write(dot);
});
parser.on('error', function(err){
console.error(err.message)
});
fs.createReadStream(__dirname+'/standings complete history.csv').pipe(parser);