MediaWiki:Nuke/code.js

/*
 * Nuke
 * Reverse engineered Nuke extension
 * Is faster than the original and won't freeze up when deleting many pages
 * https://www.mediawiki.org/wiki/Extension:Nuke is the page of the official MW extension
 * @author Ozuzanna
 * @TODO use usercontribs API when Wikia update to MW 1.23+
 * (function($, mw) {

if (mw.config.get('wgUserGroups').indexOf('sysop') + mw.config.get('wgUserGroups').indexOf('vstf') + mw.config.get('wgUserGroups').indexOf('staff') + mw.config.get('wgUserGroups').indexOf('helper') == -4) return;

switch (mw.config.get('wgCanonicalSpecialPageName')) { case "Contributions": $('#contentSub a:nth-child(8)').after(' | Nuke'); break; case "Specialpages": if (!$('a[title="Special:Nuke"]').length) $('.mw-specialpagerestricted a[title="Special:Undelete"]').after('Mass delete'); break; case "Blankpage": if ($.getUrlVar('blankspecial') == "nuke") nukeMain; break; }

function nukeMain { var config = mw.config.get([		'stylepath',		'wgArticlePath',		'wgFormattedNamespaces',		'wgMainpage',		'wgSiteName'	]), token = mw.user.tokens.get('editToken'), API = new mw.Api, articlePath = config.wgArticlePath.slice(0,-2), RCTitles, usercontribs, recentchanges, maxLimit, count, escapedTitle; $('.AdminDashboardGeneralHeader h1').text('Nuke'); document.title = "Nuke - " + config.wgSiteName; wgCanonicalSpecialPageName = "Nuke"; if ($.getUrlVar('nukeuser')) { var user = $.getUrlVar('nukeuser'), deleteReason = window.nukeDeleteReason || "Mass removal of pages created by " + user; $('#mw-content-text p').html('Switch to Nuke main form The following pages were created by ' + user + '; put in a comment and hit the button to delete them. Reason for deletion:  Delete Delete'); $('#nuke-status').html('Getting pages... please wait '); API.get({			action: 'query',			list: 'usercontribs',			ucnamespace: $.getUrlVar('nukenamespace') || '',			ucuser: user,			uclimit: 5000,			cb: new Date.getTime 		}) .done(function(d) {			if (!d.error) {				usercontribs = d.query.usercontribs;				maxLimit = $.getUrlVar('nukelimit') || 5000;				count = 0;				for (var i in usercontribs) {					if (count >= maxLimit)							break;					if (usercontribs[i].hasOwnProperty('new')) {						escapedTitle = encodeURIComponent(usercontribs[i].title);						if (!$.getUrlVar('nukematch') || new RegExp($.getUrlVar('nukematch')).test(usercontribs[i].title)) {							$('#nuke-query-results').append('<input type="checkbox" class="nuke-title-check" checked="checked"/> <a href="' + articlePath + escapedTitle + '" target="_blank">' + usercontribs[i].title + '</a></li>');							if (usercontribs[i].title.slice(0,5) == "File:")								displayImage(usercontribs[i].title,articlePath,API);							count++;														}					}				}				if (!$('.nuke-query-result').length)					$('#nuke-status').html(' No user contributions found '); else $('#nuke-status').empty; }			else $('#nuke-status').html(' Failed to get user contributions: ' + d.error.code + ' '); })		.fail(function { $('#nuke-status').html(' Failed to get user contributions '); });	}	else {		$('#mw-content-text p').html('This tool allows for mass deletions of pages recently added by a given user or IP address. Input the username or IP address to get a list of pages to delete, or leave blank for all users. Username, IP address or blank: <input type="text" id="nuke-username"/> Pattern for the page name: <input type="text" id="nuke-match"/> Limit to namespace: <select id="nuke-namespace"><option value="All">All <option value="Main" ns="0">Main <option value="Project" ns="4">Project <option value="Project talk" ns="5">Project talk <option value="Talk" ns="1">Talk <option value="User" ns="2">User <option value="User talk" ns="3">User talk <option value="File" ns="6">File <option value="File talk" ns="7">File talk <option value="Template" ns="10">Template <option value="Template talk" ns="11">Template talk <option value="Help" ns="12">Help <option value="Help talk" ns="13">Help talk <option value="Category" ns="14">Category <option value="Category talk" ns="15">Category talk Maximum number of pages: <input type="text" id="nuke-max" value="500"/> <a class="wikia-button" id="nuke-rc">Go</a>  '); $('#nuke-rc').click(function {			if ($(this).attr('disabled')) return;			$(this).attr('disabled','disabled');			if ($('#nuke-username').val) {				var locationStr = articlePath + 'Special:Blankpage?blankspecial=nuke&nukeuser=' + $('#nuke-username').val;				if ($('#nuke-namespace').val != "All")					locationStr += '&nukenamespace=' + $('#nuke-namespace option:selected').attr('ns');				if ($.isNumeric($('#nuke-max').val) && $('#nuke-max').val > 0)					locationStr += '&nukelimit=' + $('#nuke-max').val;				if ($('#nuke-match').val)					locationStr += '&nukematch=' + $('#nuke-match').val;				location.replace(locationStr);				return;			}			$('#nuke-query-results').empty;			if ($('.nuke-submit').length) {				$('.nuke-submit').remove;				$('#mw-content-text > p:nth-child(1) > br:nth-child(14)').remove;			}			$('#nuke-status').html('Getting pages... please wait <img src="' + config.stylepath + '/common/progress-wheel.gif"/>');			API.get({ action: 'query', list: 'recentchanges', rcshow: '!bot', rctype: 'new|log', rclimit: 5000, cb: new Date.getTime })			.done(function(d) { if (!d.error) { recentchanges = d.query.recentchanges; RCTitles = []; maxLimit = $('#nuke-max').val || 5000; count = 0; for (var i in recentchanges) { if (count >= maxLimit) break; if ((($('#nuke-namespace').val == "Main" && recentchanges[i].title.split(':').length === 1) || $('#nuke-namespace').val == "All" || $('#nuke-namespace').val == "Project" && new RegExp(config.wgFormattedNamespaces[4] + ':').test(recentchanges[i].title) || $('#nuke-namespace').val == "Project talk" && new RegExp(config.wgFormattedNamespaces[5] + ':').test(recentchanges[i].title) || new RegExp($('#nuke-namespace').val + ':').test(recentchanges[i].title)) && (recentchanges[i].type == "new" || (recentchanges[i].type == "log" && recentchanges[i].ns == 6)) && $.inArray(recentchanges[i].title,RCTitles) == -1) { if (!$('#nuke-match').val || new RegExp($('#nuke-match').val).test(recentchanges[i].title)) { RCTitles.push(recentchanges[i].title); escapedTitle = encodeURIComponent(recentchanges[i].title); $('#nuke-query-results').append('<input type="checkbox" class="nuke-title-check" checked="checked"/> <a href="' + articlePath + escapedTitle + '" target="_blank"> ' + recentchanges[i].title + '</a></li>'); if (usercontribs[i].title.slice(0,5) == "File:") displayImage(recentchanges[i].title,articlePath,API); count++; }						}					}					if (!$('.nuke-query-result').length) $('#nuke-status').html(' No recent changes found '); else { $('#nuke-query-results').before(' <a class="wikia-button nuke-submit">Delete</a>').after('<a class="wikia-button nuke-submit">Delete</a>'); $('#nuke-status').empty; }				}				else $('#nuke-status').html(' Failed to get recent changes: ' + d.error.code + ' '); })			.fail(function { $('#nuke-status').html(' Failed to get recent changes '); });			$(this).removeAttr('disabled');		}); }

$('.nuke-submit').click(function {		if (!$('.nuke-query-result').length || $(this).attr('disabled')) return;		$('.nuke-submit').attr('disabled','disabled');		$('#nuke-status').html('Deleting pages... please wait <img src="' + config.stylepath + '/common/progress-wheel.gif"/>');		$('.nuke-title-check:checked').each(function(i) { var title = $(this).parent.find('a').text; setTimeout(function {				API.post({ action: 'delete', title: title, reason: $('#nuke-delete-reason').val || '', bot: true, token: token })				.done(function(d) { if (!d.error) { console.log('Deletion of ' + title + ' successful!'); } else { console.log('Failed to delete ' + title + ': '+ d.error.code); }				})				.fail(function { console.log('Failed to delete ' + title); });				if (i === $('.nuke-title-check:checked').length - 1) {					setTimeout(function { location.replace(articlePath + config.wgMainpage); }, 1000);	 				}			}, i*100); });	}); }

function displayImage(image,path,api) { api.get({	action: 'query',	prop: 'imageinfo',	titles: image,	iiprop: 'url'	}) .done(function(d) {		if (!d.error) {			for (var i in d.query.pages) {				if (d.query.pages[i].missing != "")					$('a[href="' + path + encodeURIComponent(image) + '"]').parent.children('.nuke-title-check').after('<img src="' + d.query.pages[i].imageinfo[0].url + '" width="120" height="77">');			}		}	}); }

}) (this.jQuery, this.mediaWiki);