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 + "
" + dn.player + ">];\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);