MediaWiki:Common.js: различия между версиями

Материал из Space Station 14 lost-paradise
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
const currentURL = window.location.href;
const serversStatus = [{
const serversStatus = [{
name: "server-main",
name: "server-main",
connect: "http://ss14.lost-paradise.space/status",
connect: "http://station.lost-paradise.space/status",
serverconnect: "ss14.lost-paradise.space"
serverconnect: "station.lost-paradise.space"
}
}];
 


function getXHRInfo(url) {
function getXHRInfo(url) {
Строка 82: Строка 82:
function getServerTime() {
function getServerTime() {
return fetch(
return fetch(
'https://station14.ru/api.php?action=query&meta=siteinfo&siprop=general&format=json'
'https://wiki.lost-paradise.space/api.php?action=query&meta=siteinfo&siprop=general&format=json'
).then(function(response) {
).then(function(response) {
return response.json();
return response.json();
Строка 133: Строка 133:
}
}


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() {
$(document).ready(function() {
var serversStatus = document.querySelectorAll('.serversStatus');
var serversStatus = document.querySelectorAll('.serversStatus');
if (serversStatus.length > 0) {
if (serversStatus.length > 0) {
updateAllServersInfo();
updateAllServersInfo();
// Перезапускать каждые 10 минут (600000 мс)
// Перезапускать каждую минуту (60000 мс)
setInterval(updateAllServersInfo, 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);
}
}
}
}
})
});

Версия от 19:28, 3 сентября 2024

const serversStatus = [{
	name: "server-main",
	connect: "http://station.lost-paradise.space/status",
	serverconnect: "station.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://wiki.lost-paradise.space/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);
	});
}


$(document).ready(function() {
	var serversStatus = document.querySelectorAll('.serversStatus');
	if (serversStatus.length > 0) {
		updateAllServersInfo();
		// Перезапускать каждую минуту (60000 мс)
		setInterval(updateAllServersInfo, 600000);
	}

	}
});