Jump to content
Toggle menu
  • 38 articles
  • 12 files
  • 9 users
  • 377 edits
Create Server Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

This wiki may be out of date or incorrect. If you'd like to help update it, please DM me on Discord @eszn

MediaWiki:Common.js

MediaWiki interface page
Revision as of 12:19, 1 September 2026 by WikiAdmin (talk | contribs) (Alphabetize live players, enable short URLs, and standardize Cold War title)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
(function () {
    'use strict';

    var refreshTimer;

    function setText(id, value) {
        var element = document.getElementById(id);
        if (element) {
            element.textContent = value;
        }
    }

    function renderPlayers(container, names, online, listComplete) {
        container.replaceChildren();

        if (online === 0) {
            container.textContent = 'Nobody is online.';
            return;
        }

        if (!Array.isArray(names) || names.length === 0) {
            container.textContent = 'Player names are not available from the server.';
            return;
        }

        var sortedNames = names.slice().sort(function (left, right) {
            return String(left).localeCompare(String(right), undefined, {
                sensitivity: 'base',
                numeric: true
            });
        });

        sortedNames.forEach(function (name) {
            var player = document.createElement('a');
            player.className = 'csw-server-player';
            player.href = '/wiki/' + encodeURIComponent(name.replace(/ /g, '_'));
            player.textContent = name;
            container.appendChild(player);
        });

        if (!listComplete) {
            var remainder = Math.max(online - sortedNames.length, 0);
            if (remainder > 0) {
                var more = document.createElement('span');
                more.className = 'csw-server-player-more';
                more.textContent = '+' + remainder + ' more';
                container.appendChild(more);
            }
        }
    }

    function renderStatus(data) {
        var root = document.getElementById('csw-server-status');
        var dot = document.getElementById('csw-server-status-dot');
        var players = document.getElementById('csw-server-player-list');
        if (!root || !dot || !players) {
            return;
        }

        dot.className = 'csw-server-status-dot ' + (data.online ? 'csw-server-status-dot-online' : 'csw-server-status-dot-offline');
        root.classList.toggle('csw-server-status-online', Boolean(data.online));
        root.classList.toggle('csw-server-status-offline', !data.online);

        if (!data.online) {
            setText('csw-server-status-label', 'Server offline');
            setText('csw-server-player-count', '0 players');
            setText('csw-server-motd', 'The Minecraft server is not responding.');
            players.textContent = 'Nobody is online.';
        } else {
            var playerData = data.players || {};
            var online = Number(playerData.online) || 0;
            var max = Number(playerData.max) || 0;
            setText('csw-server-status-label', 'Server online');
            setText('csw-server-player-count', online + ' / ' + max + ' players');
            setText('csw-server-motd', data.motd || 'Create Server');
            renderPlayers(players, playerData.names, online, Boolean(playerData.list_complete));
        }

        var checked = data.checked_at ? new Date(data.checked_at) : new Date();
        setText('csw-server-status-updated', 'Updated ' + checked.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit', second: '2-digit' }));
    }

    function renderError() {
        var dot = document.getElementById('csw-server-status-dot');
        if (dot) {
            dot.className = 'csw-server-status-dot csw-server-status-dot-offline';
        }
        setText('csw-server-status-label', 'Status unavailable');
        setText('csw-server-player-count', '— / — players');
        setText('csw-server-motd', 'The live status service could not be reached.');
        setText('csw-server-player-list', 'Player list unavailable.');
        setText('csw-server-status-updated', 'Retrying automatically…');
    }

    function refreshStatus() {
        if (!document.getElementById('csw-server-status')) {
            return;
        }

        fetch('/server-status.php', {
            credentials: 'same-origin',
            cache: 'no-store',
            headers: { Accept: 'application/json' }
        })
            .then(function (response) {
                if (!response.ok) {
                    throw new Error('Status request failed');
                }
                return response.json();
            })
            .then(renderStatus)
            .catch(renderError);
    }

    function initServerStatus() {
        if (!document.getElementById('csw-server-status')) {
            return;
        }

        refreshStatus();
        window.clearInterval(refreshTimer);
        refreshTimer = window.setInterval(refreshStatus, 5000);
        document.addEventListener('visibilitychange', function () {
            if (!document.hidden) {
                refreshStatus();
            }
        });
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initServerStatus, { once: true });
    } else {
        initServerStatus();
    }
}());