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

Материал из Space Station 14 Вики
мНет описания правки
мНет описания правки
Строка 89: Строка 89:
}
}


function secondsToHMS(seconds) {
function secondsToDHM(seconds) {
   const hours = Math.floor(seconds / 3600);
  const days = Math.floor(seconds / 86400); // 86400 секунд в дне
   const hours = Math.floor((seconds % 86400) / 3600);
   const minutes = Math.floor((seconds % 3600) / 60);
   const minutes = Math.floor((seconds % 3600) / 60);
  const remainingSeconds = seconds % 60;


   return (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (remainingSeconds < 10 ? "0" + remainingSeconds : remainingSeconds);
   let result = "";
 
  if (days > 0) {
    result += days + " дней, ";
  }
  result += hours + " часа " + minutes + " минуты";
  return result.trim(); // Удаляем лишние пробелы
}
}


Строка 131: Строка 137:
}
}


function formatTimeDifference(timeDifference) {
const seconds = Math.floor(timeDifference / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
const days = Math.floor(hours / 24);
var formattedTime = "";
if (days > 0) {
formattedTime += days + "дн. ";
}
if (hours % 24 > 0) {
formattedTime += (hours % 24) + "ч. ";
}
if (minutes % 60 > 0) {
formattedTime += (minutes % 60) + "мин. ";
}
if (seconds % 60 > 0) {
formattedTime += (seconds % 60) + "сек.";
}
return formattedTime;
}


function standartServersInfoAll() {
function standartServersInfoAll() {
Строка 188: Строка 174:
$(document).ready(function() {
$(document).ready(function() {
if (currentURL.includes("Kerisar")) {
if (currentURL.includes("Kerisar")) {
kerisarTest();
standartServersInfoAll();
standartServersInfoAll();
}
}

Версия от 10:30, 15 августа 2024

const currentURL = window.location.href;
const serversStatus = [{
	name: "main",
	connect: "https://game2.station14.ru/main/server/status"
}, {
	name: "nova",
	connect: "https://game2.station14.ru/nova/server/status"
}, {
	name: "athara",
	connect: "https://game2.station14.ru/athara/server/status"
}, {
	name: "solaris",
	connect: "https://game2.station14.ru/solaris/server/status"
}, {
	name: "echo",
	connect: "https://game2.station14.ru/echo/server/status"
}, {
	name: "elysium",
	connect: "https://game2.station14.ru/elysium/server/status"
}, {
	name: "nebula",
	connect: "https://game2.station14.ru/nebula/server/status"
}, {
	name: "wl",
	connect: "https://game2.station14.ru/wl/server/status"
}, {
	name: "frontier",
	connect: "https://api.codetabs.com/v1/proxy/?quest=https://arles.station14.ru/frontier-main/server/status"
}, {
	name: "fallout",
	connect: "https://api.codetabs.com/v1/proxy/?quest=http://188.92.78.98:1221/status"
}, {
	name: "marines",
	connect: "https://game1.station14.ru/marines-main/server/status"
}, {
	name: "stalker",
	connect: "https://api.codetabs.com/v1/proxy/?quest=https://game.stalkers14.xyz/status"
}];

function kerisarTest() {
	
}

function getXHRInfo(connect, callback) {
	const xhr = new XMLHttpRequest();
	xhr.open('GET', connect, true);
	xhr.onload = function() {
		if (xhr.status >= 200 && xhr.status < 300) {
			const date = JSON.parse(xhr.responseText);
			callback(null, date);
		} else {
			callback('Ошибка при выполнении запроса: ' + xhr.status, null);
		}
	};
	xhr.onerror = function() {
		callback('Ошибка при выполнении запроса', null);
	};
	xhr.send();
}

function shangeServersInfo(serverObj, serverName) {
	console.log(serverObj, serverName);
	if (currentURL.includes("Kerisar")) {
		const serverStatusFrame = document.getElementById(serverName);
		//console.log("serverStatusFrame", serverStatusFrame);
		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 getUnixTime(dateString) {
	const date = new Date(dateString);
	return Math.floor(date.getTime() / 1000); // Делим на 1000, чтобы получить секунды
}

function secondsToDHM(seconds) {
  const days = Math.floor(seconds / 86400); // 86400 секунд в дне
  const hours = Math.floor((seconds % 86400) / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);

  let result = "";

  if (days > 0) {
    result += days + " дней, ";
  }
  result += hours + " часа " + minutes + " минуты";
  return result.trim(); // Удаляем лишние пробелы
}

function standartServersInfo(connect, name) {
	var currentUnixTime;
	getXHRInfo("https://worldtimeapi.org/api/timezone/Europe/Moscow", function(
		error, date) {
		if (error) {
			console.error(error); // Обработка ошибок
		} else {
			currentUnixTime = date.unixtime;
			console.log("currentTime", currentUnixTime);
			// Получаем информацию о сервере
			getXHRInfo(connect, function(error, date) {
				if (error) {
					console.error(error);
				} else {
					const unixStartRound = getUnixTime(date.round_start_time);
					
					const serverInfo = {
						name: date.name,
						round: date.round_id,
						status: date.run_level,
						map: date.map,
						// Вычисляем разницу
						time: secondsToHMS(currentUnixTime - unixStartRound),
						players: date.players,
						preset: date.preset
					};
					shangeServersInfo(serverInfo, name);
					console.log("serverInfo", serverInfo, "currentUnixTime", currentUnixTime, "unixStartRound", unixStartRound);
				}
			});
		}
	});
}


function standartServersInfoAll() {
	for (var i = 0; i < serversStatus.length; i++) {
		standartServersInfo(serversStatus[i].connect, serversStatus[i].name);
	}
}

function customCSS(textCSS) {
	const styleSheet = document.createElement("style");
	styleSheet.textContent = textCSS;
	//console.log(textCSS);
	document.head.appendChild(styleSheet);
}

function needBootstrap() {
	const elements = document.querySelectorAll('.turnBootstrap');
	if (elements.length > 0) {
		const link = document.createElement('link');
		link.href =
			"https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css";
		link.rel = "stylesheet";
		link.integrity =
			"sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC";
		link.crossOrigin = "anonymous";
		const script = document.createElement('script');
		script.src =
			"https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js";
		script.integrity =
			"sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM";
		script.crossOrigin = "anonymous";
		document.head.appendChild(link);
		document.head.appendChild(script);
	}
}
window.onload = needBootstrap;
$(document).ready(function() {
	if (currentURL.includes("Kerisar")) {
		standartServersInfoAll();
	}
	var cssEls = document.querySelectorAll('.customCSS');
	if (cssEls.length > 0) {
		for (var i = 0; i < cssEls.length; i++) {
			const textCSS = cssEls[i].textContent;
			console.log(textCSS);
			customCSS(textCSS);
		}
	}
	var needBootstrap = document.querySelectorAll('.needBootstrap');
	if (needBootstrap.length > 0) {
		console.log("needBootstrap() start");
	}
});
/*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);
			});
		}
	});
}
/**
 * Taken from https://wiki.ss220.space/index.php?title=MediaWiki:Common.js&oldid=35626
 */
/* Variables for interface text used throughout the script, for ease of translating */
var i18n = {
	// Collapsible elements and page loader
	hideText: 'скрыть',
	showText: 'показать',
	// Page loader
	loadErrorTitle: 'Возникла ошибка при загрузке содержимого'
};
var mcw = window.mcw = {};
/* Keep track of delegated events on dynamic content */
mcw.events = {};
/* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */
mw.hook('wikipage.content').add(function($wikipageContent) {
	/**
	 * Page loader
	 *
	 * Allows a page to be downloaded and displayed on demand.
	 * Use with Template:LoadPage and Template:LoadBox
	 */
	(function() {
		var $loadPage = $wikipageContent.find('.load-page');
		if (!$loadPage.length) {
			return;
		}
		// We need the spinner to show loading is happening, but we don't want
		// to have a delay while the module downloads, so we'll load this now,
		// regardless of if something is clicked
		mw.loader.load('jquery.spinner');
		// Create button starting with hide text
		// Will be changed to the show text while calculating the maximum button size
		var $buttonTemplate = $('<span>').addClass(
			'mw-editsection-like load-page-button').append('[ ', $('<span>').addClass(
			'jslink').text(i18n.hideText), ' ]');
		var extractList = function($contentContainer, listClass) {
			var $content = $contentContainer.find('.mw-parser-output > ul > li > ul')
				.children(':not(.nbttree-inherited)');
			if (listClass) {
				$content.addClass(listClass);
			}
			return $content;
		};
		$loadPage.each(function() {
			var $body = $(this);
			var page = $body.data('page');
			if (!page) {
				return;
			}
			var template = $body.data('template');
			var treeview = $body.data('treeview');
			var treeviewClass = $body.data('treeviewclass');
			var $heading;
			var $contentContainer;
			var $content;
			var $button = $buttonTemplate.clone();
			var $buttonLink = $button.find('.jslink');
			if (treeview) {
				$heading = $body;
				$contentContainer = $('<div>');
			} else {
				$heading = $body.children().first();
				$contentContainer = $body.find('.load-page-content');
			}
			// Add the button
			$heading.append($button);
			// Move the edit button to the right spot
			$contentContainer.find('.mw-editsection, .mw-editsection-like').insertAfter(
				$button);
			// Find max button width, and set its min-width to it
			var hideWidth = $button.width();
			$buttonLink.text(i18n.showText);
			var showWidth = $button.width();
			if (hideWidth !== showWidth) {
				$button.css('min-width', hideWidth > showWidth ? hideWidth : showWidth);
			}
			$buttonLink.click(function() {
				if ($body.hasClass('pageloader-contentloaded')) {
					if ($buttonLink.text() === i18n.showText) {
						if (treeview) {
							$content.insertAfter($body);
						} else {
							$contentContainer.show();
						}
						$buttonLink.text(i18n.hideText);
					} else {
						if (treeview) {
							$content.detach();
						} else {
							$contentContainer.hide();
						}
						$buttonLink.text(i18n.showText);
					}
					return;
				}
				// See if this was loaded elsewhere before making a request
				var gotContent;
				$('.pageloader-contentloaded').each(function() {
					var $fLoader = $(this);
					if ($fLoader.data('page') === page && $fLoader.data(
							'pageloader-content')) {
						$contentContainer.html($fLoader.data('pageloader-content')).removeClass(
							'noscript');
						mw.hook('wikipage.content').fire($contentContainer);
						if (treeview) {
							$body.find('.noscript').remove();
							$content = extractList($contentContainer, treeviewClass);
							$content.insertAfter($body);
						}
						$buttonLink.text(i18n.hideText);
						$body.addClass('pageloader-contentloaded');
						gotContent = true;
						return false;
					}
				});
				if (gotContent) {
					return;
				}
				// Just in-case the spinner module is still not ready yet
				var $spinner = $();
				mw.loader.using('jquery.spinner', function() {
					// $spinner will be false if the content somehow loaded before the module did
					if ($spinner) {
						$spinner = $.createSpinner().addClass('mw-editsection-like').css(
							'min-width', $button.css('min-width'));
						$button.hide().after($spinner);
					}
				});
				var requestData = {
					action: 'parse',
					prop: 'text'
				};
				if (template) {
					requestData.page = page;
				} else {
					requestData.title = mw.config.get('wgPageName');
					requestData.text = '{' + '{:' + page + '}}';
				}
				new mw.Api().get(requestData).done(function(data) {
					var html = data.parse.text['*'];
					$contentContainer.html(html).removeClass('noscript');
					// Resolve self-links
					if (template) {
						var curPage = '/' + mw.config.get('wgPageName');
						$contentContainer.find('a').each(function() {
							var $link = $(this);
							if ($link.attr('href') === curPage) {
								$link.replaceWith($('<strong>').addClass('selflink').append(
									$link.contents()));
							}
						});
						html = $contentContainer.html();
					}
					$body.data('pageloader-content', html);
					// Fire content hook on the new content, running all this stuff again and more :)
					mw.hook('wikipage.content').fire($contentContainer);
					if (treeview) {
						$body.find('.noscript').remove();
						$content = extractList($contentContainer, treeviewClass);
						$content.insertAfter($body);
					}
					$spinner.remove();
					$spinner = false;
					$buttonLink.text(i18n.hideText);
					$button.show();
					$body.addClass('pageloader-contentloaded');
				}).fail(function(_, error) {
					$spinner.remove();
					$spinner = false;
					$button.show();
					var errorText = '';
					if (error.textStatus) {
						errorText = error.textStatus;
					} else if (error.error) {
						errorText = error.error.info;
					}
					mw.notify(errorText, {
						title: i18n.loadErrorTitle,
						autoHide: false
					});
				});
			});
		});
	}());
	/**
	 * Element animator
	 *
	 * Will cycle the active class on any child elements
	 * within an element with the animated class.
	 */
	(function() {
		if (!mcw.animate) {
			mcw.animate = setInterval(function() {
				$('.animated').each(function() {
					var $elem = $(this);
					var $current = $elem.children('.active');
					var $next = $current.nextAll(':not(.skip):first');
					// Loop back to the start
					if (!$next.length) {
						$next = $elem.children(':not(.skip):first');
					}
					$current.removeClass('active');
					$next.addClass('active');
				});
			}, 2000);
		}
	}());
});
// SS220 import end