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

Материал из Vanilla Station
Перейти к: навигация, поиск
мНет описания правки
мНет описания правки
 
(не показано 6 промежуточных версий этой же участницы)
Строка 1: Строка 1:
const currentURL = window.location.href;
const currentURL = window.location.href;
const serversStatus = [{
name: "server-vanilla",
connect: "https://api.codetabs.com/v1/proxy/?quest=http://147.45.108.112:1212/status",
serverconnect: "147.45.108.112:1212"
}];


const serversStatus = [
function getXHRInfo(url) {
  {
return new Promise(function(resolve, reject) {
    name: "vanilla",
var xhr = new XMLHttpRequest();
    connect: "https://thingproxy.freeboard.io/fetch/http://147.45.108.112:1212/status"
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://vanilla-station.ru/w/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 getServersInfo(connect, callback) {
function updateServerInfo(serverObj, serverName) {
  const xhr = new XMLHttpRequest();
var serverStatusFrame = document.getElementById(serverName);
  xhr.open('GET', connect, true);
var statusText = {
  xhr.onload = function() {
0: "Лобби",
    if (xhr.status >= 200 && xhr.status < 300) {
1: "Раунд идёт",
      const data = JSON.parse(xhr.responseText);
2: "Завершение"
      callback(null, data);
};
    } else {
serverStatusFrame.querySelector(".serverInfoRoundSet").textContent = "#" +
      callback('Ошибка при выполнении запроса: ' + xhr.status, null);
serverObj.round;
    }
serverStatusFrame.querySelector(".serverStatusSet").textContent = statusText[
  };
serverObj.status] || "Неизвестный статус";
  xhr.onerror = function() {
serverStatusFrame.querySelector(".serverMapSet").textContent = serverObj.map;
    callback('Ошибка при выполнении запроса', null);
serverStatusFrame.querySelector(".serverTimeSet").textContent = serverObj.time;
  };
serverStatusFrame.querySelector(".serverPlayersSet").textContent = serverObj.players;
  xhr.send();
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 shangeServersInfo(serverObj, serverName) {
function updateAllServersInfo() {
console.log(serverObj, serverName);
serversStatus.forEach(function(server) {
updateServerInfoByConnect(server.connect, server.name);
if (currentURL.includes("Kerisar")) {
});
      const serverStatusFrame = document.getElementById(serverName);
     
      serverStatusFrame.querySelector(".serverInfoRoundSet").textContent = "#" + serverObj.round;
      if (serverObj.status === 0) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Лобби";
      }
      if (serverObj.status === 1) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Раунд идёт";
      }
      if (serverObj.status === 2) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Завершение";
      }
      serverStatusFrame.querySelector(".serverMapSet").textContent = serverObj.map;
      serverStatusFrame.querySelector(".serverTimeSet").textContent = serverObj.time;
      serverStatusFrame.querySelector(".serverPlayersSet").textContent = serverObj.players;
      serverStatusFrame.querySelector(".serverPresetSet").textContent = serverObj.preset;
    }
}
}


function standartServersInfo(connect, name) {
function copyToClipboard(connectUrl) {
getServersInfo(connect, function(error, data) {
const copyIcons = document.querySelectorAll('.copy-icon');
    if (error) {
copyIcons.forEach(function(icon) {
      console.error(error); // Обработка ошибок
icon.addEventListener('click', function() {
    } else {
// Находим предыдущий элемент
      const serverInfo = {
const previousElement = this.previousElementSibling;
      name: data.name,
if (previousElement) {
        round: data.round_id,
// Получаем текстовое содержимое
        status: data.run_level,
const textToCopy = previousElement.textContent;
        map: data.map,
const tempInput = document.createElement('input');
        time: new Date(data.round_start_time).toLocaleString(),
tempInput.value = textToCopy;
        players: data.players,
document.body.appendChild(tempInput);
        preset: data.preset
tempInput.select();
      };
document.execCommand('copy');
      shangeServersInfo(serverInfo, name);
document.body.removeChild(tempInput);
    }
// Визуальный эффект
  });
this.style.opacity = '0.5'; // Сменяем прозрачность
setTimeout(function() {
this.style.opacity = '1'; // Возвращаем прозрачность
}.bind(this), 200); // Через 1 секунду
}
});
});
}
}




function standartServersInfoAll() {
$(document).ready(function() {
for (var i = 0; i < serversStatus.length; i++) {
var serversStatus = document.querySelectorAll('.serversStatus');
standartServersInfo(serversStatus[i].connect, serversStatus[i].name);
if (serversStatus.length > 0) {
updateAllServersInfo();
// Перезапускать каждую минуту (60000 мс)
setInterval(updateAllServersInfo, 60000);
}
}
const copyServerConnectionIcon = document.querySelectorAll(
'.copyServerConnectionIcon');
copyServerConnectionIcon.forEach(function(icon) {
icon.addEventListener('click', function() {
const connectUrl = this.getAttribute('data-connect');
copyToClipboard(connectUrl);
});
});
copyToClipboard();
});
/*WikiEditor/Викификатор*/
if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
mw.loader.load(
'//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript'
);
}
var customizeToolbar = function() {
$('#wpTextbox1').wikiEditor('addToToolbar', {
'section': 'advanced',
'group': 'format',
'tools': {
'wikify': {
label: 'Викификатор',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
action: {
type: 'callback',
execute: function(context) {
Wikify();
}
}
}
}
});
};
if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
mw.loader.using('user.options', function() {
if (mw.user.options.get('usebetatoolbar')) {
mw.loader.using('ext.wikiEditor.toolbar', function() {
$(document).ready(customizeToolbar);
});
}
});
}
}

Текущая версия от 17:30, 15 августа 2024

const currentURL = window.location.href;
const serversStatus = [{
	name: "server-vanilla",
	connect: "https://api.codetabs.com/v1/proxy/?quest=http://147.45.108.112:1212/status",
	serverconnect: "147.45.108.112:1212"
}];

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://vanilla-station.ru/w/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 секунду
			}
		});
	});
}


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

	const copyServerConnectionIcon = document.querySelectorAll(
		'.copyServerConnectionIcon');
	copyServerConnectionIcon.forEach(function(icon) {
		icon.addEventListener('click', function() {
			const connectUrl = this.getAttribute('data-connect');
			copyToClipboard(connectUrl);
		});
	});
	copyToClipboard();
});
/*WikiEditor/Викификатор*/
if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
	mw.loader.load(
		'//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript'
	);
}
var customizeToolbar = function() {
	$('#wpTextbox1').wikiEditor('addToToolbar', {
		'section': 'advanced',
		'group': 'format',
		'tools': {
			'wikify': {
				label: 'Викификатор',
				type: 'button',
				icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
				action: {
					type: 'callback',
					execute: function(context) {
						Wikify();
					}
				}
			}
		}
	});
};
if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
	mw.loader.using('user.options', function() {
		if (mw.user.options.get('usebetatoolbar')) {
			mw.loader.using('ext.wikiEditor.toolbar', function() {
				$(document).ready(customizeToolbar);
			});
		}
	});
}