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

Обновление live-статуса сервера
Статус игрового сервера
Строка 9: Строка 9:
     const state = document.getElementById('rs-status-state');
     const state = document.getElementById('rs-status-state');
     const map = document.getElementById('rs-status-map');
     const map = document.getElementById('rs-status-map');
    const time = document.getElementById('rs-status-time');
     const preset = document.getElementById('rs-status-preset');
     const preset = document.getElementById('rs-status-preset');
     const players = document.getElementById('rs-status-players');
     const players = document.getElementById('rs-status-players');
Строка 14: Строка 15:
     const fill = document.getElementById('rs-status-fill');
     const fill = document.getElementById('rs-status-fill');


     function setOffline() {
     function offline() {
         root.classList.add('rs-home-status--offline');
         root.classList.add('rs-home-status--offline');


Строка 20: Строка 21:
         state.textContent = 'Сервер недоступен';
         state.textContent = 'Сервер недоступен';
         map.textContent = '—';
         map.textContent = '—';
        time.textContent = '—';
         preset.textContent = '—';
         preset.textContent = '—';
         players.textContent = '0';
         players.textContent = '0';
Строка 26: Строка 28:
     }
     }


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


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


         online.textContent = 'Онлайн';
         online.textContent = 'Онлайн';


         if (data.run_level === 2) {
         state.textContent =
            state.textContent = 'Идёт раунд';
            data.run_level === 2
        } else {
                ? 'Идёт раунд'
            state.textContent = 'Ожидание раунда';
                : 'Ожидание раунда';
        }


         map.textContent =
         map.textContent =
Строка 44: Строка 50:
                 ? data.map.trim()
                 ? data.map.trim()
                 : '—';
                 : '—';
        time.textContent = '—';


         preset.textContent =
         preset.textContent =
Строка 51: Строка 59:


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


         const percent = max > 0
         const percent =
            ? Math.min(100, Math.max(0, currentPlayers / max * 100))
            maximum > 0
            : 0;
                ? Math.min(100, Math.max(0, currentPlayers / maximum * 100))
                : 0;


         fill.style.width = percent.toFixed(0) + '%';
         fill.style.width = percent.toFixed(0) + '%';
Строка 65: Строка 74:
                 cache: 'no-store',
                 cache: 'no-store',
                 headers: {
                 headers: {
                     'Accept': 'application/json'
                     Accept: 'application/json'
                 }
                 }
             });
             });
Строка 73: Строка 82:
             }
             }


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

Версия от 14:38, 29 сентября 2026

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

    if (!root) {
        return;
    }

    const online = document.getElementById('rs-status-online');
    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');
    const fill = document.getElementById('rs-status-fill');

    function offline() {
        root.classList.add('rs-home-status--offline');

        online.textContent = 'Оффлайн';
        state.textContent = 'Сервер недоступен';
        map.textContent = '—';
        time.textContent = '—';
        preset.textContent = '—';
        players.textContent = '0';
        maxPlayers.textContent = '0';
        fill.style.width = '0%';
    }

    function onlineState(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;

        online.textContent = 'Онлайн';

        state.textContent =
            data.run_level === 2
                ? 'Идёт раунд'
                : 'Ожидание раунда';

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

        time.textContent = '—';

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

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

        const percent =
            maximum > 0
                ? Math.min(100, Math.max(0, currentPlayers / maximum * 100))
                : 0;

        fill.style.width = percent.toFixed(0) + '%';
    }

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

            if (!response.ok) {
                throw new Error('HTTP ' + response.status);
            }

            onlineState(await response.json());
        } catch (error) {
            console.warn('RedStar server status unavailable:', error);
            offline();
        }
    }

    update();
    window.setInterval(update, 30000);
})();