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.

×
Advertisement