101 lines
4.0 KiB
JavaScript
101 lines
4.0 KiB
JavaScript
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); |