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

< Участник:Popstop
Версия от 18:41, 9 сентября 2018; Popstop (обсуждение | вклад) (Чёрная магия)

Версия от 18:41, 9 сентября 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();
});

mw.loader.using(['mediawiki.util', 'mediawiki.api'])
	.then(function() {
		var count, wait;
		var step = 1;
		var depth = 5;
		var api = new mw.Api();

		function collectSubCategories(cat) {
			console.log('cat: ' + cat);
			return $.getJSON('https://petscan.wmflabs.org', {
					language: 'ru',
					project: 'wikipedia',
					depth: depth - 1,
					categories: cat.substring(cat.indexOf(':') + 1),
					'ns[14]': 1,
					interface_language: 'en',
					active_tab: 'tab_output',
					doit: '',
					format: 'json'
				})
				.done(function(d) {
					purge([cat].concat(d['*'][0].a['*'].map(function(q) {
						return "Категория:" + q.title;
					}))
						.reverse());
				})
				.fail(function() {
					alert("Сбор подкатегорий не удался");
					purge([cat]);
				});
		}

		function purge(cats) {
			if (cats.length <= 0) {
				alert("Нуль-правки успешно завершены!");
				document.location.reload();
			} else
				postPurge(cats[0], cats);
		}

		function postPurge(cat, cats, addParams) {
			console.log('catnext: ' + cat);
			var apiParams = $.extend({
				action: 'purge',
				generator: 'categorymembers',
				'gcmtitle': cat,
				'gcmlimit': step,
				forcelinkupdate: 1
			}, addParams);
			api.post(apiParams)
				.done(function(d) {
					console.log(d);
					count += step;
					if (d.warnings === undefined && d["continue"] !== undefined &&
						d["continue"].gcmcontinue) {
						mw.notify(count + " страниц перепостроены");
						setTimeout(function() {
							postPurge(cat, cats, d["continue"]);
						}, wait);
					} else {
						alert("Нуль-правки успешно завершены! (" + cat.replace(/_/g, " ") + ")");
						cats.shift();
						purge(cats);
					}
				})
				.fail(function() {
					alert("Неудача");
				});
		}
		if (mw.config.get('wgNamespaceNumber') == 14) {
			wait = 1000;
			api.get({
					meta: 'userinfo',
					uiprop: 'ratelimits'
				})
				.done(function(d) {
					if (d && d.query && d.query.userinfo && d.query.userinfo.ratelimits &&
						d.query.userinfo.ratelimits.purge)
						wait = 2000;
					$( "#p-tb div ul" ).append( $('<li>').addClass('plainlinks')
						.append( $('<a>').text('Нуль-правки').css({cursor: 'pointer'})
						.click( function() {
							count = 0;
							collectSubCategories(mw.config.get('wgPageName')
								.replace(/_/g, " "));
						} ) ) );
				});
		}
	});

if (mw.config.get( 'wgAction' ) == 'edit' || mw.config.get( 'wgAction' ) == 'submit') {
( function() {
  var buttons = [
  [
    '//w.hil.su/images/c/cb/Grid_%D0%9A%D1%80%D0%BE%D0%B2%D0%B0%D0%B2%D1%8B%D0%B9_%D0%B0%D0%BB%D1%82%D0%B0%D1%80%D1%8C_%28Blood_Magic%29.png',
    'Вставить шаблон кровавого алтаря',
    '{'+'{Blood Magic/Кровавый алтарь\n|вход=\n|выход=\n|уровень=\n|LP=\n|расход=\n|потери=\n',
    '}}',
    '',
    'button-bloodaltar'
  ],
  [
    '//d1u5p3l4wpay3k.cloudfront.net/minecraft_ru_gamepedia/0/06/%D0%9F%D0%B0%D0%BB%D0%BA%D0%B0.png?version=b9bf1cabc365d86a601e4e872c84c165',
    'Вставить шаблон предмета',
    '{'+'{Предмет\n|изображение=\n|инвизображение=\n|тип=\n|прочн=\n|склад=\n|текст_id=\n',
    '}}',
    '',
    'button-item'
  ],
  [
    '//d1u5p3l4wpay3k.cloudfront.net/minecraft_ru_gamepedia/0/04/%D0%97%D0%B5%D0%BC%D0%BB%D1%8F.png?version=f0b569469bb185914c9394c44f1686bf',
    'Вставить шаблон блока',
    '{'+'{Блок\n|изображение=\n|инвизображение=\n|тип=\n|гравит=\n|грязь=\n|прозр=\n|свет=\n|взрывоуст=\n|прочн=\n|инструмент=\n|склад=\n|восплам=\n|текст_id=\n',
    '}}',
    '',
    'button-block'
  ],
  [
    '//d1u5p3l4wpay3k.cloudfront.net/minecraft_ru_gamepedia/5/5f/Grid_%D0%96%D0%B0%D1%80%D0%B5%D0%BD%D0%B0%D1%8F_%D1%81%D0%B2%D0%B8%D0%BD%D0%B8%D0%BD%D0%B0.png?version=332e7af745e3e442f4d36b41d567f53d',
    'Вставить шаблон еды',
    '{'+'{Еда\n|изображение=\n|инвизображение=\n|тип=\n|готов=\n|восст=\n|текст_id=\n|некат=\n',
    '}}',
    '',
    'button-food'
  ],
  [
    '//w.hil.su/images/e/e5/%D0%A2%D0%B5%D0%BB%D0%B5%D0%BF%D0%BE%D0%B7%D0%B5%D1%80_%28Blood_Magic%29.png',
    'Вставить шаблон модификации',
    '{'+'{Модификация\n|изображение=\n|версия=\n|mcверсия=\n|требования=\n|forge=\n|дополнения=\n|серверы=\n',
    '}}',
    '',
    'button-modification'
  ]
];
	$.each( buttons, function() { mw.toolbar.addButton.apply( null, this ); } );
} ) ();
}

mw.util.addPortletLink ('p-tb', '/Служебная:Новые_статьи', 'Новые статьи', 't-new', 'Подстраницы');
mw.util.addPortletLink ('p-tb', '/Служебная:Указатель_по_началу_названия/'+mw.config.get( 'wgPageName' )+'/', 'Подстраницы' , 't-subpages', 'Подстраницы');