summaryrefslogtreecommitdiffstats
path: root/assets/presenter.js
blob: bfe41b8d93e23c6ec01446ebd043c23701837a57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
const overlayEl = document.getElementById("solve-overlay");
const firstBloodEl = document.getElementById("solve-first");
const teamEl = document.getElementById("solve-team");
const challengeEl = document.getElementById("solve-challenge");
const valueEl = document.getElementById("solve-value");
const scoreboardFrameEl = document.getElementById("scoreboard-frame");

const solveQueue = [];
let isShowingOverlay = false;

function pollNextSolve() {
	if (isShowingOverlay) {
		return;
	}

	if (solveQueue.length > 0) {
		const nextSolve = solveQueue.shift();
		showSolve(nextSolve.team, nextSolve.challenge, nextSolve.value, nextSolve.first);
	}
}

function showSolve(team, challenge, value, first) {
	teamEl.textContent = team;
	teamEl.setAttribute("data-text", team);
	challengeEl.textContent = challenge;
	challengeEl.setAttribute("data-text", challenge);
	valueEl.textContent = `+${value}`;
	valueEl.setAttribute("data-text", `+${value}`);

	if (first) {
		firstBloodEl.classList.add("visible");
	}

	overlayEl.classList.add("visible");
	isShowingOverlay = true;

	setTimeout(() => {
		overlayEl.classList.remove("visible");
		firstBloodEl.classList.remove("visible");

		setTimeout(() => {
			isShowingOverlay = false;
			pollNextSolve();
		}, 1000);
	}, first ? 8500 : 4500);
}

let reloadTimeout = null;

function reloadScoreboard(delay = 1000) {
	if (reloadTimeout) {
		clearTimeout(reloadTimeout);
	}

	reloadTimeout = setTimeout(() => {
		scoreboardFrameEl.src = "/scoreboard?ts=" + Date.now();
		reloadTimeout = null;
	}, delay);
}

const es = new EventSource("/presenter/events");

es.onmessage = (e) => {
	const data = JSON.parse(e.data);
	if (data.type === "solve") {
		solveQueue.push(data);
		reloadScoreboard();
		pollNextSolve();
	}
};