MediaWiki:Common.js
Материал из Lost Paradise 14
Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.
- Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
- Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
- Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
- Opera: Нажмите Ctrl+F5.
const currentURL = window.location.href; const serversStatus = [{ name: "server-main", connect: "http://ss14.lost-paradise.space/status", serverconnect: "ss14.lost-paradise.space" } function getXHRInfo(url) { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { resolve(JSON.parse(xhr.responseText)); } else { reject('Ошибка при выполнении запроса: ' + xhr.status); } }; xhr.onerror = function() { reject('Ошибка при выполнении запроса'); }; xhr.send(); }); } function updateServerInfoByConnect(connect, name) { getServerTime().then(function(currentUnixTime) { return getXHRInfo(connect).then(function(serverData) { var unixStartRound = getUnixTime(serverData.round_start_time); var timeDisplay = unixStartRound ? secondsToDHM(currentUnixTime - unixStartRound) : "–"; var currentPlayers = serverData.players; var maxPlayers = serverData.soft_max_players; // Вычисляем процент var percentage = maxPlayers > 0 ? Math.round((currentPlayers / maxPlayers) * 100) : 0; // Форматируем строку с количеством игроков var playersDisplay = currentPlayers && maxPlayers ? currentPlayers + '/' + maxPlayers : "–"; // Функция для проверки на пустые данные function checkValue(value) { return value ? value : "–"; } var serverInfo = { name: checkValue(serverData.name), round: checkValue(serverData.round_id), status: checkValue(serverData.run_level), map: checkValue(serverData.map), time: timeDisplay, players: playersDisplay, preset: checkValue(serverData.preset), percentage: percentage }; updateServerInfo(serverInfo, name); //console.log("serverInfo", serverInfo, "currentUnixTime", currentUnixTime,"unixStartRound", unixStartRound); }); }).catch(function(error) { console.error(error); }); } function getUnixTime(dateString) { return Math.floor(new Date(dateString).getTime() / 1000); // Делим на 1000, чтобы получить секунды } function secondsToDHM(seconds) { var days = Math.floor(seconds / 86400); var hours = Math.floor((seconds % 86400) / 3600); var minutes = Math.floor((seconds % 3600) / 60); var result = ""; if (days > 0) result += days + " дн, "; if (hours > 0) result += hours + " ч "; // Проверка на наличие минут if (minutes > 0) { result += minutes + " мин"; } else { result += "–"; // Символ ожидания, если минут нет } return result.trim(); } function getServerTime() { return fetch( 'https://station14.ru/api.php?action=query&meta=siteinfo&siprop=general&format=json' ).then(function(response) { return response.json(); }).then(function(data) { return getUnixTime(data.query.general.time); }); } function updateServerInfo(serverObj, serverName) { var serverStatusFrame = document.getElementById(serverName); var statusText = { 0: "Лобби", 1: "Раунд идёт", 2: "Завершение" }; serverStatusFrame.querySelector(".serverInfoRoundSet").textContent = "#" + serverObj.round; serverStatusFrame.querySelector(".serverStatusSet").textContent = statusText[ serverObj.status] || "Неизвестный статус"; serverStatusFrame.querySelector(".serverMapSet").textContent = serverObj.map; serverStatusFrame.querySelector(".serverTimeSet").textContent = serverObj.time; serverStatusFrame.querySelector(".serverPlayersSet").textContent = serverObj.players; serverStatusFrame.querySelector(".serverPresetSet").textContent = serverObj.preset; // Получаем строку подключения из serversStatus const serverData = serversStatus.find(function(server) { return server.name === serverName; }); var connectionStringElement = serverStatusFrame.querySelector( ".serverConnectSet"); if (connectionStringElement) { connectionStringElement.textContent = serverData ? serverData.serverconnect : '-'; // Устанавливаем строку подключения } // Обновляем прогресс-бар var progressBar = serverStatusFrame.querySelector(".progressBar"); // Предполагаем, что у вас есть элемент для прогресс-бара if (progressBar) { progressBar.style.width = serverObj.percentage + '%'; // Устанавливаем ширину прогресс-бара } // Обновляем отображение процента var percentageDisplay = serverStatusFrame.querySelector(".percentageDisplay"); // Элемент для отображения процента if (percentageDisplay) { percentageDisplay.textContent = serverObj.percentage + '%'; // Устанавливаем текст с процентом } } function updateAllServersInfo() { serversStatus.forEach(function(server) { updateServerInfoByConnect(server.connect, server.name); }); } function copyToClipboard(connectUrl) { const copyIcons = document.querySelectorAll('.copy-icon'); copyIcons.forEach(function(icon) { icon.addEventListener('click', function() { // Находим предыдущий элемент const previousElement = this.previousElementSibling; if (previousElement) { // Получаем текстовое содержимое const textToCopy = previousElement.textContent; const tempInput = document.createElement('input'); tempInput.value = textToCopy; document.body.appendChild(tempInput); tempInput.select(); document.execCommand('copy'); document.body.removeChild(tempInput); // Визуальный эффект this.style.opacity = '0.5'; // Сменяем прозрачность setTimeout(function() { this.style.opacity = '1'; // Возвращаем прозрачность }.bind(this), 200); // Через 1 секунду } }); }); } function customCSS(textCSS) { const styleSheet = document.createElement("style"); styleSheet.textContent = textCSS; //console.log(textCSS); document.head.appendChild(styleSheet); } function createIframe(id) { const config = IFRAME_CONFIG[id]; if (!config) return; const iframe = document.createElement('iframe'); if (config.src && config.src !== "") { iframe.src = config.src; } if (config.srcdoc && config.srcdoc !== "") { iframe.srcdoc = config.srcdoc; } if (config.width && config.width !== "") { iframe.width = config.width; } else { iframe.width = '100%'; // Значение по умолчанию } if (config.height && config.height !== "") { iframe.height = config.height; } else { iframe.height = '400px'; // Значение по умолчанию } if (config.name && config.name !== "") { iframe.name = config.name; } if (config.allow && config.allow !== "") { iframe.allow = config.allow; } if (config.referrerpolicy && config.referrerpolicy !== "") { iframe.referrerPolicy = config.referrerpolicy; } if (config.sandbox && config.sandbox !== "") { iframe.sandbox = config.sandbox; } iframe.id = config.id || ''; // id может быть пустым, если не задано return iframe; } $(document).ready(function() { var serversStatus = document.querySelectorAll('.serversStatus'); if (serversStatus.length > 0) { updateAllServersInfo(); // Перезапускать каждые 10 минут (600000 мс) setInterval(updateAllServersInfo, 600000); } var cssEls = document.querySelectorAll('.customCSS'); if (cssEls.length > 0) { for (var j = 0; j < cssEls.length; j++) { const textCSS = cssEls[j].textContent; //console.log(textCSS); customCSS(textCSS); } } const copyServerConnectionIcon = document.querySelectorAll( '.copyServerConnectionIcon'); copyServerConnectionIcon.forEach(function(icon) { icon.addEventListener('click', function() { const connectUrl = this.getAttribute('data-connect'); copyToClipboard(connectUrl); }); }); copyToClipboard(); var divs = document.querySelectorAll('.customIFrame'); if (divs) { for (var i = 0; i < divs.length; i++) { var div = divs[i]; var id = div.id; var iframe = createIframe(id); if (iframe) { div.appendChild(iframe); } } } })