לדלג לתוכן

משתמש:מגזין יהלום/Sandbox.js

מתוך ויקיפדיה, האנציקלופדיה החופשית

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
if (
	mw.config.get("wgCanonicalSpecialPageName") === "Contributions" &&
	mw.config.get("wgRelevantUserName") !== mw.config.get("wgUserName")
) {
	
	mw.loader.load(
		"//he.wikipedia.org/w/index.php?title=משתמש:Guycn2/Sandbox.css" +
		"&action=raw&ctype=text/css", "text/css"
	);
	
	$.when(mw.loader.using(["mediawiki.util", "mediawiki.api"]), $.ready).done(function() {
		
		"use strict";
		
		var relevantUser = mw.config.get("wgRelevantUserName"),
		    api = new mw.Api(),
		    currentUserRights = [],
		    relevantUserGender = [],
		    interfaceMessages = {},
		    isRelevantUserAnon = mw.util.isIPAddress(relevantUser),
		    contribsPeriod = 0,
		    queryLimit = 0,
		    latestEdits = [],
		    totalEdits = 0,
		    createdPages = [],
		    totalPages = 0,
		    revIDs = [],
		    totalIDs = 0,
		    tagExists = true,
		    $dialog = {},
		    isRollbackChecked = false,
		    isDeleteChecked = false,
		    isBlockChecked = false,
		    isRevDeleteChecked = false,
		    isHideSummariesChecked = false,
		    cleanerSummary = "",
		    blockDuration = "",
		    totalTasks = 0,
		    currentTask = 0,
		    failedTasks = false,
		    editNumber = 0,
		    rollbackPercent = 0,
		    pageNumber = 0,
		    deletePercent = 0,
		    idNumber = 0,
		    revDeletePercent = 0;
		
		api.get({
			list: "users",
			usprop: "rights|gender",
			ususers: relevantUser + "|" + mw.config.get("wgUserName")
		}).done(function(data) {
			
			var relevantUserRights = data.query.users[0].rights;
			
			currentUserRights = data.query.users[1].rights;
			relevantUserGender = data.query.users[0].gender;
			
			if (
				isRelevantUserAnon ||
				(
					typeof relevantUserRights !== "undefined" &&
					relevantUserRights.indexOf("autopatrol") < 0
				)
			) {
				
				$.getScript(
					"//he.wikipedia.org/w/index.php?title=משתמש:Guycn2/Sandbox2.js" +
					"&action=raw&ctype=text/javascript",
					function() {
						
						interfaceMessages =
							window.vandalCleanerConfig.messages[mw.config.get("wgUserLanguage")] ||
							window.vandalCleanerConfig.messages.en;
						
						contribsPeriod = window.vandalCleanerConfig.contribsPeriod;
						
						if (currentUserRights.indexOf("noratelimit") < 0) {
							// User is limited to 100 rollbacks per minute
							queryLimit = window.vandalCleanerConfig.smallQueryLimit;
						} else {
							// User is not subject to rate limits
							queryLimit = window.vandalCleanerConfig.largeQueryLimit;
						}
						
						$("#contentSub").after(
							$("<button>", {
								type: "button",
								"class": "mw-ui-button mw-ui-destructive",
								id: "vandal-cleaner-button",
								title: i18n("contribsButtonTooltip"),
								text: i18n("contribsButtonText")
							}).on("click", function() {
								initializeTool(setOldestContribsDate());
							})
						);
						
					}
				);
				
			}
			
		});
		
		function i18n(key) {
			
			key = interfaceMessages[key] || key;
			
			var isAnonPattern = /<<ISANON\|(.*?)\|(.*?)(>>)/g,
			    genderPattern = /<<GENDER\|(.*?)\|(.*?)(>>)/g,
			    extendedGenderPattern = /<<GENDER\|(.*?)\|(.*?)\|(.*?)(>>)/g;
			
			key = key
				.replace(isAnonPattern, isRelevantUserAnon ? "$1" : "$2")
				.replace(
					extendedGenderPattern,
					relevantUserGender === "female" ? "$2" :
					(relevantUserGender === "male" ? "$1" : "$3")
				)
				.replace(genderPattern, relevantUserGender === "female" ? "$2" : "$1")
				.replace(/\$RELEVANTUSER/g, relevantUser)
				.replace(/\$CONTRIBSPERIOD/g, contribsPeriod)
				.replace(/\$QUERYLIMIT/g, queryLimit)
				.replace(/(<<|>>)/g, "");
			
			return key;
			
		}
		
		function initializeTool(oldestContribsDate) {
			
			if ($(".vandal-cleaner-interface-dialog").length) {
				console.log("Vandal Cleaner dialog is already open.");
				return;
			}
			
			mw.util.$content.append(
				$("<div>", {
					"class": "vandal-cleaner-dark-cover"
				}).append(
					$("<img>", {
						id: "vandal-cleaner-loading-image",
						src: "//upload.wikimedia.org/wikipedia/commons/1/14/Ajax-loader_bert2_blue-white.gif",
						alt: i18n("loadingInterface")
					})
				)
			);
			
			var $loadingCover = $(".vandal-cleaner-dark-cover").fadeTo("_default", 1);
			
			api.get({
				list: "usercontribs",
				ucuser: relevantUser,
				ucprop: "title",
				ucshow: "top|!new",
				uclimit: queryLimit + 1,
				ucend: oldestContribsDate
			}).done(function(editsQuery) {
				
				latestEdits = editsQuery.query.usercontribs;
				totalEdits = latestEdits.length;
				
				api.get({
					list: "usercontribs",
					ucuser: relevantUser,
					ucprop: "title",
					ucshow: "new",
					uclimit: queryLimit + 1,
					ucend: oldestContribsDate
				}).done(function(pagesQuery) {
					
					createdPages = pagesQuery.query.usercontribs;
					totalPages = createdPages.length;
					
					api.get({
						list: "usercontribs",
						ucuser: relevantUser,
						ucprop: "ids",
						ucshow: "!new",
						uclimit: queryLimit + 1,
						ucend: oldestContribsDate
					}).done(function(idsQuery) {
						
						revIDs = idsQuery.query.usercontribs;
						totalIDs = revIDs.length;
						
						// Check if [[MediaWiki:Tag-VandalCleaner]] exists to
						// determine whether or not actions made using this
						// script should be tagged.

						api.get({
							titles: "MediaWiki:Tag-VandalCleaner"
						}).done(function(tagQuery) {
							
							if (tagQuery.query.pages[-1]) {
								
								// If [[MediaWiki:Tag-VandalCleaner]] does not exist,
								// then the actual "VandalCleaner" tag is also not
								// likely to exist. In this case, actions made using
								// this script must NOT be tagged; otherwise they will
								// fail with the "tags-apply-not-allowed-one" error.
								
								tagExists = false;
								
							}
							
							createDialog($loadingCover);
							
						});
						
					});
					
				});
				
			});
			
		}
		
		function setOldestContribsDate() {
			
			var date = new Date();
			date.setTime(date.getTime() - (contribsPeriod * 24 * 60 * 60 * 1000));
			
			var year = date.getUTCFullYear(),
			    month = date.getUTCMonth() + 1,
			    day = date.getUTCDate(),
			    hours = date.getUTCHours(),
			    minutes = date.getUTCMinutes(),
			    seconds = date.getUTCSeconds();
			
			return year + "-" +
			       (month < 10 ? "0" + month : month) + "-" +
			       (day < 10 ? "0" + day : day) + "T" +
			       (hours < 10 ? "0" + hours : hours) + ":" +
			       (minutes < 10 ? "0" + minutes : minutes) + ":" +
			       (seconds < 10 ? "0" + seconds : seconds) + "Z";
			
		}
		
		function createDialog($loadingCover) {
			
			$dialog = $("<div>", {
				"class": "vandal-cleaner-interface-dialog"
			});
			
		}
		
	});
	
}