User:Hoo man/smart rollback.js
Appearance
From Meta, a Wikimedia project coordination wiki
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* * [[m:user:Hoo man]]; Version 3.2; 2022年10月15日; * Provides several useful functions for rollback (custom edit summary, mark as bot edits and mass revert) * Requires rollback permissions (and 'markbotedits' for the bot option) * Tested in IE and FF with vector and monobook, uses my (Hoo man) wiki tools (shared.js) * * DO NOT COPY AND PASTE, instead see https://meta.wikimedia.org/wiki/User:Hoo_man/Scripts/Smart_rollback */ /*global hoo, mw, smartRollbackConfig, disable_smart_rollback, confirm */ /*jshint forin:true, noarg:true, noempty:true, eqeqeq:true, bitwise:true, strict:false, undef:true, unused:true, curly:true, browser:true, jquery:true, indent:4, maxerr:50, loopfunc:true, white:false */ mw.loader.using(['mediawiki.util','jquery.ui','jquery.spinner','mediawiki.api'],function(){ "use strict"; varconfig={ // Default config enableMarkbotedits:null, watchPages:'nochange', oneClickBotLinks:false, availableLangs:['en','et','de','ja','ar'] }, lastSummary=false, $dialog; // Commit rollback functioncommitRollback(params,elem,done){ varapi=newmw.Api(); api.post(params) // Remove the rollback link(s) (the one click bot links as well) .done( function(){ $(elem) .parent() .parent() .find('.mw-rollback-link') .hide(); } ) // Always go on even if an error occurs .always(done); } // Delete a list of pages functionrollbackRevisions(rollbacks){ varrollback=rollbacks.shift(); commitRollback( rollback.params, rollback.elem, function(){ if(rollbacks.length){ rollbackRevisions(rollbacks); }else{ // Reload the page after the work is done window.location.reload(); } } ); } // Whether the user is in the given group functionisInGroup(group){ return($.inArray(group,mw.config.get('wgUserGroups'))!==-1); } // Whether the user is in the given global group functionisInGlobalGroup(group){ return(mw.config.exists('wgGlobalGroups')&&$.inArray(group,mw.config.get('wgGlobalGroups'))!==-1); } // This function shows an animation while changes are reverted functionshowProcess(selector){ var$loadSpinner=$.createSpinner() .addClass('smartRollback-spinner'); $(selector) .html($loadSpinner); } // Adding the toolbar link and creating the one click bot rollback links (if enabled) // Executed after i18n has been loaded functionmain(){ varhasRollbackLink=false, i; // Is there at least one rollback link on the page? varspans=mw.util.$content[0].getElementsByTagName('span'); for(i=0;i<spans.length;i++){ if(spans[i].className==='mw-rollback-link'){ hasRollbackLink=true; break; } } if(!hasRollbackLink){ return; } // There is a rollback link so we add a visible link hoo.addToolLink( mw.message('hoo-smartRollback-toolbarText').escaped(), openWindow, '', config.toolLinkMethod ); // Edit summaries if(typeofsmartRollbackConfig==='undefined'||typeofsmartRollbackConfig.editSummaries==='undefined'){ // smartRollbackConfig.editSummaries isn't set, so we take the default out of the lang file config.editSummaries=mw.messages.get('hoo-smartRollback-editSummaries'); }else{ config.editSummaries=smartRollbackConfig.editSummaries; } if(config.oneClickBotLinks){ $('.mw-rollback-link').each(function(){ var$rollbackLink=$(this); $rollbackLink.parent().append( $rollbackLink .clone() .addClass('mw-rollback-link-bot') ) .find('.mw-rollback-link-bot a') .attr('href',$rollbackLink.find('a').attr('href')+'&bot=true') .text($rollbackLink.find('a').text()+' (B)'); }); } } functionopenWindow(){ varhtml,i; html='<div id="smartRollbackDialog"><form name="smartRollbackForm" id="smartRollbackForm">'+ mw.message('hoo-smartRollback-editSummary').escaped()+'<br /><select name="editSummarySelect" style="width: 97%;">'+ '<option value="useDefault">'+mw.message('hoo-smartRollback-useDefault').escaped()+'</option>'; for(iinconfig.editSummaries){ if(typeofconfig.editSummaries[i]==='string'&&i!=='other'&&i!=='useDefault'){ // Filter out prototype functions and deprecated strings html+='<option value="'+config.editSummaries[i]+'">'+config.editSummaries[i]+'</option>'; } } html+='<option value="otherSummary" id="smartRollbackUseCustomEditSummary">'+mw.message('hoo-smartRollback-other').escaped()+'</option>'+ '</select><br />'+ '<small>'+mw.message('hoo-smartRollback-editSummaryInfo').escaped()+'</small><br /><br />'+ mw.message('hoo-smartRollback-customEditSummary').escaped()+'<br /><input name="editSummaryOther" id="smartRollbackEditSummaryOther" type="text" style="width: 97%;"><br /><br />'; if(config.enableMarkbotedits!==false&&(isInGroup('sysop')||isInGlobalGroup('Global_sysops')||isInGlobalGroup('Global_rollback')||isInGlobalGroup('steward')||config.enableMarkbotedits===true)){ html+=mw.message('hoo-smartRollback-markbotedits').escaped()+'<br /><label for="hoo-smartRollback-yes">'+mw.message('hoo-smartRollback-yes').escaped()+':</label><input type="radio" name="bot" value="true" id="hoo-smartRollback-yes">'+ '<label for="hoo-smartRollback-no">'+mw.message('hoo-smartRollback-no').escaped()+':</label><input type="radio" name="bot" value="false" id="hoo-smartRollback-no" checked>'; } html+='</form></div>'; if(!$dialog){ $dialog=$(html).dialog({ title:mw.message('hoo-smartRollback-windowTitle').escaped(), minWidth:515, minHeight:175, buttons:[ { text:mw.message('hoo-smartRollback-windowMassButton').escaped(), click:function(event){performAction('automatic',event.target);} }, { text:mw.message('hoo-smartRollback-windowButton').escaped(), click:function(){performAction('perHand');} }, { text:mw.message('hoo-smartRollback-closeButtonText').escaped(), click:function(){$(this).dialog('close');} } ] }); }else{ $dialog .html(html) .dialog("open"); } $('#smartRollbackEditSummaryOther').click(function(){ document.getElementById('smartRollbackUseCustomEditSummary').selected='true'; }); if(lastSummary&&lastSummary!=='useDefault'){ // Set the custom edit summary to the one previosly selected document.getElementById('smartRollbackEditSummaryOther').value=lastSummary; document.getElementById('smartRollbackUseCustomEditSummary').selected='true'; } } // Collect all rollback links on page and change them or submit them (depends on mode) // button: the element that triggered this function functionperformAction(mode,button){ varsmartRollbackForm=document.getElementById('smartRollbackForm'), rollbacks=[], revertSummary,i,y,params,parameters; // New edit summary varsummary=smartRollbackForm.editSummarySelect.value; if(summary==='otherSummary'){ summary=smartRollbackForm.editSummaryOther.value; } // Mark as bot edits? varbot='false'; if(smartRollbackForm.bot){ for(i=0;i<smartRollbackForm.bot.length;i++){ if(smartRollbackForm.bot[i].checked){ bot=smartRollbackForm.bot[i].value; } } } // Get all rollback links on page varlinks=document.getElementsByTagName('a'); for(i=0;i<links.length;i++){ if(links[i].parentNode.className==='mw-rollback-link'){ rollbacks.push(links[i]); } } /* jQuery alternative: $( '.mw-rollback-link a' ).each( function() { if ( !$(this).parent().hasClass( 'mw-rollback-link-bot' ) ) { rollbacks.push( $(this)[0] ); } } ); */ if(mode==='automatic'){ // Confirm the mass revert, if we have more than 1 rollback link if(rollbacks.length>1&&!confirm(mw.message('hoo-smartRollback-confirm').escaped())){ returnfalse; } // Substitute the button that was pressed with a spinner showProcess(button); } // Iterate over all links for(i=0;i<rollbacks.length;i++){ // The actual revert summary (replaces 1ドル with the name of the user which has been reverted) revertSummary=summary.replace(/\1ドル/g,mw.util.getParamValue('from',rollbacks[i].href)); // Remove old bot settings and summary rollbacks[i].href=rollbacks[i].href.replace('&bot=true','').replace(/&summary=[^&]*/,''); if(mode!=='automatic'){ if(summary!=='useDefault'){ rollbacks[i].href+='&summary='+encodeURIComponent(revertSummary); } if(bot!=='false'){ rollbacks[i].href+='&bot=true'; } }else{ // Auto rollback: Rewrite URI for the API parameters=rollbacks[i].href.substring(rollbacks[i].href.indexOf('?')+1); parameters=parameters.replace('&from=','&user='); parameters=parameters.split('&'); params=[]; for(y=0;y<parameters.length;y++){ params[parameters[y].split('=')[0]]=decodeURIComponent(parameters[y].split('=')[1].replace(/\+/g,' ')); } params.watchlist=config.watchPages; if(bot!=='false'){ params.markbot=true; } if(summary!=='useDefault'){ params.summary=revertSummary; } rollbacks[i]={ params:params, elem:rollbacks[i] }; } } if(mode==='automatic'){ rollbackRevisions(rollbacks); } // Save edit summary to make the user able to change it lastSummary=summary; $dialog.dialog('close'); } // Init code functioninit(){ varlang; if(typeofdisable_smart_rollback!=='undefined'&&disable_smart_rollback){ returnfalse; } if(typeofhoo==='undefined'){ returnfalse; } if(typeofsmartRollbackConfig!=='undefined'){ $.extend(true,config,smartRollbackConfig); } if(typeofconfig.toolLinkMethod==='undefined'){ config.toolLinkMethod=hoo.config.toolLinkMethod; } if(config.lang){ lang=config.lang; }else{ lang=hoo.config.lang; } // Localization if(lang!=='en'&&$.inArray(lang,config.availableLangs)!==-1){ // Load from meta $.ajax({ url:'//meta.wikimedia.org/w/index.php?title=User:Hoo_man/lang/'+lang+'/smart_rollback.js&action=raw&ctype=text/javascript', dataType:'script', cache:true }) .done(main); }else{ // English is already set main(); } } // Load the shared functions script if needed if(typeofhoo==='undefined'||typeofhoo.addToolLink==='undefined'){ $.ajax({ url:'//meta.wikimedia.org/w/index.php?title=User:Hoo_man/functions.js&action=raw&ctype=text/javascript', dataType:'script', cache:true }) .done( function(){ $(document).ready(init); } ); }else{ $(document).ready(init); } }); // Default lang mw.messages.set({ 'hoo-smartRollback-toolbarText':'Smart rollback', 'hoo-smartRollback-windowTitle':'Smart rollback', 'hoo-smartRollback-windowButton':'Update links', 'hoo-smartRollback-windowMassButton':'Revert everything', 'hoo-smartRollback-editSummary':'Edit summary:', 'hoo-smartRollback-editSummaryInfo':'(1ドル will be replaced with the user name of the reverted user)', 'hoo-smartRollback-customEditSummary':'Custom edit summary:', 'hoo-smartRollback-markbotedits':'Mark edits as bot edits:', 'hoo-smartRollback-confirm':'Do you really want to automatically rollback all pages?', 'hoo-smartRollback-yes':'Yes', 'hoo-smartRollback-no':'No', 'hoo-smartRollback-closeButtonText':'Close', 'hoo-smartRollback-useDefault':'Use the default edit summary', 'hoo-smartRollback-other':'Other ->', 'hoo-smartRollback-editSummaries':[ 'revert (vandalism)', 'revert (test edit)', 'revert' ] });