MediaWiki:Gadget-MassRollback-Core.js
/**
* [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;
const cfg = mw.config.get();
const groups = cfg.wgUserGroups || [];
const isRollbacker = groups.includes('rollbacker');
const isSysop = groups.includes('sysop');
if (!isSysop && !isRollbacker) return;
var rollbackSelectedButton = new OO.ui.ButtonWidget({
label: 'Kembalikan yang dipilih',
id: 'rollback-selected-button',
flags: ['progressive']
});
var rollbackAllButton = new OO.ui.ButtonWidget({
label: 'Kembalikan semua',
id: 'rollback-all-button',
flags: ['destructive']
});
function showNotice(message, title = 'MassRollback') {
var dialog = new OO.ui.MessageDialog();
var windowManager = new OO.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']
}
]
});
}
function finish(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');
var expanded = $(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);
function rollbackPage(pageTitle, summary, markbotFlag) {
const userName = mw.config.get('wgRelevantUserName');
const formattedSummary =
`Mengembalikan suntingan [[Istimewa:Kontribusi/${userName}|${userName}]] secara massal` +
(summary ? `: ${summary}` : '') +
` ([[WP:MassRollback|MassRollback]])`;
const markbot = markbotFlag === true;
const api = new mw.Api();
return api.postWithToken('rollback', {
action: 'rollback',
title: pageTitle,
user: userName,
summary: formattedSummary,
tags: 'MassRollback',
markbot: markbot
});
}
async function twoStepConfirm() {
return new Promise(resolve => {
var dialog = new OO.ui.MessageDialog();
var wm = new OO.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') {
var dialog2 = new OO.ui.MessageDialog();
var wm2 = new OO.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(async function (e) {
e.preventDefault();
const ok = await twoStepConfirm();
if (!ok) return;
e.preventDefault();
const summary = $('#rollback-summary').val();
const markbotFlag = isSysop ? true : false;
const selectedPages = {};
$('input.rollback-checkbox:checked').each(function () {
const p = $(this).data('title');
if (!selectedPages[p]) selectedPages[p] = true;
});
const userName = mw.config.get('wgRelevantUserName');
const pages = Object.keys(selectedPages);
if (!pages.length) return showNotice('⚠️\n\nTidak ada suntingan yang ditandai.');
Promise.allSettled(
pages.map(p => rollbackPage(p, summary, markbotFlag))
).then(results => {
const failures = 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(async function (e) {
e.preventDefault();
const ok = await twoStepConfirm();
if (!ok) return;
const summary = $('#rollback-summary').val();
const markbotFlag = isSysop ? true : false;
const userName = mw.config.get('wgRelevantUserName');
const api = new mw.Api();
api.get({
action: 'query',
list: 'usercontribs',
ucuser: userName,
uclimit: 'max',
ucprop: 'title',
format: 'json'
}).done(data => {
const titles = [...new Set(data.query.usercontribs.map(c => c.title))];
Promise.allSettled(
titles.map(t => rollbackPage(t, summary, markbotFlag))
).then(results => {
const failures = 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);
let title = $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);
});
}
});
Konten ini disalin dari wikipedia, mohon digunakan dengan bijak.


