MediaWiki:Common.js: различия между версиями

Add live Red Star server status
 
Удаление старого эксперимента с глобальным поиском
Метка: ручная отмена
 
(не показано 13 промежуточных версий этого же участника)
Строка 1: Строка 1:
(function () {
(() => {
     function formatRoundTime(rawTime) {
     const root = document.getElementById('rs-server-status');
        if (!rawTime) {
            return '?';
        }


         try {
    if (!root) {
            var normalized = rawTime.replace('Z', '+00:00');
         return;
            var start = new Date(normalized);
    }
            var now = new Date();
    const state = document.getElementById('rs-status-state');
    const map = document.getElementById('rs-status-map');
    const time = document.getElementById('rs-status-time');
    const preset = document.getElementById('rs-status-preset');
    const players = document.getElementById('rs-status-players');
    const maxPlayers = document.getElementById('rs-status-max');


            if (Number.isNaN(start.getTime())) {
    let roundStart = null;
                return '?';
    let runLevel = 0;
            }


            var totalMinutes = Math.max(0, Math.floor((now - start) / 60000));
    function formatDuration(milliseconds) {
             var hours = Math.floor(totalMinutes / 60);
        if (!Number.isFinite(milliseconds) || milliseconds < 0) {
            var minutes = totalMinutes % 60;
             return '—';
        }


            if (hours > 0) {
        const totalMinutes = Math.floor(milliseconds / 60000);
                return hours + 'ч ' + minutes + 'м';
        const hours = Math.floor(totalMinutes / 60);
            }
        const minutes = totalMinutes % 60;


            return minutes + 'м';
         if (hours > 0) {
         } catch (e) {
             return `${hours} ч ${minutes} мин`;
             return '?';
         }
         }
        return `${minutes} мин`;
     }
     }


     function setStatusOffline() {
     function updateRoundTime() {
         var main = document.getElementById('redstar-status-main');
         if (runLevel !== 1 || roundStart === null) {
         var details = document.getElementById('redstar-status-details');
            time.textContent = '—';
            return;
        }
 
         time.textContent = formatDuration(Date.now() - roundStart);
    }


         if (main) {
    function setOffline() {
            main.textContent = '● Оффлайн';
         root.classList.add('rs-home-status--offline');
            main.style.color = '#ff4545';
        state.textContent = 'Сервер недоступен';
         }
        map.textContent = '—';
        time.textContent = '—';
        preset.textContent = '—';
        players.textContent = '0';
         maxPlayers.textContent = '0';


         if (details) {
         roundStart = null;
            details.textContent = 'Сервер недоступен';
         runLevel = 0;
         }
     }
     }


     function setStatus(data) {
     function setOnline(data) {
         var main = document.getElementById('redstar-status-main');
         root.classList.remove('rs-home-status--offline');
         var details = document.getElementById('redstar-status-details');
 
        const currentPlayers =
            Number.isInteger(data.players)
                ? data.players
                : 0;
 
         const maximum =
            Number.isInteger(data.soft_max_players)
                ? data.soft_max_players
                : 0;
 
        runLevel =
            Number.isInteger(data.run_level)
                ? data.run_level
                : 0;


         if (!main || !details) {
        switch (runLevel) {
             return;
            case 1:
                state.textContent = 'Идёт раунд';
                break;
            case 2:
                state.textContent = 'Раунд завершён';
                break;
            default:
                state.textContent = 'Ожидание раунда';
                break;
        }
 
         if (runLevel === 0) {
             map.textContent = '—';
        } else {
            map.textContent =
                typeof data.map === 'string' && data.map.trim()
                    ? data.map.trim()
                    : '—';
         }
         }


         var players = data.players ?? '?';
         preset.textContent =
        var maxPlayers = data.soft_max_players ?? '?';
            typeof data.preset === 'string' && data.preset.trim()
        var mapName = data.map;
                ? data.preset.trim()
        var runLevel = data.run_level;
                : '—';
        var roundStartTime = data.round_start_time;


         main.textContent = '● Онлайн';
         players.textContent = String(currentPlayers);
         main.style.color = '#4ee26b';
         maxPlayers.textContent = String(maximum);


         if (runLevel === 0 || !mapName || !roundStartTime) {
         if (
             details.textContent = players + '/' + maxPlayers + ' игроков · Лобби';
            runLevel === 1 &&
             return;
            typeof data.round_start_time === 'string' &&
            data.round_start_time.length > 0
        ) {
             const parsed = Date.parse(data.round_start_time);
            roundStart = Number.isNaN(parsed) ? null : parsed;
        } else {
             roundStart = null;
         }
         }


         details.textContent = players + '/' + maxPlayers + ' игроков · ' + mapName + ' · ' + formatRoundTime(roundStartTime);
         updateRoundTime();
 
     }
     }


     function updateStatus() {
     async function updateStatus() {
         fetch('/ss14-status', { cache: 'no-store' })
         try {
            .then(function (response) {
            const response = await fetch('/server-status', {
                 if (!response.ok) {
                cache: 'no-store',
                     throw new Error('Bad response');
                 headers: {
                     Accept: 'application/json'
                 }
                 }
            });
            if (!response.ok) {
                throw new Error(`HTTP ${response.status}`);
            }


                return response.json();
            const data = await response.json();
             })
             setOnline(data);
             .then(setStatus)
        } catch (error) {
             .catch(setStatusOffline);
             console.warn('RedStar server status unavailable:', error);
             setOffline();
        }
     }
     }


     mw.hook('wikipage.content').add(function () {
     updateStatus();
        updateStatus();
 
        setInterval(updateStatus, 30000);
    window.setInterval(updateStatus, 30000);
     });
     window.setInterval(updateRoundTime, 1000);
})();
})();

