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: Difference between revisions

MediaWiki interface page
Add live Minecraft server status to the homepage
 
Alphabetize live players, enable short URLs, and standardize Cold War title
 
(One intermediate revision by one other user not shown)
Line 24: Line 24:
         }
         }


         names.forEach(function (name) {
         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');
             var player = document.createElement('a');
             player.className = 'csw-server-player';
             player.className = 'csw-server-player';
             player.href = '/index.php/' + encodeURIComponent(name.replace(/ /g, '_'));
             player.href = '/wiki/' + encodeURIComponent(name.replace(/ /g, '_'));
             player.textContent = name;
             player.textContent = name;
             container.appendChild(player);
             container.appendChild(player);
Line 33: Line 40:


         if (!listComplete) {
         if (!listComplete) {
             var remainder = Math.max(online - names.length, 0);
             var remainder = Math.max(online - sortedNames.length, 0);
             if (remainder > 0) {
             if (remainder > 0) {
                 var more = document.createElement('span');
                 var more = document.createElement('span');
Line 113: Line 120:
         refreshStatus();
         refreshStatus();
         window.clearInterval(refreshTimer);
         window.clearInterval(refreshTimer);
         refreshTimer = window.setInterval(refreshStatus, 30000);
         refreshTimer = window.setInterval(refreshStatus, 5000);
         document.addEventListener('visibilitychange', function () {
         document.addEventListener('visibilitychange', function () {
             if (!document.hidden) {
             if (!document.hidden) {

Latest revision as of 12:19, 1 September 2026

(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();
    }
}());