2022-12-29 14:11:18 +00:00
|
|
|
const ID = window.crypto.randomUUID();
|
2023-01-14 16:59:11 +00:00
|
|
|
// Timeout to consider a player disconnected
|
|
|
|
const TIMEOUT = 30_000;
|
2022-12-29 14:11:18 +00:00
|
|
|
|
2022-12-29 14:36:55 +00:00
|
|
|
let players = {};
|
|
|
|
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
2022-12-29 14:11:18 +00:00
|
|
|
let socket = io();
|
|
|
|
|
2022-12-29 14:36:55 +00:00
|
|
|
socket.on("connect", () => {
|
|
|
|
console.log("Connected!");
|
|
|
|
socket.emit("message", { type: "ANNOUNCE", author: ID, name: "" });
|
2023-01-14 16:59:11 +00:00
|
|
|
players[ID] = { name: "", timeout: null };
|
2022-12-29 14:11:18 +00:00
|
|
|
});
|
|
|
|
|
2022-12-29 14:36:55 +00:00
|
|
|
socket.on("message", (data) => {
|
|
|
|
// Ignore any messages that originate from us.
|
|
|
|
if (data.author !== ID) {
|
|
|
|
switch (data.type) {
|
|
|
|
case "ANNOUNCE":
|
|
|
|
playerConnected(socket, data);
|
|
|
|
break;
|
2023-01-14 16:59:11 +00:00
|
|
|
|
|
|
|
case "KEEPALIVE":
|
|
|
|
keepAlive(data);
|
|
|
|
break;
|
2022-12-29 14:36:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2023-01-14 16:59:11 +00:00
|
|
|
|
|
|
|
// Emit keepalive messages to inform other players we are still here
|
|
|
|
window.setInterval(() => {
|
|
|
|
socket.emit("message", { type: "KEEPALIVE", author: ID });
|
|
|
|
}, TIMEOUT / 5);
|
2022-12-29 14:11:18 +00:00
|
|
|
});
|
2022-12-29 14:36:55 +00:00
|
|
|
|
|
|
|
function playerConnected(socket, data) {
|
|
|
|
// When a new player is seen, all announce to ensure they know all players.
|
|
|
|
if (players[data.author] === undefined) {
|
2023-01-14 16:59:11 +00:00
|
|
|
players[data.author] = { name: data.name, timeout: window.setTimeout(() => { delete players[data.author]; updatePlayerDom(); }, TIMEOUT) };
|
2022-12-29 14:36:55 +00:00
|
|
|
socket.emit("message", { type: "ANNOUNCE", author: ID, name: "" });
|
|
|
|
} else {
|
|
|
|
}
|
2023-01-14 16:59:11 +00:00
|
|
|
|
|
|
|
updatePlayerDom();
|
|
|
|
}
|
|
|
|
|
|
|
|
function keepAlive(data) {
|
|
|
|
window.clearTimeout(players[data.author].timeout);
|
|
|
|
players[data.author].timeout = window.setTimeout(() => { delete players[data.author]; updatePlayerDom(); }, TIMEOUT);
|
|
|
|
}
|
|
|
|
|
|
|
|
function updatePlayerDom() {
|
|
|
|
let list = document.querySelector('#playerList');
|
|
|
|
list.replaceChildren();
|
|
|
|
for (let playerId of Object.keys(players)) {
|
|
|
|
let newDom = document.createElement('li');
|
|
|
|
newDom.textContent = playerId;
|
|
|
|
list.appendChild(newDom);
|
|
|
|
}
|
2022-12-29 14:36:55 +00:00
|
|
|
}
|