/** * [MASSROLLBACK — ROLLBACKERS HELPER SCRIPT] * * ⚠️ PERINGATAN: JANGAN MENGUBAH SKRIP INI TANPA * PERSETUJUAN PENGEMBANG MASSROLLBACK * * •==============================================• * > Pencipta: Janorovic Volkov * > Pengembang: Janorovic Volkov * > Tipe: JavaScript * * Lihat [[WP:MassRollback]] untuk informasi selengkapnya * tentang skrip ini * •==============================================• */ $(document).ready(function(){ if(mw.config.get('wgCanonicalSpecialPageName')!=='Contributions')return; constcfg=mw.config.get(); constgroups=cfg.wgUserGroups||[]; constisRollbacker=groups.includes('rollbacker'); constisSysop=groups.includes('sysop'); if(!isSysop&&!isRollbacker)return; varrollbackSelectedButton=newOO.ui.ButtonWidget({ label:'Kembalikan yang dipilih', id:'rollback-selected-button', flags:['progressive'] }); varrollbackAllButton=newOO.ui.ButtonWidget({ label:'Kembalikan semua', id:'rollback-all-button', flags:['destructive'] }); functionshowNotice(message,title='MassRollback'){ vardialog=newOO.ui.MessageDialog(); varwindowManager=newOO.ui.WindowManager(); $(document.body).append(windowManager.$element); windowManager.addWindows([dialog]); windowManager.openWindow(dialog,{ title:title, message:message, actions:[ { action:'accept', label:'OK', flags:['primary','progressive'] } ] }); } functionfinish(message){ showNotice(message); setTimeout(()=>location.reload(),500); $('input.rollback-checkbox').prop('checked',false); } if($('#rollback-box').length===0){ var$rollbackBox=$(` <div id="rollback-box" class="mw-htmlform-ooui-wrapper oo-ui-layout oo-ui-panelLayout oo-ui-panelLayout-padded oo-ui-panelLayout-framed"> <form id="rollback-form" class="mw-htmlform mw-htmlform-ooui oo-ui-layout oo-ui-formLayout"> <fieldset class="oo-ui-layout oo-ui-labelElement oo-ui-fieldsetLayout mw-collapsibleFieldsetLayout mw-collapsible mw-made-collapsible"> <legend role="button" class="oo-ui-fieldsetLayout-header mw-collapsible-toggle mw-collapsible-toggle-expanded" aria-expanded="true" tabindex="0"> <span class="oo-ui-labelElement-label">MassRollback</span> </legend> <div class="oo-ui-fieldsetLayout-group mw-collapsible-content" style="display: block;"> <div class="oo-ui-widget oo-ui-widget-enabled"> <label for="rollback-reason">Alasan pengembalian massal (opsional):</label> <select id="rollback-reason"> <option value="">-- Pilih alasan --</option> <option value="Suntingan uji coba">Suntingan uji coba</option> <option value="Vandalisme">Vandalisme</option> <option value="Spam">Spam</option> </select> <input type="text" id="rollback-summary" placeholder="Alasan kustom (opsional)" style="margin-top:10px;width:100%;padding:5px;"> </div> <div id="rollback-buttons" style="margin-top:10px;"></div> </div> </fieldset> </form> </div> `); $('#mw-content-text').prepend($rollbackBox); $('#rollback-reason').change(function(){ if(!$('#rollback-summary').val()){ $('#rollback-summary').val($(this).val()); } }); $('#rollback-box .mw-collapsible-toggle').click(function(){ var$content=$(this).closest('fieldset').find('.mw-collapsible-content'); varexpanded=$(this).attr('aria-expanded')==='true'; $(this).attr('aria-expanded',expanded?'false':'true'); expanded?$content.slideUp():$content.slideDown(); }); $('#rollback-buttons') .append(rollbackSelectedButton.$element) .append(rollbackAllButton.$element); functionrollbackPage(pageTitle,summary,markbotFlag){ constuserName=mw.config.get('wgRelevantUserName'); constformattedSummary= `Mengembalikan suntingan [[Istimewa:Kontribusi/${userName}|${userName}]] secara massal`+ (summary?`: ${summary}`:'')+ ` ([[WP:MassRollback|MassRollback]])`; constmarkbot=markbotFlag===true; constapi=newmw.Api(); returnapi.postWithToken('rollback',{ action:'rollback', title:pageTitle, user:userName, summary:formattedSummary, tags:'MassRollback', markbot:markbot }); } asyncfunctiontwoStepConfirm(){ returnnewPromise(resolve=>{ vardialog=newOO.ui.MessageDialog(); varwm=newOO.ui.WindowManager(); $(document.body).append(wm.$element); wm.addWindows([dialog]); wm.openWindow(dialog,{ title:"Peringatan MassRollback", message: `⚠️ Anda akan menjalankan pengembalian massal!\n\n`+ `MassRollback adalah tindakan berisiko tinggi yang dapat mengembalikan banyak suntingan sekaligus.\n\n`+ `Apakah Anda ingin melanjutkan?`, actions:[ {action:'cancel',label:'Batal',flags:['safe']}, {action:'continue',label:'Lanjutkan',flags:['destructive']} ] }).closed.then(data=>{ if(data&&data.action==='continue'){ vardialog2=newOO.ui.MessageDialog(); varwm2=newOO.ui.WindowManager(); $(document.body).append(wm2.$element); wm2.addWindows([dialog2]); wm2.openWindow(dialog2,{ title:"Peringatan MassRollback", message: `⛔ Konfirmasi terakhir!\n\n`+ `Anda akan menjalankan pemgembalian massal.\n`+ `Aksi ini TIDAK dapat dibatalkan.\n\n`+ `Anda YAKIN ingin melanjutkan?`, actions:[ {action:'cancel',label:'Tidak',flags:['safe']}, {action:'accept',label:'Ya, jalankan',flags:['destructive']} ] }).closed.then(result=>{ resolve(result&&result.action==='accept'); }); }else{ resolve(false); } }); }); } $('#rollback-selected-button').click(asyncfunction(e){ e.preventDefault(); constok=awaittwoStepConfirm(); if(!ok)return; e.preventDefault(); constsummary=$('#rollback-summary').val(); constmarkbotFlag=isSysop?true:false; constselectedPages={}; $('input.rollback-checkbox:checked').each(function(){ constp=$(this).data('title'); if(!selectedPages[p])selectedPages[p]=true; }); constuserName=mw.config.get('wgRelevantUserName'); constpages=Object.keys(selectedPages); if(!pages.length)returnshowNotice('⚠️\n\nTidak ada suntingan yang ditandai.'); Promise.allSettled( pages.map(p=>rollbackPage(p,summary,markbotFlag)) ).then(results=>{ constfailures=results.filter(r=>r.status==='rejected').length; if(failures===0){ finish(`🟢\n\nSemua suntingan ${userName} telah dikembalikan!`); }else{ finish(`🟡\n\nSebagian besar suntingan berhasil dikembalikan.\n${failures} halaman tidak dapat dikembalikan (normal, karena bukan revisi terakhir).`); } }); }); $('#rollback-all-button').click(asyncfunction(e){ e.preventDefault(); constok=awaittwoStepConfirm(); if(!ok)return; constsummary=$('#rollback-summary').val(); constmarkbotFlag=isSysop?true:false; constuserName=mw.config.get('wgRelevantUserName'); constapi=newmw.Api(); api.get({ action:'query', list:'usercontribs', ucuser:userName, uclimit:'max', ucprop:'title', format:'json' }).done(data=>{ consttitles=[...newSet(data.query.usercontribs.map(c=>c.title))]; Promise.allSettled( titles.map(t=>rollbackPage(t,summary,markbotFlag)) ).then(results=>{ constfailures=results.filter(r=>r.status==='rejected').length; if(failures===0){ finish(`🟢\n\nSemua suntingan ${userName} telah dikembalikan!`); }else{ finish(`🟡\n\nSebagian besar suntingan berhasil dikembalikan.\n${failures} halaman tidak dapat dikembalikan (normal, karena bukan revisi terakhir).`); } }); }); }); $('li[data-mw-revid]').each(function(){ const$li=$(this); lettitle=$li.find('.mw-contributions-title').text().trim(); if(!title)title=$li.find('a.mw-contributions-title').text().trim(); const$checkbox=$('<input type="checkbox" class="rollback-checkbox" style="margin-right:5px;">') .data('title',title); $li.prepend($checkbox); }); } });
MediaWiki:Gadget-MassRollback-Core.js
Konten disalin dari Wikipedia Bahasa Indonesia (lisensi CC BY-SA)
Lihat versi asli di Wikipedia