MediaWiki:Common.js: відмінності між версіями
Перейти до навігації
Перейти до пошуку
Немає опису редагування |
Немає опису редагування Мітка: Скасовано |
||
| Рядок 69: | Рядок 69: | ||
jQuery( CustomizeModificationsOfSidebar ); | jQuery( CustomizeModificationsOfSidebar ); | ||
document.addEventListener('DOMContentLoaded', function () { | |||
const serverAddress = "bastion16.co.ua:35211"; | |||
const playerName = "xFaraday"; | |||
const onlineBlock = document.getElementById('server-online'); | |||
const offlineBlock = document.getElementById('server-offline'); | |||
const versionEl = document.getElementById('server-version'); | |||
const iconEl = document.getElementById('icon-img'); | |||
const motdEl = document.getElementById('motd'); | |||
const playersEl = document.getElementById('players-online'); | |||
const playerList = document.getElementById('player-list'); | |||
const uptimeEl = document.getElementById('server-uptime'); | |||
function applyFadeInOnce(block) { | |||
if (block.classList.contains('hidden')) { | |||
block.classList.remove('hidden'); | |||
block.classList.add('fade-in'); | |||
block.addEventListener('animationend', () => { | |||
block.classList.remove('fade-in'); | |||
}, { once: true }); | |||
} | |||
} | |||
function parseMinecraftColors(text) { | |||
const colors = { | |||
'0': '#000000', '1': '#0000AA', '2': '#00AA00', '3': '#00AAAA', | |||
'4': '#AA0000', '5': '#AA00AA', '6': '#FFAA00', '7': '#AAAAAA', | |||
'8': '#555555', '9': '#5555FF', 'a': '#55FF55', 'b': '#55FFFF', | |||
'c': '#FF5555', 'd': '#FF55FF', 'e': '#FFFF55', 'f': '#FFFFFF', | |||
}; | |||
const formats = { 'l': 'b', 'n': 'u', 'm': 's', 'o': 'i' }; | |||
let result = '', openTags = []; | |||
text = (text || '').replace(/&/g, '§'); | |||
for (let i = 0; i < text.length; i++) { | |||
if (text[i] === '§') { | |||
const code = text[i + 1]?.toLowerCase(); | |||
i++; | |||
if (code === 'r') { | |||
while (openTags.length) result += `</${openTags.pop()}>`; | |||
} else if (colors[code]) { | |||
while (openTags.length && openTags[openTags.length - 1] === 'span') { | |||
result += `</${openTags.pop()}>`; | |||
} | |||
result += `<span style="color:${colors[code]}">`; | |||
openTags.push('span'); | |||
} else if (formats[code]) { | |||
const tag = formats[code]; | |||
result += `<${tag}>`; | |||
openTags.push(tag); | |||
} | |||
} else { | |||
result += text[i]; | |||
} | |||
} | |||
while (openTags.length) result += `</${openTags.pop()}>`; | |||
return result; | |||
} | |||
async function updateStatus() { | |||
try { | |||
const response = await fetch(`http://192.168.10.113:8888/placeholders?player=${encodeURIComponent(playerName)}`); | |||
const data = await response.json(); | |||
const isOnline = data["%pinger_online_bastion16.co.ua:35211%"]?.toLowerCase().includes("online"); | |||
if (!isOnline) return showOfflineUI(); | |||
offlineBlock.classList.add('hidden'); | |||
applyFadeInOnce(onlineBlock); | |||
fetch(`https://api.mcstatus.io/v2/status/java/${serverAddress}`) | |||
.then(res => res.json()) | |||
.then(msData => { | |||
if (iconEl && msData.icon) { | |||
iconEl.src = msData.icon; | |||
} | |||
}); | |||
versionEl.textContent = data["%pinger_version_bastion16.co.ua:35211%"] || ''; | |||
motdEl.innerHTML = parseMinecraftColors(data["%pinger_motd_bastion16.co.ua:35211%"]); | |||
uptimeEl.textContent = data["%server_uptime%"] || '—'; | |||
const online = data["%pinger_players_bastion16.co.ua:35211%"] || '0'; | |||
const max = data["%pinger_max_bastion16.co.ua:35211%"] || '0'; | |||
playersEl.textContent = `${online} / ${max}`; | |||
const playersRaw = data["%playerlist_players_list%"]; | |||
const players = playersRaw ? playersRaw.split(',').map(p => p.trim()) : []; | |||
playerList.innerHTML = ''; | |||
if (players.length > 0) { | |||
for (const name of players) { | |||
const li = document.createElement('li'); | |||
li.innerHTML = `<img src="https://mc-heads.net/avatar/${name}/24" style="width:24px;height:24px;border-radius:4px;vertical-align:middle;margin-right:8px;" /> <span>${name}</span>`; | |||
playerList.appendChild(li); | |||
} | |||
} else { | |||
const li = document.createElement('li'); | |||
li.textContent = '— немає гравців —'; | |||
li.style.color = '#777'; | |||
playerList.appendChild(li); | |||
} | |||
} catch (e) { | |||
console.error('Помилка отримання статусу сервера:', e); | |||
showOfflineUI(); | |||
} | |||
} | |||
function showOfflineUI() { | |||
onlineBlock.classList.add('hidden'); | |||
applyFadeInOnce(offlineBlock); | |||
} | |||
updateStatus(); | |||
setInterval(updateStatus, 10000); | |||
}); | |||
Версія за 13:05, 5 червня 2025
/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */
function ModifySidebar( action, section, name, link ) {
try {
switch ( section ) {
case 'languages':
var target = 'p-lang';
break;
case 'toolbox':
var target = 'p-tb';
break;
case 'navigation':
var target = 'p-navigation';
break;
default:
var target = 'p-' + section;
break;
}
if ( action == 'add' ) {
var node = document.getElementById( target )
.getElementsByTagName( 'div' )[0]
.getElementsByTagName( 'ul' )[0];
var aNode = document.createElement( 'a' );
var liNode = document.createElement( 'li' );
aNode.appendChild( document.createTextNode( name ) );
aNode.setAttribute( 'href', link );
liNode.appendChild( aNode );
liNode.className = 'plainlinks';
node.appendChild( liNode );
}
if ( action == 'remove' ) {
var list = document.getElementById( target )
.getElementsByTagName( 'div' )[0]
.getElementsByTagName( 'ul' )[0];
var listelements = list.getElementsByTagName( 'li' );
for ( var i = 0; i < listelements.length; i++ ) {
if (
listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name ||
listelements[i].getElementsByTagName( 'a' )[0].href == link
)
{
list.removeChild( listelements[i] );
}
}
}
} catch( e ) {
// let's just ignore what's happened
return;
}
}
function CustomizeModificationsOfSidebar() {
// adds [[Special:CategoryTree|Special:CategoryTree]] to toolbox
ModifySidebar( 'add', 'toolbox', 'Нові статті', 'https://wiki.bastion16.co.ua/index.php?title=%D0%A1%D0%BF%D0%B5%D1%86%D1%96%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0:%D0%9D%D0%BE%D0%B2%D1%96_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B8' );
ModifySidebar( 'add', 'toolbox', 'Налаштування Sidebar', 'https://wiki.bastion16.co.ua/index.php?title=MediaWiki:Sidebar' );
ModifySidebar( 'add', 'toolbox', 'Common.js', 'https://wiki.bastion16.co.ua/index.php?title=MediaWiki:Common.js' );
ModifySidebar( 'add', 'toolbox', 'Group-user.css', 'https://wiki.bastion16.co.ua/index.php?title=MediaWiki:Group-user.css' );
ModifySidebar( 'add', 'toolbox', 'Common.css', 'https://wiki.bastion16.co.ua/index.php?title=MediaWiki:Common.css' );
ModifySidebar( 'add', 'toolbox', 'Нові редагування', 'https://wiki.bastion16.co.ua/index.php?hidebots=1&limit=50&days=7&enhanced=1&title=%D0%A1%D0%BF%D0%B5%D1%86%D1%96%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0:%D0%9D%D0%BE%D0%B2%D1%96_%D1%80%D0%B5%D0%B4%D0%B0%D0%B3%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F&urlversion=2' );
}
jQuery( CustomizeModificationsOfSidebar );
document.addEventListener('DOMContentLoaded', function () {
const serverAddress = "bastion16.co.ua:35211";
const playerName = "xFaraday";
const onlineBlock = document.getElementById('server-online');
const offlineBlock = document.getElementById('server-offline');
const versionEl = document.getElementById('server-version');
const iconEl = document.getElementById('icon-img');
const motdEl = document.getElementById('motd');
const playersEl = document.getElementById('players-online');
const playerList = document.getElementById('player-list');
const uptimeEl = document.getElementById('server-uptime');
function applyFadeInOnce(block) {
if (block.classList.contains('hidden')) {
block.classList.remove('hidden');
block.classList.add('fade-in');
block.addEventListener('animationend', () => {
block.classList.remove('fade-in');
}, { once: true });
}
}
function parseMinecraftColors(text) {
const colors = {
'0': '#000000', '1': '#0000AA', '2': '#00AA00', '3': '#00AAAA',
'4': '#AA0000', '5': '#AA00AA', '6': '#FFAA00', '7': '#AAAAAA',
'8': '#555555', '9': '#5555FF', 'a': '#55FF55', 'b': '#55FFFF',
'c': '#FF5555', 'd': '#FF55FF', 'e': '#FFFF55', 'f': '#FFFFFF',
};
const formats = { 'l': 'b', 'n': 'u', 'm': 's', 'o': 'i' };
let result = '', openTags = [];
text = (text || '').replace(/&/g, '§');
for (let i = 0; i < text.length; i++) {
if (text[i] === '§') {
const code = text[i + 1]?.toLowerCase();
i++;
if (code === 'r') {
while (openTags.length) result += `</${openTags.pop()}>`;
} else if (colors[code]) {
while (openTags.length && openTags[openTags.length - 1] === 'span') {
result += `</${openTags.pop()}>`;
}
result += `<span style="color:${colors[code]}">`;
openTags.push('span');
} else if (formats[code]) {
const tag = formats[code];
result += `<${tag}>`;
openTags.push(tag);
}
} else {
result += text[i];
}
}
while (openTags.length) result += `</${openTags.pop()}>`;
return result;
}
async function updateStatus() {
try {
const response = await fetch(`http://192.168.10.113:8888/placeholders?player=${encodeURIComponent(playerName)}`);
const data = await response.json();
const isOnline = data["%pinger_online_bastion16.co.ua:35211%"]?.toLowerCase().includes("online");
if (!isOnline) return showOfflineUI();
offlineBlock.classList.add('hidden');
applyFadeInOnce(onlineBlock);
fetch(`https://api.mcstatus.io/v2/status/java/${serverAddress}`)
.then(res => res.json())
.then(msData => {
if (iconEl && msData.icon) {
iconEl.src = msData.icon;
}
});
versionEl.textContent = data["%pinger_version_bastion16.co.ua:35211%"] || '';
motdEl.innerHTML = parseMinecraftColors(data["%pinger_motd_bastion16.co.ua:35211%"]);
uptimeEl.textContent = data["%server_uptime%"] || '—';
const online = data["%pinger_players_bastion16.co.ua:35211%"] || '0';
const max = data["%pinger_max_bastion16.co.ua:35211%"] || '0';
playersEl.textContent = `${online} / ${max}`;
const playersRaw = data["%playerlist_players_list%"];
const players = playersRaw ? playersRaw.split(',').map(p => p.trim()) : [];
playerList.innerHTML = '';
if (players.length > 0) {
for (const name of players) {
const li = document.createElement('li');
li.innerHTML = `<img src="https://mc-heads.net/avatar/${name}/24" style="width:24px;height:24px;border-radius:4px;vertical-align:middle;margin-right:8px;" /> <span>${name}</span>`;
playerList.appendChild(li);
}
} else {
const li = document.createElement('li');
li.textContent = '— немає гравців —';
li.style.color = '#777';
playerList.appendChild(li);
}
} catch (e) {
console.error('Помилка отримання статусу сервера:', e);
showOfflineUI();
}
}
function showOfflineUI() {
onlineBlock.classList.add('hidden');
applyFadeInOnce(offlineBlock);
}
updateStatus();
setInterval(updateStatus, 10000);
});