Участник:Mednik/common.js — различия между версиями

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
(старая версия)
(Полностью удалено содержимое страницы)
Строка 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;
 
}
 
 
});
 

Версия 13:08, 26 августа 2022