MediaWiki:Common.js: Difference between revisions
MediaWiki interface page
More actions
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 = '/ | 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 - | 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, | 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();
}
}());