Текущая версия от 16:45, 29 сентября 2026

(() => {
    const root = document.getElementById('rs-server-status');

    if (!root) {
        return;
    }
    const state = document.getElementById('rs-status-state');
    const map = document.getElementById('rs-status-map');
    const time = document.getElementById('rs-status-time');
    const preset = document.getElementById('rs-status-preset');
    const players = document.getElementById('rs-status-players');
    const maxPlayers = document.getElementById('rs-status-max');

    let roundStart = null;
    let runLevel = 0;

    function formatDuration(milliseconds) {
        if (!Number.isFinite(milliseconds) || milliseconds < 0) {
            return '—';
        }

        const totalMinutes = Math.floor(milliseconds / 60000);
        const hours = Math.floor(totalMinutes / 60);
        const minutes = totalMinutes % 60;

        if (hours > 0) {
            return `${hours} ч ${minutes} мин`;
        }

        return `${minutes} мин`;
    }

    function updateRoundTime() {
        if (runLevel !== 1 || roundStart === null) {
            time.textContent = '—';
            return;
        }

        time.textContent = formatDuration(Date.now() - roundStart);
    }

    function setOffline() {
        root.classList.add('rs-home-status--offline');
        state.textContent = 'Сервер недоступен';
        map.textContent = '—';
        time.textContent = '—';
        preset.textContent = '—';
        players.textContent = '0';
        maxPlayers.textContent = '0';

        roundStart = null;
        runLevel = 0;
    }

    function setOnline(data) {
        root.classList.remove('rs-home-status--offline');

        const currentPlayers =
            Number.isInteger(data.players)
                ? data.players
                : 0;

        const maximum =
            Number.isInteger(data.soft_max_players)
                ? data.soft_max_players
                : 0;

        runLevel =
            Number.isInteger(data.run_level)
                ? data.run_level
                : 0;

        switch (runLevel) {
            case 1:
                state.textContent = 'Идёт раунд';
                break;
            case 2:
                state.textContent = 'Раунд завершён';
                break;
            default:
                state.textContent = 'Ожидание раунда';
                break;
        }

        if (runLevel === 0) {
            map.textContent = '—';
        } else {
            map.textContent =
                typeof data.map === 'string' && data.map.trim()
                    ? data.map.trim()
                    : '—';
        }

        preset.textContent =
            typeof data.preset === 'string' && data.preset.trim()
                ? data.preset.trim()
                : '—';

        players.textContent = String(currentPlayers);
        maxPlayers.textContent = String(maximum);

        if (
            runLevel === 1 &&
            typeof data.round_start_time === 'string' &&
            data.round_start_time.length > 0
        ) {
            const parsed = Date.parse(data.round_start_time);
            roundStart = Number.isNaN(parsed) ? null : parsed;
        } else {
            roundStart = null;
        }

        updateRoundTime();

    }

    async function updateStatus() {
        try {
            const response = await fetch('/server-status', {
                cache: 'no-store',
                headers: {
                    Accept: 'application/json'
                }
            });

            if (!response.ok) {
                throw new Error(`HTTP ${response.status}`);
            }

            const data = await response.json();
            setOnline(data);
        } catch (error) {
            console.warn('RedStar server status unavailable:', error);
            setOffline();
        }
    }

    updateStatus();

    window.setInterval(updateStatus, 30000);
    window.setInterval(updateRoundTime, 1000);
})();