משתמש:מלא כל הארץ כבודי/common.js: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
סקריפט של גיא, מייבא לעת עתה לטיפול מהיר
 
החלפת הדף בתוכן "mw.loader.load("//he.wikipedia.org/w/index.php?title=מדיה_ויקי:סקריפטים/107.js&action=raw&ctype=text/javascript");//כלי לשחזור מהיר ש..."
תגית: החלפה
 
שורה 1:
mw.loader.load("//he.wikipedia.org/w/index.php?title=מדיה_ויקי:סקריפטים/107.js&action=raw&ctype=text/javascript");//כלי לשחזור מהיר של כלל העריכות
/**
*
* סקריפט זה מקל על הטיפול בטרולים ובמשחיתים.
* הוא מאפשר לשחזר את כל העריכות שביצע משתמש בלחיצת כפתור.
* למידע נוסף ולהוראות שימוש ראו:
* [[ויקיפדיה:סקריפטים/107.js/מידע]]
*
*
* This tool allows you to handle vandalism more easily.
*
* It adds a link on "Contribution" pages,
* that let you rollback all edits made by the user/IP address,
* delete all pages created by them, and block them – all in one operation.
*
* Written by: [[User:Guycn2]] (from he.wikipedia.org)
*
*
* Dependencies: mediawiki.util, mediawiki.api, jquery.ui.dialog
*
* If you export this script to your wiki, please include the above lines.
*
*/
 
if (
mw.config.get('wgCanonicalSpecialPageName') === 'Contributions' &&
mw.config.get('wgRelevantUserName') !== mw.config.get('wgUserName')
)
 
