Użytkownik:Expert3222/patrolModule.js

Z Nondanych
Wersja z dnia 07:55, 9 maj 2020 autorstwa Eksekk (dyskusja • edycje) (to się jeszcze pewnie zmieni)
(różn.) ← poprzednia wersja • przejdź do aktualnej wersji (różn.) • następna wersja → (różn.)

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
/*
 * gadżet do szybkiego oznaczania wersji jako sprawdzonych na OZ, nowych stronach i widoku diffów
 * autor: Expert3222
 * drobne modyfikacje: Ostrzyciel
 */

// TODO: $(this) na $this (do zmiennej), lepsza wydajność będzie

var QuickPatrolLastClick = 0; //https://stackoverflow.com/questions/28609994/javascript-prevent-function-from-executing-multiple-times
var QuickPatrolDelay = 20; //syfiło w logach, rejestrując patrolowanie po kilka razy
var QuickPatrolToken = null;
var QuickPatrolDiffPageRevids = [];
var spinnerCode = "<div class='mw-spinner mw-spinner-small mw-spinner-inline' title='...'></div>";

//fix dla
//https://nonsa.pl/wiki/Plik:Patrolowe_czworaczki.jpg
var makePatrolLinksIsExecuting = false;
var makeDiffViewRevidsListIsExecuting = false;
var makeFilePatrolLinkCallCount = 0;

$(document).ready(function()
{
	if (mw.config.get("wgCanonicalSpecialPageName") === "Recentchanges")
	{
		makePatrolLinks();
		if (!!$('.mw-rcfilters-enabled').length) //wzięte od Polskacafe z gadżetu RollWithReason
		{
			setInterval(makePatrolLinks, 2000);
		}
	}
	else if (mw.config.get("wgCanonicalSpecialPageName") == "Newpages")
	{
		makeNewpagesPatrolLinks();
	}
	else if (mw.util.getParamValue("diff") !== null)
	{
		var parse = function()
		{
			var oldid = mw.util.getParamValue("oldid", $("#mw-diff-otitle1 > strong > a").attr("href"));
			//alert("oldid = " + oldid);
			var curid = mw.util.getParamValue("oldid", $("#mw-diff-ntitle1 > strong > a").attr("href"));
			//alert("curid = " + curid);
			
			var title = mw.config.get("wgPageName").replace("_", " ");
			
			//console.log(oldid, curid, title);
			makeDiffViewRevidsList(oldid, curid, title);
		};
		parse();
		
		setInterval(parse, 2000); //"przeglądaj historię interaktywnie" na górze
	}
	else if (mw.config.get("wgCanonicalSpecialPageName") == "MobileDiff")
	{
		//TODO
		
		/*var oldid = mw.util.getParamValue("oldid", $("#mw-mf-diff-info a").attr("href"));
		alert("oldid = " + oldid);
		var urlArray = window.location.href.split("/");
		var curid = urlArray[urlArray.length - 1];
		alert("curid = " + curid);
		
		var title = $("#mw-mf-diff-info a").text();
		makeDiffViewRevidsList(oldid, curid, title);*/
	}
});

//użycie: patrolChange(diff).done(callback).fail(callback2);
function patrolChange(diff, tokenAlreadyReset)
{
	if (QuickPatrolLastClick >= (Date.now() - QuickPatrolDelay))
    	$.when();
	QuickPatrolLastClick = Date.now();
	
	if (diff === null || diff === "" || typeof diff == "undefined")
	{
		return $.when(); //resolved promise
	}
	
	var api = new mw.Api(),
		deferred = $.Deferred();
	
	api.post(
	{
		action: 'fmod-patrol',
		format: 'json',
		revid: diff,
		token: mw.user.tokens.get("patrolToken")
	}).done(function(data)
	{
		deferred.resolve();
	}).fail(function(error)
	{
		if (!tokenAlreadyReset)
		{
			console.log("TOKEN PATROLOWANIA NIEPRAWIDŁOWY - DRUGA PRÓBA");
			api.post
			({
				format: "json",
				formatversion: "2",
				action: "query",
				meta: "tokens",
				type: "patrol"
			}).done(function(data)
			{
				mw.user.tokens.set("patrolToken", data.query.tokens.patroltoken);
				patrolChange(diff, true)
				.done(function()
				{
					deferred.resolve();
					console.log("NOWY TOKEN PRAWIDŁOWY");
				}).fail(function()
				{
					deferred.reject();
					console.log("NOWY TOKEN NIEPRAWIDŁOWY");
				});
			});
		}
		else // w przypadku pierwszego faila to zostanie wykonane przez funkcję wywołaną rekursywnie
		{
			console.log(error);
			
			deferred.reject();
		}
	});
	
	return deferred.promise();
}

