MediaWiki:Common.js: відмінності між версіями

Матеріал з Бастіон-16
Перейти до навігації Перейти до пошуку
Немає опису редагування
Мітка: Скасовано
Немає опису редагування
Мітка: Ручний відкіт
 
Рядок 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:06, 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 );