Emberveil source

website/player-count.js

(() => {
  const output = document.getElementById('player-count');
  if (!output) return;
  const endpoint = 'https://downloads.emberveil.net/status.json';
  async function update() {
    const controller = new AbortController();
    const timeout = setTimeout(() => controller.abort(), 8000);
    try {
      const response = await fetch(endpoint, {cache: 'no-store', signal: controller.signal});
      if (!response.ok) throw new Error('Status unavailable');
      const status = await response.json();
      const age = Date.now() - status.updatedAt;
      if (status.online !== true || !Number.isSafeInteger(status.players) || status.players < 0 ||
          !Number.isSafeInteger(status.updatedAt) || age > 45000 || age < -45000) throw new Error('Stale status');
      output.textContent = `${status.players.toLocaleString()} ${status.players === 1 ? 'player' : 'players'} online`;
    } catch (_) {
      output.textContent = 'Player count unavailable';
    } finally {
      clearTimeout(timeout);
    }
  }
  update();
  setInterval(() => { if (!document.hidden) update(); }, 15000);
  document.addEventListener('visibilitychange', () => { if (!document.hidden) update(); });
})();