$.when(mw.loader.using(['mediawiki.util', 'mediawiki.api']), $.ready).then(function () {
'use strict';
var relevantUser = mw.config.get('wgRelevantUserName'),
api = new mw.Api(),
currentUserRights,
relevantUserGender,
isRelevantUserAnon = mw.util.isIPAddress(relevantUser),
queryLimit = 70,
latestEdits,
totalEdits,
createdPages,
totalPages,
isRollbackChecked = false,
isDeleteChecked = false,
isBlockChecked = false,
cleanerSummary,
blockOptions = [
{duration: '2hours', message: 'blockTwoHours', makeDefault: false},
{duration: '1day', message: 'blockOneDay', makeDefault: false},
{duration: '3days', message: 'blockThreeDays', makeDefault: 'anon'},
{duration: '1week', message: 'blockOneWeek', makeDefault: false},
{duration: '2weeks', message: 'blockTwoWeeks', makeDefault: false},
{duration: '1month', message: 'blockOneMonth', makeDefault: false},
{duration: '3months', message: 'blockThreeMonths', makeDefault: false},
{duration: '6months', message: 'blockSixMonths', makeDefault: false},
{duration: '1year', message: 'blockOneYear', makeDefault: false},
{duration: 'infinite', message: 'blockIndefinite', makeDefault: 'registered'}
],
blockDuration,
getBlockDuration = function () {
if ($('#block-duration-dropdown').val()) {
return {
duration: $('#block-duration-dropdown').val(),
message: null
};
}
else {
if (isRelevantUserAnon) {
for (var i = 0; i < blockOptions.length; i++) {
if (blockOptions[i].makeDefault === 'anon') {
return {
duration: blockOptions[i].duration,
message: blockOptions[i].message
};
}
}
}
else {
for (var j = 0; j < blockOptions.length; j++) {
if (blockOptions[j].makeDefault === 'registered') {
return {
duration: blockOptions[j].duration,
message: blockOptions[j].message
};
}
}
}
}
},
failedBlock = false,
editNumber = 0,
rollbackPercent = 0,
failedRollbacks = false,
pageNumber = 0,
deletePercent = 0,
failedDeletions = false;
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
)
) {
$('div#contentSub a:last').after(
$('<a>')
.text(i18n('contribsLinkText'))
.attr({
'id': 'vandal-cleaner-link',
'title': i18n('contribsLinkTooltip')
})
.on('click', initializeTool)
).after(' | ');
}
});
function i18n(key) {
switch (mw.config.get('wgUserLanguage')) {
default:
switch (key) {
case 'contribsLinkText': return 'Vandal Cleaner';
case 'contribsLinkTooltip': return 'Quickly undo all actions made by this ' + (isRelevantUserAnon ? 'IP address' : 'user');
case 'para1': return 'Welcome to Vandal Cleaner!';
case 'para2': return 'You can use this tool to quickly revert all actions made by this ' + (isRelevantUserAnon ? 'IP address' : 'user') + ' (' + relevantUser + ').';
case 'para3': return 'Please select the actions you want to do below.';
case 'rollbackLabel': return 'Rollback all edits';
case 'rollbackDesc': return 'Revert all edits made by this ' + (isRelevantUserAnon ? 'IP address' : 'user') + '.';
case 'cannotRollback': return 'Rollback right is required to perform this operation.';
case 'tooManyEdits': return 'Warning: This ' + (isRelevantUserAnon ? 'IP address' : 'user') + ' appears to have made more than ' + queryLimit.toString() + ' edits that haven\'t yet been reverted. For performance reasons and to avoid unconstructive usage, this tool will only rollback the latest ' + queryLimit.toString() + ' edits. If appropriate, you will be able to run Vandal Cleaner again after it has finished running.';
case 'deleteLabel': return 'Delete all pages';
case 'deleteDesc': return 'Delete all pages created by this ' + (isRelevantUserAnon ? 'IP address' : 'user') + '.';
case 'cannotDelete': return 'Delete right is required to perform this operation.';
case 'tooManyPages': return 'Warning: This ' + (isRelevantUserAnon ? 'IP address' : 'user') + ' appears to have created more than ' + queryLimit.toString() + ' pages that haven\'t yet been deleted. For performance reasons and to avoid unconstructive usage, this tool will only delete the latest ' + queryLimit.toString() + ' pages. If appropriate, you will be able to run Vandal Cleaner again after it has finished running.';
case 'blockLabel': return 'Block this ' + (isRelevantUserAnon ? 'IP address' : 'user');
case 'blockDesc': return 'Block ' + relevantUser + ' from editing. Account creation, sending email and editing own talk page will be blocked as well. Both registered and unregistered users using this IP address will be blocked.';
case 'blockDuration': return 'Block duration';
case 'changeBlockDuration': return 'change';
case 'cannotBlock': return 'Block right is required to perform this operation.';
case 'blockTwoHours': return '2 hours';
case 'blockOneDay': return '1 day';
case 'blockThreeDays': return '3 days';
case 'blockOneWeek': return '1 week';
case 'blockTwoWeeks': return '2 weeks';
case 'blockOneMonth': return '1 month';
case 'blockThreeMonths': return '3 months';
case 'blockSixMonths': return '6 months';
case 'blockOneYear': return '1 year';
case 'blockIndefinite': return 'indefinite';
case 'summaryInfo': return 'You may set an edit summary for all actions checked above. The default summary is "' + i18n('summaryValue') + '".';
case 'summaryPlaceholder': return 'Enter summary here';
case 'summaryValue': return window.vandalCleanerSummary || 'Vandalism';
case 'dialogTitle': return 'Vandal Cleaner';
case 'runCleaner': return 'Run cleaner';
case 'cancel': return 'Cancel';
case 'noActionSelected': return 'No action selected!';
case 'pleaseWait': return 'Please wait...';
case 'blocking': return 'Blocking ' + relevantUser;
case 'blockFailed': return 'Could not block ' + relevantUser + '. ' + (relevantUserGender === 'female' ? 'She' : (relevantUserGender === 'male' ? 'He' : 'They')) + ' may have already been blocked by someone else.';
case 'rollbacking': return 'Reverting edits made by ' + relevantUser;
case 'rollbackNoEdits': return 'Either ' + relevantUser + ' has not made any edit, or all edits have already been undone.';
case 'rollbackFailed': return 'Some edits could not be reverted. They may have already been undone or changed by someone else.';
case 'deleting': return 'Deleting pages created by ' + relevantUser;
case 'deleteNoPages': return 'Either ' + relevantUser + ' has not created any pages, or all pages have already been deleted.';
case 'deleteFailed': return 'Some pages could not be deleted. They may have already been deleted by someone else.';
case 'finishedRunning': return 'Vandal Cleaner has finished running.';
case 'failureWarning': return 'Some changes could not be performed. This is usually caused as a result of an edit conflict. It is highly recommended to check <a href="$link" target="_blank">the latest edits made by this ' + (isRelevantUserAnon ? 'IP address' : 'user') + '</a> in order to make sure there is no damage left.';
case 'para4': return 'Thank you for using this tool. Please make sure all actions were performed intentionally and correctly.';
case 'para5': return 'If you found any errors or malfunctions in this tool, please report them in the <a href="$link" target="_blank">appropriate talk page</a>.';
case 'para6': return 'Keep up your good job of protecting ' + mw.config.get('wgSiteName') + ' from vandalism!';
case 'para7': return 'To close this dialog, click the button below.';
case 'closeAndReload': return 'Close & reload';
}
break;
case 'he':
switch (key) {
case 'contribsLinkText': return 'טיפול מהיר בהשחתות';
case 'contribsLinkTooltip': return 'ביטול מיידי של כל הפעולות שנעשו על־ידי ' + (isRelevantUserAnon ? 'כתובת IP זו' : (relevantUserGender === 'female' ? 'משתמשת זו' : 'משתמש זה'));
case 'para1': return 'ברוך בואך לכלי הטיפול המהיר בהשחתות!';
case 'para2': return 'ניתן להשתמש בכלי זה כדי לבטל את כל הפעולות שנעשו על־ידי ' + (isRelevantUserAnon ? 'כתובת IP זו' : (relevantUserGender === 'female' ? 'משתמשת זו' : 'משתמש זה')) + ' (' + relevantUser + ') באופן מיידי.';
case 'para3': return 'נא לבחור את הפעולות שברצונך לעשות להלן.';
case 'rollbackLabel': return 'שחזור כל העריכות';
case 'rollbackDesc': return 'שחזור כל העריכות שנעשו על־ידי ' + (isRelevantUserAnon ? 'כתובת IP זו' : (relevantUserGender === 'female' ? 'משתמשת זו' : 'משתמש זה')) + '.';
case 'cannotRollback': return 'נדרשת הרשאת שחזור מהיר כדי לבצע פעולה זו.';
case 'tooManyEdits': return 'אזהרה: נראה ' + (isRelevantUserAnon ? 'שנעשו מכתובת IP זו' : (relevantUserGender === 'female' ? 'שמשתמשת זו ביצעה' : 'שמשתמש זה ביצע')) + ' יותר מ־' + queryLimit.toString() + ' עריכות שעדיין לא שוחזרו. מסיבות של ביצועים וכדי למנוע שימוש בלתי־יעיל, הכלי הזה ישחזר רק את ' + queryLimit.toString() + ' העריכות האחרונות. במידת הצורך, ניתן יהיה להפעיל את הכלי מחדש לאחר סיום פעולתו.';
case 'deleteLabel': return 'מחיקת כל הדפים';
case 'deleteDesc': return 'מחיקת כל הדפים שנוצרו על־ידי ' + (isRelevantUserAnon ? 'כתובת IP זו' : (relevantUserGender === 'female' ? 'משתמשת זו' : 'משתמש זה')) + '.';
case 'cannotDelete': return 'נדרשת הרשאת מחיקה כדי לבצע פעולה זו.';
case 'tooManyPages': return 'אזהרה: נראה ' + (isRelevantUserAnon ? 'שנוצרו מכתובת IP זו' : (relevantUserGender === 'female' ? 'שמשתמשת זו יצרה' : 'שמשתמש זה יצר')) + ' יותר מ־' + queryLimit.toString() + ' דפים שעדיין לא נמחקו. מסיבות של ביצועים וכדי למנוע שימוש בלתי־יעיל, הכלי הזה ימחק רק את ' + queryLimit.toString() + ' הדפים האחרונים. במידת הצורך, ניתן יהיה להפעיל את הכלי מחדש לאחר סיום פעולתו.';
case 'blockLabel': return 'חסימת ' + (isRelevantUserAnon ? 'כתובת IP זו' : (relevantUserGender === 'female' ? 'משתמשת זו' : 'משתמש זה'));
case 'blockDesc': return 'חסימת ' + relevantUser + ' מעריכה. יצירת חשבונות, שליחת דוא"ל ועריכת דף השיחה האישי תיחסמנה גם הן. גם משתמשים רשומים וגם משתמשים אנונימיים המשתמשים בכתובת IP זו ייחסמו.';
case 'blockDuration': return 'משך החסימה';
case 'changeBlockDuration': return 'שינוי';
case 'cannotBlock': return 'נדרשת הרשאת חסימה כדי לבצע פעולה זו.';
case 'blockTwoHours': return 'שעתיים';
case 'blockOneDay': return 'יום';
case 'blockThreeDays': return 'שלושה ימים';
case 'blockOneWeek': return 'שבוע';
case 'blockTwoWeeks': return 'שבועיים';
case 'blockOneMonth': return 'חודש';
case 'blockThreeMonths': return 'שלושה חודשים';
case 'blockSixMonths': return 'שישה חודשים';
case 'blockOneYear': return 'שנה';
case 'blockIndefinite': return 'זמן בלתי מוגבל';
case 'summaryInfo': return 'באפשרותך להזין תקציר עריכה עבור כל הפעולות המסומנות למעלה. תקציר ברירת המחדל הוא "' + i18n('summaryValue') + '".';
case 'summaryPlaceholder': return 'יש להזין את התקציר כאן';
case 'summaryValue': return window.vandalCleanerSummary || 'טרול';
case 'dialogTitle': return 'טיפול מהיר בהשחתות';
case 'runCleaner': return 'הפעלת הכלי';
case 'cancel': return 'ביטול';
case 'noActionSelected': return 'לא נבחרו פעולות!';
case 'pleaseWait': return 'נא להמתין...';
case 'blocking': return 'חסימת ' + relevantUser;
case 'blockFailed': return 'לא ניתן היה לחסום את ' + relevantUser + '. ייתכן ' + (relevantUserGender === 'female' ? 'שהיא כבר נחסמה' : 'שהוא כבר נחסם') + ' על־ידי מישהו אחר.';
case 'rollbacking': return 'שחזור העריכות שנעשו על־ידי ' + relevantUser;
case 'rollbackNoEdits': return 'נראה ש־' + relevantUser + ' לא ' + (relevantUserGender === 'female' ? 'ביצעה' : 'ביצע') + ' שום עריכה, או שכל העריכות כבר שוחזרו.';
case 'rollbackFailed': return 'לא ניתן היה לשחזר עריכות מסוימות. ייתכן שהן כבר שוחזרו או שונו על־ידי מישהו אחר.';
case 'deleting': return 'מחיקת דפים שנוצרו על־ידי ' + relevantUser;
case 'deleteNoPages': return 'נראה ש־' + relevantUser + ' לא ' + (relevantUserGender === 'female' ? 'יצרה' : 'יצר') + ' שום דף, או שכל הדפים כבר נמחקו.';
case 'deleteFailed': return 'לא ניתן היה למחוק דפים מסוימים. ייתכן שהם כבר נמחקו על־ידי מישהו אחר.';
case 'finishedRunning': return 'כלי הטיפול המהיר בהשחתות סיים לבצע את הפעולות.';
case 'failureWarning': return 'לא ניתן היה לבצע פעולות מסוימות. הדבר נגרם בדרך־כלל כתוצאה מהתנגשות עריכה. מומלץ מאוד לבדוק את <a href="$link" target="_blank">העריכות האחרונות שנעשו על־ידי ' + (isRelevantUserAnon ? 'כתובת IP זו' : (relevantUserGender === 'female' ? 'משתמשת זו' : 'משתמש זה')) + '</a> כדי לוודא שלא נותר נזק.';
case 'para4': return 'תודה שהשתמשת בכלי זה. נא לוודא שכל הפעולות בוצעו במכוון ובאופן תקין.';
case 'para5': return 'אם מצאת שגיאות או תקלות כלשהן בכלי זה, נא לדווח עליהן ב<a href="$link" target="_blank">דף השיחה של הסקריפט</a>.';
case 'para6': return 'ישר כוח על עבודתך בהגנה על ' + mw.config.get('wgSiteName') + ' מפני השחתות!';
case 'para7': return 'כדי לסגור את תיבת הדו־שיח הזו, יש ללחוץ על הכפתור שלהלן.';
case 'closeAndReload': return 'סגירה ורענון';
}
}
return key;
}
function initializeTool() {
if (!$('#vandal-cleaner-dialog1').length) {
mw.util.$content.append($('<div>', {
id: 'loading-cover',
css: {
'position': 'fixed',
'top': '0',
'right': '0',
'opacity': '.4',
'background-color': '#aaa',
'z-index': '10',
'width': '100%',
'height': '100%',
'display': 'none'
}
})).append($('<img>', {
id: 'loading-img',
src: '//upload.wikimedia.org/wikipedia/commons/1/14/Ajax-loader_bert2_blue-white.gif',
css: {
'position': 'fixed',
'top': '50%',
'right': '50%',
'width': '200px',
'display': 'none'
}
}));
$('#loading-cover, #loading-img').fadeIn('fast');
api.get({
list: 'usercontribs',
ucuser: relevantUser,
ucprop: 'title',
ucshow: 'top|!new',
uclimit: queryLimit
}).done(function (firstQuery) {
latestEdits = firstQuery.query.usercontribs,
totalEdits = latestEdits.length;
api.get({
list: 'usercontribs',
ucuser: relevantUser,
ucprop: 'title',
ucshow: 'new',
uclimit: queryLimit
}).done(function (secondQuery) {
createdPages = secondQuery.query.usercontribs,
totalPages = createdPages.length;
$.when(mw.loader.using('jquery.ui.dialog', createDialog)).done(function () {
$('#loading-cover, #loading-img').remove();
});
});
});
}
else {
console.log('Vandal Cleaner dialog is already open.');
}
}
function createDialog() {
var solidSeparator = '<div style="border: .3px solid lightgray; width: 100%; margin-bottom: 5px; margin-top: 4px;"></div>',
dashedSeparator = '<div style="border: .4px dashed lightgray; width: 100%; margin-bottom: 5px; margin-top: 4px;"></div>',
para1 = '<p>' + i18n('para1') + '</p>',
para2 = '<p>' + i18n('para2') + '</p>',
para3 = '<p>' + i18n('para3') + '</p>',
rollback = createCheckbox(
'rollback',
i18n('rollbackLabel'),
i18n('rollbackDesc') + '<br>' +
'<strong style="color: darkred;">' + (currentUserRights.indexOf('rollback') < 0 ? i18n('cannotRollback') : (totalEdits >= queryLimit ? i18n('tooManyEdits') : '')) + '</strong>'
),
massDelete = createCheckbox(
'delete',
i18n('deleteLabel'),
i18n('deleteDesc') + '<br>' +
'<strong style="color: darkred;">' + (currentUserRights.indexOf('delete') < 0 ? i18n('cannotDelete') : (totalPages >= queryLimit ? i18n('tooManyPages') : '')) + '</strong>'
),
block = createCheckbox(
'block',
i18n('blockLabel'),
i18n('blockDesc') + '<br>' +
(currentUserRights.indexOf('block') < 0
? '<strong style="color: darkred;">' + i18n('cannotBlock') + '</strong>'
: '<span id="block-duration-container" style="color: #4d4d4d;"><strong>' + i18n('blockDuration') + '</strong>: <span id="block-duration">' + i18n(getBlockDuration().message) + ' (<a>' + i18n('changeBlockDuration') + '</a>)' + '</span></span>'
)
),
summary = '<p>' + i18n('summaryInfo') + '</p>' +
'<input type="text" id="vandal-cleaner-summary" style="width: 70%;" placeholder="' + i18n('summaryPlaceholder') + '" value="' + i18n('summaryValue') + '" maxlength="500">',
htmlForm = para1 + para2 + para3 + solidSeparator + rollback + dashedSeparator + massDelete + dashedSeparator + block + solidSeparator + summary;
$('<div>', {id: 'vandal-cleaner-dialog1', html: htmlForm}).dialog({
title: i18n('dialogTitle'),
resizable: false,
width: (window.orientation === 90 || window.orientation === -90) ? '640px' : '480px',
open: function () {
$('#block-duration-container').hide();
if (currentUserRights.indexOf('rollback') < 0) {
$('#rollback-cbx').attr('disabled', true);
$('label[for="rollback-cbx"]').css('color', 'grey');
}
else {
$('#rollback-cbx').attr('checked', true);
}
if (currentUserRights.indexOf('delete') < 0) {
$('#delete-cbx').attr('disabled', true);
$('label[for="delete-cbx"]').css('color', 'grey');
}
else {
$('#delete-cbx').attr('checked', true);
}
if (currentUserRights.indexOf('block') < 0) {
$('#block-cbx').attr('disabled', true);
$('label[for="block-cbx"]').css('color', 'grey');
}
else {
$('#block-cbx').attr('checked', true);
$('#block-duration a').on('click', function () {
$('#block-duration').html($('<select>', {id: 'block-duration-dropdown'}));
for (var k = 0; k < blockOptions.length; k++) {
$('#block-duration-dropdown').append(
$('<option>')
.attr('value', blockOptions[k].duration)
.text(i18n(blockOptions[k].message))
);
if (blockOptions[k].makeDefault === 'anon' && isRelevantUserAnon) {
$('option[value="' + blockOptions[k].duration + '"]')
.attr('selected', true);
}
else if (blockOptions[k].makeDefault === 'registered' && !isRelevantUserAnon) {
$('option[value="' + blockOptions[k].duration + '"]')
.attr('selected', true);
}
}
});
$('#block-duration-container').show();
$('#block-cbx').on('change', function () {
$('#block-duration-container').toggle();
});
}
if (typeof window.orientation === 'undefined') {
$('#vandal-cleaner-summary').focus();
}
},
close: function () {
$(this).remove();
},
buttons: [
{
text: i18n('runCleaner'),
css: {'font-weight': 'bold'},
click: runCleaner
},
{
text: i18n('cancel'),
click: function () {
$(this).dialog('close');
}
}
]
}).on('keypress', function (event) {
if (event.which === 13) {
runCleaner();
}
});
}
function createCheckbox(action, title, description) {
return '<table><tr><td rowspan="2" style="vertical-align: top;">' +
'<input type="checkbox" id="' + action + '-cbx">' +
'</td><td>' +
'<label for="' + action + '-cbx" style="font-weight: bold;">' + title + '</label>' +
'</td></tr><tr><td style="font-size: 85%; color: grey;">' +
description +
'</td></tr></table>';
}
function runCleaner() {
isRollbackChecked = $('#rollback-cbx').prop('checked'),
isDeleteChecked = $('#delete-cbx').prop('checked'),
isBlockChecked = $('#block-cbx').prop('checked'),
cleanerSummary = $('#vandal-cleaner-summary').val(),
blockDuration = getBlockDuration().duration;
if (isBlockChecked || isRollbackChecked || isDeleteChecked) {
var pleaseWait = '<h5>' + i18n('pleaseWait') + '</h5>',
statusImg = '<img src="//upload.wikimedia.org/wikipedia/commons/7/7a/Ajax_loader_metal_512.gif" style="width: 17px;">',
infoImg = '<img src="//upload.wikimedia.org/wikipedia/commons/e/e1/Info.svg" style="width: 14px;">',
warningImg = '<img src="//upload.wikimedia.org/wikipedia/commons/3/3b/OOjs_UI_icon_alert-warning.svg" style="width: 14px;">',
blocking = '<p id="block-status">' + statusImg + i18n('blocking') + ' <span style="font-weight: normal;">... (<span id="block-percent" style="unicode-bidi: isolate;">0%</span>)' + '</span></p>',
blockFail = '<p id="block-fail">' + warningImg + i18n('blockFailed') + '</p>',
rollbacking = '<p id="rollback-status">' + statusImg + i18n('rollbacking') + ' <span style="font-weight: normal;">... (<span id="rollback-percent" style="unicode-bidi: isolate;">0%</span>)' + '</span></p>',
rollbackNoEdits = '<p id="rollback-no-edits">' + infoImg + i18n('rollbackNoEdits') + '</p>',
rollbackFail = '<p id="rollback-fail">' + warningImg + i18n('rollbackFailed') + '</p>',
deleting = '<p id="delete-status">' + statusImg + i18n('deleting') + ' <span style="font-weight: normal;">... (<span id="delete-percent" style="unicode-bidi: isolate;">0%</span>)' + '</span></p>',
deleteNoPages = '<p id="delete-no-pages">' + infoImg + i18n('deleteNoPages') + '</p>',
deleteFail = '<p id="delete-fail">' + warningImg + i18n('deleteFailed') + '</p>',
htmlContent = pleaseWait + blocking + blockFail + rollbacking + rollbackNoEdits + rollbackFail + deleting + deleteNoPages + deleteFail;
$('#vandal-cleaner-dialog1').html(htmlContent).css('cursor', 'wait').dialog({
buttons: [],
close: function () {
window.location.reload();
}
}).find('p').hide().find('img').css('margin', '6px');
if (isBlockChecked) {
hermeticBlock();
}
else if (isRollbackChecked) {
massRollback();
}
else if (isDeleteChecked) {
massDelete();
}
}
else {
alert(i18n('noActionSelected'));
}
}
function hermeticBlock() {
$('#block-status').css('font-weight', 'bold').fadeIn();
api.postWithToken('csrf', {
action: 'block',
user: relevantUser,
expiry: blockDuration,
nocreate: true,
autoblock: true,
noemail: true,
reblock: true,
reason: cleanerSummary
//tags: 'VandalCleaner'
}).done(function () {
$('#block-percent').text('100%');
$('#block-status').css('font-weight', 'normal')
.find('img').attr('src', '//upload.wikimedia.org/wikipedia/commons/8/8f/Checkmark.svg');
setTimeout(function () {
moveOn('block');
}, 800);
}).fail(function () {
$('#block-status').hide();
$('#block-fail').show();
failedBlock = true;
setTimeout(function () {
moveOn('block');
}, 800);
});
}
function massRollback() {
if (totalEdits === 0) {
$('#rollback-no-edits').show();
}
if (editNumber < totalEdits) {
if (editNumber === 0) {
$('#rollback-status').css('font-weight', 'bold').fadeIn();
}
api.postWithToken('rollback', {
action: 'rollback',
title: latestEdits[editNumber].title,
user: relevantUser,
summary: cleanerSummary
//tags: 'VandalCleaner'
}).done(function () {
moveOn('rollback');
}).fail(function () {
failedRollbacks = true;
moveOn('rollback');
});
}
else {
$('#rollback-status').css('font-weight', 'normal')
.find('img').attr('src', '//upload.wikimedia.org/wikipedia/commons/8/8f/Checkmark.svg');
if (failedRollbacks) {
$('#rollback-fail').show();
}
setTimeout(function () {
if (isDeleteChecked) {
massDelete();
}
else {
setTimeout(allDone, 1000);
}
}, 800);
}
}
function massDelete() {
if (totalPages === 0) {
$('#delete-no-pages').show();
}
if (pageNumber < totalPages) {
if (pageNumber === 0) {
$('#delete-status').css('font-weight', 'bold').fadeIn();
}
api.postWithToken('csrf', {
action: 'delete',
title: createdPages[pageNumber].title,
reason: cleanerSummary
//tags: 'VandalCleaner'
}).done(function () {
moveOn('delete');
}).fail(function () {
failedDeletions = true;
moveOn('delete');
});
}
else {
$('#delete-status').css('font-weight', 'normal')
.find('img').attr('src', '//upload.wikimedia.org/wikipedia/commons/8/8f/Checkmark.svg');
if (failedDeletions) {
$('#delete-fail').show();
}
setTimeout(allDone, 1800);
}
}
function moveOn(currentAction) {
switch (currentAction) {
case 'block':
if (isRollbackChecked) {
massRollback();
}
else if (isDeleteChecked) {
massDelete();
}
else {
setTimeout(allDone, 1000);
}
break;
case 'rollback':
editNumber++;
rollbackPercent = editNumber / totalEdits * 100;
$('#rollback-percent').text(rollbackPercent.toFixed(0) + '%');
if (currentUserRights.indexOf('noratelimit') < 0 && totalEdits > 10) {
// If we don't have the "noratelimit" right, and the vandal has made more than 10 edits, then we need to act more slowly; otherwise our rollback might be throttled!
if (editNumber >= 1 && editNumber <= Math.floor((totalEdits - 1) / 10) * 10 + 1) {
setTimeout(massRollback, 6000); // Rollback every 6 seconds (this is the fastest possible rate)
}
else {
setTimeout(massRollback, 700); // We have less than 10 edits left, so we can now do it more quickly
}
}
else {
setTimeout(massRollback, 700); // Either we have the "noratelimit" right and/or the vandal has made <=10 edits, so we can rollback all edits quickly
}
break;
case 'delete':
pageNumber++;
deletePercent = pageNumber / totalPages * 100;
$('#delete-percent').text(deletePercent.toFixed(0) + '%');
setTimeout(massDelete, 700);
}
}
function allDone() {
$('#vandal-cleaner-dialog1').remove();
setTimeout(function () {
$('<div>', {id: 'vandal-cleaner-dialog2', html:
'<img src="//upload.wikimedia.org/wikipedia/commons/c/ce/Emoji_u1f44d.svg" style="opacity: .8;">' +
'<h6 style="color: green;">' + i18n('finishedRunning') + '</h6>' +
((failedBlock || failedRollbacks || failedDeletions)
? '<p class="warning" style="font-size: .8em;">' +
i18n('failureWarning')
.replace('$link', mw.util.getUrl('Special:Contributions', {target: relevantUser, topOnly: '1'})) +
'</p>'
: '') +
'<p>' + i18n('para4') + '</p>' +
'<p>' + i18n('para5').replace('$link', '//he.wikipedia.org/wiki/שיחת_מדיה_ויקי:סקריפטים/107.js') + '</p>' +
'<p>' + i18n('para6') + '</p>' +
'<p>' + i18n('para7') + '</p>'
}).dialog({
title: i18n('dialogTitle'),
resizable: false,
width: '520px',
modal: true,
show: {
effect: 'fade',
duration: 300
},
open: function () {
mw.util.addCSS(
'.rtl #vandal-cleaner-dialog2 img { float: left; }' +
'.ltr #vandal-cleaner-dialog2 img { float: right; }'
);
$('#closeAndReload-btn').focus();
},
close: function () {
window.location.reload();
},
buttons: [
{
text: i18n('closeAndReload'),
id: 'closeAndReload-btn',
click: function () {
$(this).dialog('close');
}
}
]
});
}, 400);
}
});