Участник:Mednik/common.js — различия между версиями
Материал из Wiki - Факультет компьютерных наук
Mednik (обсуждение | вклад) (эксперимент: скрипт nuke) |
Mednik (обсуждение | вклад) (старая версия) |
||
Строка 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 = []; | |
− | $('#nuke-status').html(' | + | |
− | + | 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(); | $('#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; | |
− | + | ||
− | + | ||
− | if ( | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | + | ||
− | + | $('#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); | |
− | class | + | 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); | |
− | $ | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | }) | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | if ( | + | |
− | + | ||
− | } else { | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | } | + | }) |
− | + | .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; | break; | ||
− | + | ||
− | + | default: | |
− | + | alert(text); | |
− | + | ||
break; | 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; | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | return | + | default: |
− | + | return; | |
− | + | break; | |
− | + | } | |
− | + | ||
− | + | ||
− | } | + | |
− | + | }); |
Версия 13:07, 26 августа 2022
/* * 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; } });