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

MediaWiki interface page
Add live Minecraft server status to the homepage
 
Refresh live server status every five seconds
Line 113: Line 113:
         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) {

Revision as of 21:50, 31 August 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;
        }

        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, 5000);
        document.addEventListener('visibilitychange', function () {
            if (!document.hidden) {
                refreshStatus();
            }
        });
    }

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