Skip to content

Commit

Permalink
Update formatting only
Browse files Browse the repository at this point in the history
  • Loading branch information
amochtar committed Dec 13, 2019
1 parent 54f8baf commit 00f71d5
Show file tree
Hide file tree
Showing 6 changed files with 421 additions and 352 deletions.
8 changes: 4 additions & 4 deletions example/ranking.js

Large diffs are not rendered by default.

28 changes: 17 additions & 11 deletions src/addon/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,25 @@
"manifest_version": 2,
"name": "Advent of Code Ranking",
"version": "__GENERATED__",

"description": "Visualize the ranking over time of a Advent of Code private leaderboard",

"icons": {
"48": "icons/aoc-ranking-48.png",
"96": "icons/aoc-ranking-96.png"
},

"permissions": ["storage"],

"content_scripts": [{
"matches": ["https://adventofcode.com/*/leaderboard/private/view/*"],
"js": ["ranking.js"],
"css": ["ranking.css"]
}]
}
"permissions": [
"storage"
],
"content_scripts": [
{
"matches": [
"https://adventofcode.com/*/leaderboard/private/view/*"
],
"js": [
"ranking.js"
],
"css": [
"ranking.css"
]
}
]
}
230 changes: 118 additions & 112 deletions src/calculate.js
Original file line number Diff line number Diff line change
@@ -1,142 +1,148 @@
// note: days and levels are 1-based here
function getMemberCompletionDayLevel(member, day, level) {
var completed = null
var completed = null;

if (member.completion_day_level !== undefined &&
member.completion_day_level[day] != undefined &&
member.completion_day_level[day][level] !== undefined &&
member.completion_day_level[day][level].get_star_ts !== undefined) {
completed = member.completion_day_level[day][level].get_star_ts
}
if (
member.completion_day_level !== undefined &&
member.completion_day_level[day] != undefined &&
member.completion_day_level[day][level] !== undefined &&
member.completion_day_level[day][level].get_star_ts !== undefined
) {
completed = member.completion_day_level[day][level].get_star_ts;
}

return completed
return completed;
}

// note: days and levels are 1-based here
function compareMembersByDayLevel(day, level) {
return function (a, b) {
const aCompleted = getMemberCompletionDayLevel(a, day, level)
const bCompleted = getMemberCompletionDayLevel(b, day, level)
return function(a, b) {
const aCompleted = getMemberCompletionDayLevel(a, day, level);
const bCompleted = getMemberCompletionDayLevel(b, day, level);

if (aCompleted === bCompleted) {
return +b.id - +a.id
}
if (aCompleted === null) {
return 1
}
if (bCompleted === null) {
return -1
}
return +aCompleted - +bCompleted
}
if (aCompleted === bCompleted) {
return +b.id - +a.id;
}
if (aCompleted === null) {
return 1;
}
if (bCompleted === null) {
return -1;
}
return +aCompleted - +bCompleted;
};
}

// note: day is 0-based here
function compareRankingByDay(day) {
return function (a, b) {
if (a.scores[day] === b.scores[day]) {
return +a.id - +b.id
}
return b.scores[day] - a.scores[day]
}
return function(a, b) {
if (a.scores[day] === b.scores[day]) {
return +a.id - +b.id;
}
return b.scores[day] - a.scores[day];
};
}

// note: day is 0-based here
function compareTotalRankingByDay(day) {
return function (a, b) {
if (a.total_scores[day] === b.total_scores[day]) {
return +a.id - +b.id
}
return b.total_scores[day] - a.total_scores[day]
}
return function(a, b) {
if (a.total_scores[day] === b.total_scores[day]) {
return +a.id - +b.id;
}
return b.total_scores[day] - a.total_scores[day];
};
}

