Jump to content
Toggle menu
  • 28 articles
  • 13 files
  • 9 users
  • 288 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.

MediaWiki:Common.js

MediaWiki interface page
Revision as of 21:43, 31 August 2026 by Maintenance script (talk | contribs) (Add live Minecraft server status to the homepage)
(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;
        }

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

        if (!listComplete) {
            var remainder = Math.max(online - names.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, 30000);
        document.addEventListener('visibilitychange', function () {
            if (!document.hidden) {
                refreshStatus();
            }
        });
    }

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