Add ranking to Xonotic scripts and clean up names

This commit is contained in:
DeathByDenim 2023-05-07 12:15:21 -04:00
parent 75b55979ac
commit e4f91b4b5a
Signed by: DeathByDenim
GPG Key ID: 4A475283D925365B
2 changed files with 115 additions and 74 deletions

View File

@ -1,8 +1,14 @@
// Parse the Xonotic score log format and return a JSON
// The returned data contains data for the individual
// rounds as well as totals
async function xonoticGetScores() {
const data = await fetch("xonscore.txt");
const text = await data.text();
let stats = [];
let stats = {
rounds: [],
totals: []
};
let map_name = "[unknown]";
let duration_in_seconds = 0;
let labels = [];
@ -23,8 +29,14 @@ async function xonoticGetScores() {
break;
case "player":
if(fields[2] === "see-labels") {
if(fields[5] === "spectator") {
break;
}
let split_fields = fields[3].split(",");
let player_stats = {name: fields[6]};
let player_name = fields[6]
.replace(/\^.../g, "")
.replaceAll("^7", "");
let player_stats = {name: player_name};
for(let i = 0; i < labels.length; i++) {
if(labels[i] != "") {
player_stats[labels[i]] = split_fields[i]
@ -36,7 +48,7 @@ async function xonoticGetScores() {
case "end":
if(round_stats.length > 0) {
round_stats = round_stats.sort((a,b) => +a["score!!"] < +b["score!!"]);
stats.push({
stats.rounds.push({
map_name: map_name,
duration_in_seconds: duration_in_seconds,
stats: round_stats
@ -51,14 +63,40 @@ async function xonoticGetScores() {
}
})
let final = {};
stats.rounds.forEach((map) => {
map.stats.forEach((stat) => {
if(stat.name in final) {
final[stat.name] += +stat["score!!"]
}
else {
final[stat.name] = +stat["score!!"]
}
});
});
Object.keys(final).forEach(name => {
stats.totals.push({
name: name,
score: final[name]
})
});
stats.totals = stats.totals.sort((a,b) => a.score < b.score);
return stats;
}
function xonoticScoreUpdate() {
xonoticGetScores().then((data) => {
d3.select("#xonotic-ranking")
.selectAll("li")
.data(data.totals)
.join("li")
.text(d => d.name + " (" + d.score + ")");
let tables = d3.select("#xonotic-results")
.selectAll("table")
.data(data)
.data(data.rounds)
.join(
(enter) => {
let table = enter.append("table");

View File

@ -24,6 +24,9 @@ nav_pill: tournament
{% endif %}
{% endfor %}
</ul>
<h2>Ranking</h2>
<ol id="xonotic-ranking"></ol>
<h2>Rounds</h2>
<div id="xonotic-results"></div>
<script>
if(typeof d3 === 'undefined') {