|
|
(не показана одна промежуточная версия этого же участника) |
Строка 1: |
Строка 1: |
− | /*
| |
− | * Nuke
| |
− | * Reverse engineered Nuke extension
| |
− | * https://www.mediawiki.org/wiki/Extension:Nuke
| |
− | * @author Ozank Cx
| |
− | * @TODO - implement usercontribs API if Wikia update to MW 1.23+
| |
− | */
| |
− |
| |
− | mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {
| |
| | | |
− | var ug = mw.config.get('wgUserGroups');
| |
− |
| |
− | if (ug.indexOf('content-moderator') + ug.indexOf('sysop') + ug.indexOf('vstf') + ug.indexOf('staff') + ug.indexOf('helper') == -5) return;
| |
− |
| |
− | var config = mw.config.get([
| |
− | 'skin',
| |
− | 'stylepath',
| |
− | 'wgArticlePath',
| |
− | 'wgFormattedNamespaces',
| |
− | 'wgMainpage',
| |
− | 'wgSiteName'
| |
− | ]),
| |
− | token = mw.user.tokens.values.editToken,
| |
− | API = new mw.Api(),
| |
− | deleteDelay = window.nukeDelay || 1000;
| |
− | config.wgArticlePath = config.wgArticlePath.slice(0,-2);
| |
− |
| |
− | var self = {
| |
− | init: function() {
| |
− |
| |
− | $('.header-column.header-title h1').text('Nuke');
| |
− | document.title = "Nuke - " + config.wgSiteName;
| |
− | mw.util.addCSS('.thumbnail-nuke { width: 120px; height: 77px; }');
| |
− |
| |
− | if ($.getUrlVar('nukeuser')) {
| |
− | var user = $.getUrlVar('nukeuser'),
| |
− | deleteReason = window.nukeDeleteReason || "Mass removal of pages created by " + user.replace(/_/g,' ');
| |
− |
| |
− | $('#mw-content-text p').html('<a href="' + config.wgArticlePath + 'Special:Blankpage?blankspecial=nuke">Switch to Nuke main form</a><br/>The following pages were created by <a href="' + config.wgArticlePath + 'Special:Contributions/' + user + '">' + user.replace(/_/g,' ') + '</a>; put in a comment and hit the button to delete them.<br/>Reason for deletion: <input style="width: 400px" type="text" id="nuke-delete-reason" value="' + deleteReason + '"/><br/><a class="wikia-button nuke-submit">Delete</a><div id="nuke-status"/><ul id="nuke-query-results"></ul><a class="wikia-button nuke-submit">Delete</a>');
| |
− | $('#nuke-status').html('Getting pages... please wait <img src="' + config.stylepath + '/common/progress-wheel.gif"/>');
| |
− |
| |
− | API.get({
| |
− | action: 'query',
| |
− | list: 'usercontribs',
| |
− | ucnamespace: $.getUrlVar('nukenamespace') || '',
| |
− | ucuser: user,
| |
− | uclimit: 5000,
| |
− | cb: new Date().getTime()
| |
− | })
| |
− | .done(function(d) {
| |
− | if (!d.error) {
| |
− | var usercontribs = d.query.usercontribs,
| |
− | maxLimit = $.getUrlVar('nukelimit') || 500,
| |
− | count = 0,
| |
− | images = [];
| |
− |
| |
− | for (var i in usercontribs) {
| |
− | if (count >= maxLimit) break;
| |
− |
| |
− | if (usercontribs[i].hasOwnProperty('new')) {
| |
− | var escapedTitle = encodeURIComponent(usercontribs[i].title);
| |
− | if (!$.getUrlVar('nukematch') || new RegExp($.getUrlVar('nukematch')).test(usercontribs[i].title)) {
| |
− | $('#nuke-query-results').append('<li class="nuke-query-result"><input type="checkbox" class="nuke-title-check" checked="checked"/> <a href="' + config.wgArticlePath + escapedTitle + '" target="_blank">' + usercontribs[i].title + '</a></li>');
| |
− | if (usercontribs[i].title.slice(0,5) == "File:")
| |
− | images.push(usercontribs[i].title);
| |
− | count++;
| |
− | }
| |
− | }
| |
− | }
| |
− | if (!$('.nuke-query-result').length)
| |
− | self.outputError("No user contributions found");
| |
− | else {
| |
− | if (images.length > 0)
| |
− | self.displayImages(images);
| |
− | }
| |
− | }
| |
− | else
| |
− | self.outputError("Failed to get user contributions: " + d.error.code);
| |
− | })
| |
− | .fail(function() {
| |
− | self.outputError("Failed to get user contributions");
| |
− | });
| |
− | $('#nuke-status').empty();
| |
− | }
| |
− | else {
| |
− | $('#mw-content-text p').html('This tool allows for mass deletions of pages recently added by a given user or IP address.<br/>Input the username or IP address to get a list of pages to delete, or leave blank for all users.<br/>Username, IP address or blank: <input type="text" id="nuke-username"/><br/>Pattern for the page name: <input type="text" id="nuke-match"/><br/>Limit to namespace: <select id="nuke-namespace"><option value="All">All</option><option value="Main" ns="0">Main</option><option value="Project" ns="4">Project</option><option value="Project talk" ns="5">Project talk</option><option value="Talk" ns="1">Talk</option><option value="User" ns="2">User</option><option value="User talk" ns="3">User talk</option><option value="File" ns="6">File</option><option value="File talk" ns="7">File talk</option><option value="Template" ns="10">Template</option><option value="Template talk" ns="11">Template talk</option><option value="Help" ns="12">Help</option><option value="Help talk" ns="13">Help talk</option><option value="Category" ns="14">Category</option><option value="Category talk" ns="15">Category talk</option></select><br/>Maximum number of pages: <input type="text" id="nuke-max" value="500"/><br/><a class="wikia-button" id="nuke-rc">Go</a><br/><div id="nuke-status"/><div id="nuke-query-results"/>');
| |
− |
| |
− | $('#nuke-rc').click(function() {
| |
− | if ($(this).attr('disabled')) return;
| |
− |
| |
− | $(this).attr('disabled','disabled');
| |
− |
| |
− | if ($('#nuke-username').val()) {
| |
− | var locationStr = config.wgArticlePath + '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) {
| |
− | var recentchanges = d.query.recentchanges,
| |
− | RCTitles = [],
| |
− | maxLimit = $('#nuke-max').val() || 5000,
| |
− | count = 0,
| |
− | images = [];
| |
− |
| |
− | for (var i in recentchanges) {
| |
− | if (count >= maxLimit) break;
| |
− |
| |
− | if ($.inArray(recentchanges[i].title,RCTitles) == -1 && (($('#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))) {
| |
− | if (!$('#nuke-match').val() || new RegExp($('#nuke-match').val()).test(recentchanges[i].title)) {
| |
− | RCTitles.push(recentchanges[i].title);
| |
− | var escapedTitle = encodeURIComponent(recentchanges[i].title);
| |
− | $('#nuke-query-results').append('<li class="nuke-query-result"><input type="checkbox" class="nuke-title-check" checked="checked"/> <a href="' + config.wgArticlePath + escapedTitle + '" target="_blank"> ' + recentchanges[i].title + '</a></li>');
| |
− | if (recentchanges[i].title.slice(0,5) == "File:")
| |
− | images.push(recentchanges[i].title);
| |
− | count++;
| |
− | }
| |
− | }
| |
− | }
| |
− | if (!$('.nuke-query-result').length)
| |
− | self.outputError("No recent changes found");
| |
− | else {
| |
− | $('#nuke-query-results').before('<br/><a class="wikia-button nuke-submit">Delete</a>').after('<a class="wikia-button nuke-submit">Delete</a>');
| |
− | $('#nuke-status').empty();
| |
− | if (images.length > 0)
| |
− | self.displayImages(images);
| |
− | }
| |
− | }
| |
− | else
| |
− | self.outputError("Failed to get recent changes: " + d.error.code);
| |
− | })
| |
− | .fail(function() {
| |
− | self.outputError("Failed to get recent changes");
| |
− | });
| |
− | $('#nuke-status').empty();
| |
− | $(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(config.wgArticlePath + config.wgMainpage);
| |
− | }, 1000);
| |
− | }
| |
− | }, i*deleteDelay);
| |
− | });
| |
− | });
| |
− | },
| |
− | outputError: function(text) {
| |
− | switch (config.skin) {
| |
− | case 'oasis':
| |
− | case 'wikia':
| |
− | new BannerNotification(text,'error').show();
| |
− | break;
| |
− |
| |
− | default:
| |
− | alert(text);
| |
− | break;
| |
− | }
| |
− | },
| |
− | displayImages: function(imgs) {
| |
− | API.post({ //POST instead of GET for longer length
| |
− | action: 'query',
| |
− | prop: 'imageinfo',
| |
− | titles: imgs.join('|'),
| |
− | iiprop: 'url',
| |
− | iilimit: 500
| |
− | })
| |
− | .done(function(d) {
| |
− | if (!d.error) {
| |
− | for (var i in d.query.pages) {
| |
− | if (d.query.pages[i].missing != "") {
| |
− | var href = config.wgArticlePath + encodeURIComponent(d.query.pages[i].title);
| |
− | $('a[href="' + href + '"]').parent().children('.nuke-title-check').after('<a href="' + href + '"><img class="thumbnail-nuke" src="' + d.query.pages[i].imageinfo[0].url + '" /></a>');
| |
− | }
| |
− | }
| |
− | }
| |
− | else
| |
− | self.outputError('Failed to display images: ' + d.error.code);
| |
− | })
| |
− | .fail(function() {
| |
− | self.outputError('Failed to display images');
| |
− | });
| |
− | }
| |
− | };
| |
− |
| |
− | switch (mw.config.get('wgCanonicalSpecialPageName')) {
| |
− | case "Contributions":
| |
− | $('#contentSub a:last-child').after(' | <a title="Special:Nuke" href="' + mw.config.get('wgArticlePath').replace('$1','Special:Blankpage?blankspecial=nuke&nukeuser=' + mw.config.get('wgPageName').split('/')[1] ) + '">Nuke</a>');
| |
− | break;
| |
− |
| |
− | case "Specialpages":
| |
− | if (!$('a[title="Special:Nuke"]').length)
| |
− | $('.mw-specialpagerestricted a[title="Special:Undelete"]').after('<li class="mw-specialpagerestricted"><a title="Special:Nuke" href="' + mw.config.get('wgArticlePath').replace('$1','Special:Blankpage?blankspecial=nuke') + '">Mass delete</a></li>');
| |
− | else
| |
− | $('.mw-specialpagerestricted a[title="Special:Nuke"]').after('<li class="mw-specialpagerestricted"><a title="Special:Nuke" href="' + mw.config.get('wgArticlePath').replace('$1','Special:Blankpage?blankspecial=nuke') + '">Mass delete (JavaScript)</a></li>');
| |
− | break;
| |
− |
| |
− | case "Blankpage":
| |
− | if ($.getUrlVar('blankspecial') == "nuke")
| |
− | self.init();
| |
− | break;
| |
− |
| |
− | default:
| |
− | return;
| |
− | break;
| |
− | }
| |
− |
| |
− | });
| |