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 | 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 | 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 | Number.isInteger(data.players) ? data.players : 0; | ||
const maximum = | |||
Number.isInteger(data.soft_max_players) | |||
? data.soft_max_players | |||
: 0; | |||
online.textContent = 'Онлайн'; | online.textContent = 'Онлайн'; | ||
state.textContent = | |||
data.run_level === 2 | |||
? 'Идёт раунд' | |||
: 'Ожидание раунда'; | |||
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( | maxPlayers.textContent = String(maximum); | ||
const percent = | const percent = | ||
maximum > 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' | |||
} | } | ||
}); | }); | ||
| Строка 73: | Строка 82: | ||
} | } | ||
onlineState(await response.json()); | |||
} catch (error) { | } catch (error) { | ||
console.warn('RedStar server status unavailable:', error); | console.warn('RedStar server status unavailable:', error); | ||
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);
})();