Warning.png

Поддержка Wiki прекращена, она доступна в режиме архива. Информация в ней устарела и может быть неактуальной.

Участник:Popstop/common.js

Материал из Hilarious Wiki
< Участник:Popstop
Версия от 20:17, 25 августа 2018; Popstop (обсуждение | вклад) (Тест)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Замечание. Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl-F5
  • Opera: Выберите очистку кэша в меню Инструменты → Настройки
mw.loader.using(['mediawiki.api']).then(function() {
	"use strict";

	var api = new mw.Api();
	var element = null;

	var ratelimit = null;
	var request = null;
	var count = 0;

	function status(message) {
		message = message === undefined ? "Очищено: " + count : message;
		if (element)
			element.text(message);
	}

	function error(message) {
		status("Ошибка.");
		message = message === undefined ? "unknown error" : message;
		console.log("purge.js: " + message);
	}

	function calcGCD(x, y) {
		if (x < y) {
			var tmp = x;
			x = y;
			y = tmp;
		}
		while (true) {
			if (y === 0)
				return x;
			x %= y;
			if (x === 0)
				return y;
			y %= x;
		}
	}

	function updateRatelimit(callback) {
		if (typeof purgejs_ratelimit !== "undefined") {
			ratelimit = purgejs_ratelimit;
			if (callback)
				callback();
			return;
		}

		api.get({
			meta: 'userinfo',
			uiprop: 'rights|ratelimits'
		}).done(function(data) {
			if (data && data.query && data.query.userinfo) {
				var ratelimits = data.query.userinfo.ratelimits;
				var rights = data.query.userinfo.rights;
				if (ratelimits && ratelimits.purge) {
					if (ratelimits.purge.user) {
						ratelimit = ratelimits.purge.user;
					} else if (ratelimits.purge.ip) {
						ratelimit = ratelimits.purge.ip;
					} else {
						return error("unnable to parse ratelimits");
					}
					var gcd = calcGCD(ratelimit.hits, ratelimit.seconds);
					if (gcd > 1) {
						ratelimit.hits /= gcd;
						ratelimit.seconds /= gcd;
					}
				} else {
					if (rights && rights.indexOf("apihighlimits") !== -1) {
						ratelimit = { hits: 500, seconds: 0 };
					} else {
						ratelimit = { hits: 50, seconds: 0 };
					}
				}
			} else {
				return error("unnable to get userinfo");
			}
			if (callback)
				callback();
		});
	}

	function processPurge(continueinfo) {
		api.post($.extend({}, request, continueinfo))
			.done(function(data) {
				if (data && data.purge && data.purge.length) {
					count += data.purge.length;
				} else {
					return error("empty response");
				}
				if (data.warnings) {
					error("warning recieved");
					console.log(data.warnings);
					return;
				}
				if (data["continue"]) {
					status();
					setTimeout(function() {
						processPurge(data["continue"]);
					}, 1000 * ratelimit.seconds);
				} else {
					status("Готово.");
				}
			})
			.fail(function() {
				error("request failed");
			});
	}

	function startPurge(prefix, generator, linkupdate) {
		request = { "action": "purge" };
		if (linkupdate) {
			request.forcelinkupdate = "1";
		}
		$.extend(request, generator);

		updateRatelimit(function() {
			var limit = prefix + "limit";
			if (linkupdate) {
				request[limit] = 1;
			} else {
				request[limit] = ratelimit.hits;
			}
			count = 0;
			status();
			processPurge(null);
		});
	}

	function addButton() {
		var pagename = mw.config.get("wgPageName");
		var namespace = mw.config.get("wgCanonicalNamespace");
		var action = mw.config.get("wgAction");
		var exists = mw.config.get("wgArticleId") !== 0;

		if (!(
			action === "view" ||
			namespace === "Category" && action === "edit" && !exists
		)) {
			return;
		}

		var prefix, generator;
		var comment = "";
		if (namespace === "") {
			prefix = "gbl";
			generator = {
				"generator": "backlinks",
				"gbltitle": pagename
			};
			comment = "Сбросить кэш на страницах, ссылающихся на данную. ";
		} else if (namespace === "File") {
			prefix = "gfu";
			generator = {
				"generator": "fileusage",
				"titles": pagename
			};
			comment = "Сбросить кэш на страницах, включающих данный файл. ";
		} else if (namespace === "Template") {
			prefix = "gti";
			generator = {
				"generator": "transcludedin",
				"titles": pagename
			};
			comment = "Сбросить кэш на страницах, включающих данный шаблон. ";
		} else if (namespace === "Category") {
			prefix = "gcm";
			generator = {
				"generator": "categorymembers",
				"gcmtitle": pagename
			};
			comment = "Сбросить кэш на страницах, включённых в данную категорию. ";
		} else if (
			(namespace === "User" || namespace === "Wikiproject") &&
			pagename.indexOf("/") != -1
		) {
			prefix = "gpl";
			generator = {
				"generator": "links",
				"titles": pagename
			};
			comment = "Сбросить кэш на страницах, на которые ведут ссылки с данной. ";
		}

		if (prefix && generator) {
			var link = $("<a>", {
				title: comment + "Ctrl+клик — сделать нулевую правку.",
				text: "Сбросить кэш"
			}).css({cursor: 'pointer'});
			link.click(function(ev) {
				startPurge(prefix, generator, ev.ctrlKey);
			});

			element = $("<li>", { id: "t-purge" })
				.addClass("plainlinks")
				.append(link);

			$("#p-tb div ul").append(element);
		}
	}

	addButton();
});