export function calculateRanking(data) {
// initialize ranking structure
var members = Object.values(data.members)
var ranking = {}
members.forEach(member => {
name = member.name
if (member.name === undefined || member.name === null) {
name = '(anonymous user #' + member.id + ')'
}
ranking[member.id] = {
id: member.id,
name: name,
total_score: 0,
scores: [],
ranks: [],
stars: [],
total_scores: [],
total_ranks: [],
completed: [],
medals: []
}
})
// initialize ranking structure
var members = Object.values(data.members);
var ranking = {};
members.forEach(member => {
name = member.name;
if (member.name === undefined || member.name === null) {
name = "(anonymous user #" + member.id + ")";
}
ranking[member.id] = {
id: member.id,
name: name,
total_score: 0,
scores: [],
ranks: [],
stars: [],
total_scores: [],
total_ranks: [],
completed: [],
medals: []
};
});

// max score per star is number of members
const max_score = members.length
// max score per star is number of members
const max_score = members.length;

var max_days = Object.values(data.members).reduce(function(acc, m) {
var l = Object.values(m.completion_day_level).length;
if (l > acc) {
return l;
}
return acc;
}, 0)
var max_days = Object.values(data.members).reduce(function(acc, m) {
var l = Object.values(m.completion_day_level).length;
if (l > acc) {
return l;
}
return acc;
}, 0);

// do actual calculation of scores and stars
for (let d = 0; d < 25; d++) {
var date = Date.UTC(data.event, 11, d+1, 5)
if (d < max_days || date < new Date().getTime()) {
for (let l = 1; l <= 2; l++) {
members.sort(compareMembersByDayLevel(d+1, l))
members.forEach(function (member, index) {
if (ranking[member.id].scores[d] === undefined) {
ranking[member.id].scores[d] = 0
}
// do actual calculation of scores and stars
for (let d = 0; d < 25; d++) {
var date = Date.UTC(data.event, 11, d + 1, 5);
if (d < max_days || date < new Date().getTime()) {
for (let l = 1; l <= 2; l++) {
members.sort(compareMembersByDayLevel(d + 1, l));
members.forEach(function(member, index) {
if (ranking[member.id].scores[d] === undefined) {
ranking[member.id].scores[d] = 0;
}

if (ranking[member.id].stars[d] === undefined) {
ranking[member.id].stars[d] = 0
}
var completed = getMemberCompletionDayLevel(member, d+1, l)
if (completed !== null) {
ranking[member.id].stars[d] = l
var score = max_score - index
if (data.event == "2018" && d+1 == 6) {
score = 0
if (ranking[member.id].stars[d] === undefined) {
ranking[member.id].stars[d] = 0;
}
var completed = getMemberCompletionDayLevel(
member,
d + 1,
l
);
if (completed !== null) {
ranking[member.id].stars[d] = l;
var score = max_score - index;
if (data.event == "2018" && d + 1 == 6) {
score = 0;
}
ranking[member.id].scores[d] += score;
ranking[member.id].total_score += score;
}
ranking[member.id].completed[d] = completed;
ranking[member.id].total_scores[d] =
ranking[member.id].total_score;
if (completed && index < 3) {
ranking[member.id].medals[d] = index + 1;
} else {
ranking[member.id].medals[d] = 0;
}
});
}
ranking[member.id].scores[d] += score
ranking[member.id].total_score += score
}
ranking[member.id].completed[d] = completed
ranking[member.id].total_scores[d] = ranking[member.id].total_score
if (completed && index < 3) {
ranking[member.id].medals[d] = index + 1
}
else {
ranking[member.id].medals[d] = 0
}
})
}
}
}
}
ranking = Object.values(ranking)
ranking = Object.values(ranking);

// finally get ranks and total_ranks for all days
for (let d = 0; d < 25; d++) {
let date = Date.UTC(data.event, 11, d+1, 5)
if (d === 0 || d < max_days || date < new Date().getTime()) {
ranking.sort(compareRankingByDay(d))
ranking.forEach(function(rank, index) {
ranking[index].ranks[d] = index + 1
})
ranking.sort(compareTotalRankingByDay(d))
ranking.forEach(function(rank, index) {
ranking[index].total_ranks[d] = index + 1
})
// finally get ranks and total_ranks for all days
for (let d = 0; d < 25; d++) {
let date = Date.UTC(data.event, 11, d + 1, 5);
if (d === 0 || d < max_days || date < new Date().getTime()) {
ranking.sort(compareRankingByDay(d));
ranking.forEach(function(rank, index) {
ranking[index].ranks[d] = index + 1;
});
ranking.sort(compareTotalRankingByDay(d));
ranking.forEach(function(rank, index) {
ranking[index].total_ranks[d] = index + 1;
});
}
}
}

return {ranking: ranking}
return { ranking: ranking };
}
42 changes: 27 additions & 15 deletions src/loader.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const browser = require("webextension-polyfill")
const browser = require("webextension-polyfill");

function fetchData(url, key) {
return fetch(url)
Expand All @@ -7,33 +7,45 @@ function fetchData(url, key) {
var val = {
data: data,
date: new Date().getTime()
}
browser.storage.local.set({[key]: val})
return data
};
browser.storage.local.set({ [key]: val });
return data;
})
.catch(err => {console.log(err)})
.catch(err => {
console.log(err);
});
}

export function loadData() {
return new Promise((resolve, reject) => {
if (window.data) {
resolve(window.data)
return
resolve(window.data);
return;
}

const url = document.location.protocol + '//' + document.location.host + document.location.pathname + ".json"
const url =
document.location.protocol +
"//" +
document.location.host +
document.location.pathname +
".json";

browser.storage.local.get(url).then(k => {
if (k === null || !k.hasOwnProperty(url) || !k[url].hasOwnProperty('data') || !k[[url]].hasOwnProperty('date')) {
fetchData(url, url).then(data => resolve(data))
if (
k === null ||
!k.hasOwnProperty(url) ||
!k[url].hasOwnProperty("data") ||
!k[[url]].hasOwnProperty("date")
) {
fetchData(url, url).then(data => resolve(data));
} else {
const ttl = new Date(k[url].date + (5 * 60 * 1000))
const ttl = new Date(k[url].date + 5 * 60 * 1000);
if (ttl < new Date()) {
fetchData(url, url).then(data => resolve(data))
fetchData(url, url).then(data => resolve(data));
} else {
resolve(k[url].data)
resolve(k[url].data);
}
}
})
})
});
});
}
9 changes: 4 additions & 5 deletions src/ranking.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import {loadData} from './loader'
import {calculateRanking} from './calculate'
import {visualize} from './visualize'

import { loadData } from "./loader";
import { calculateRanking } from "./calculate";
import { visualize } from "./visualize";

loadData()
.then(data => calculateRanking(data))
.then(ranking => visualize(ranking))
.then(ranking => visualize(ranking));
Loading

0 comments on commit 00f71d5

Please sign in to comment.