//użycie: patrolRangeOfChanges(to, from).done(callback).fail(callback2);
function patrolRangeOfChanges(to, from, tokenAlreadyReset)
{
	if (QuickPatrolLastClick >= (Date.now() - QuickPatrolDelay))
    	return $.when();
	QuickPatrolLastClick = Date.now();
	
	if (diff === null || diff === "" || typeof diff == "undefined")
	{
		return $.when(); //resolved promise
	}
	
	var api = new mw.Api(),
		deferred = $.Deferred();
	
	var request = 
	{
		action: 'patrol',
		format: 'json',
		maxrevid: to,
		token: mw.user.tokens.get("patrolToken")
	};
	if (from !== null && from <= to && from >= 0)
	{
		$.extend(request, {
			minrevid: from
		});
	}
	api.post(request).done(function(data)
	{
		deferred.resolve();
	}).fail(function(error)
	{
		if (!tokenAlreadyReset)
		{
			console.log("TOKEN PATROLOWANIA NIEPRAWIDŁOWY - DRUGA PRÓBA");
			api.post
			({
				format: "json",
				formatversion: "2",
				action: "query",
				meta: "tokens",
				type: "patrol"
			}).done(function(data)
			{
				mw.user.tokens.set("patrolToken", data.query.tokens.patroltoken);
				patrolRangeOfChanges(to, from, true)
				.done(function()
				{
					deferred.resolve();
					console.log("NOWY TOKEN PRAWIDŁOWY");
				}).fail(function()
				{
					deferred.reject();
					console.log("NOWY TOKEN NIEPRAWIDŁOWY");
				});
			});
		}
		else // w przypadku pierwszego faila to zostanie wykonane przez funkcję wywołaną rekursywnie
		{
			console.log(error);
			
			deferred.reject();
		}
	});
	
	return deferred.promise();
}

//użycie: patrolPage(pageid).done(callback).fail(callback2);
function patrolPage(id, tokenAlreadyReset)
{
	if (QuickPatrolLastClick >= (Date.now() - QuickPatrolDelay))
    	return $.when();
	QuickPatrolLastClick = Date.now();
	
	if (diff === null || diff === "" || typeof diff == "undefined")
	{
		return $.when(); //resolved promise
	}
	
	var api = new mw.Api(),
		deferred = $.Deferred();
	
	api.post(
	{
		action: 'patrol',
		format: 'json',
		pageid: id,
		token: mw.user.tokens.get("patrolToken")
	}).done(function(data)
	{
		deferred.resolve();
	}).fail(function(error)
	{
		if (!tokenAlreadyReset)
		{
			console.log("TOKEN PATROLOWANIA NIEPRAWIDŁOWY - DRUGA PRÓBA");
			api.post
			({
				format: "json",
				formatversion: "2",
				action: "query",
				meta: "tokens",
				type: "patrol"
			}).done(function(data)
			{
				mw.user.tokens.set("patrolToken", data.query.tokens.patroltoken);
				patrolPage(id, true)
				.done(function()
				{
					deferred.resolve();
					console.log("NOWY TOKEN PRAWIDŁOWY");
				}).fail(function()
				{
					deferred.reject();
					console.log("NOWY TOKEN NIEPRAWIDŁOWY");
				});
			});
		}
		else // w przypadku pierwszego faila to zostanie wykonane przez funkcję wywołaną rekursywnie
		{
			console.log(error);
			
			deferred.reject();
		}
	});
	
	return deferred.promise();
}