MediaWiki:Common.js: Perbedaan antara revisi

Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
Baris 638: Baris 638:


/* ==========================================================
/* ==========================================================
   🛡️ MIPPEDIA EXCLUSIVE PROTECTION SYSTEM (STABLE)
   🛡️ MIPPEDIA AUTO-PROTECTION SYSTEM
   Fokus: Request Protect, Auto-Lock, & Notif Ke User
   Fitur: Request Protect, Auto-Lock, & Notif
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
Baris 646: Baris 646:
     var ns = mw.config.get('wgNamespaceNumber');
     var ns = mw.config.get('wgNamespaceNumber');
     var isAdmin = mw.config.get('wgUserGroups').includes('sysop');
     var isAdmin = mw.config.get('wgUserGroups').includes('sysop');
     var api = new mw.Api();
     var $content = $('#mw-content-text');


     // --- 1. SISI PENGGUNA: FORM OTOMATIS ---
     // --- 1. AUTO-FILL TEKS PERLINDUNGAN ---
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_prot_type')) {
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_protect_text')) {
         var type = sessionStorage.getItem('mippedia_prot_type');
         var savedText = sessionStorage.getItem('mippedia_protect_text');
         var dur = prompt("Berapa lama di lindungi? (contoh: 1 week, 1 month, atau infinite)", "infinite") || "infinite";
         $('#wpTextbox1').val(savedText + "\n\n**Alasan Perlindungan:** \n(Tulis alasan kenapa berkas ini perlu dikunci, boys!) \n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diajukan'''</div>\n\n--" + user);
       
         sessionStorage.removeItem('mippedia_protect_text');
        var template = "Halo Pengurus Mippedia,\n\nSaya memohon perlindungan berkas sebagai berikut:\n" +
                      "* **Jenis:** " + type + "\n" +
                      "* **Durasi:** " + dur + "\n" +
                      "* **Alasan:** (Tulis alasan lo di sini, boys!)\n\n" +
                      "<div class='mippedia-status'>'''Status: 🕒 Sedang diajukan'''</div>\n\n--" + user;
       
        $('#wpTextbox1').val(template);
         sessionStorage.removeItem('mippedia_prot_type');
     }
     }


     // --- 2. SISI HALAMAN BERKAS: TOMBOL DINAMIS ---
     // --- 2. TOMBOL MINTA PERLINDUNGAN (DI HALAMAN BERKAS) ---
     if (ns === 6) {
     if (ns === 6) {
         api.get({ action: 'query', prop: 'info', titles: pageName, inprop: 'protection' }).done(function(d) {
         // Cek apakah halaman sudah dilindungi (lewat indikator teks atau status API)
            var pg = d.query.pages[Object.keys(d.query.pages)[0]];
        if (!$content.text().includes("Dilindungi")) {
            var prot = pg.protection;
             var $protBtn = $('<button>').html('<span>🔒</span> Minta Perlindungan').css({
            var isFull = prot.some(x => x.level === 'sysop');
                 'background': '#d33', 'color': '#fff', 'border': 'none', 'padding': '5px 15px',  
            var isSemi = prot.some(x => x.level === 'autoconfirmed');
 
            if (isFull) return; // Full protection = Tombol Hilang
 
            var btnText = isSemi ? "🔒 Minta Peningkatan Perlindungan" : "🔒 Minta Perlindungan";
            var btnColor = isSemi ? "#ff4d4f" : "#d33";
 
             var $protBtn = $('<button>').html(btnText).css({
                 'background': btnColor, 'color': '#fff', 'border': 'none', 'padding': '5px 15px',  
                 'border-radius': '20px', 'font-size': '11px', 'font-weight': '800', 'cursor': 'pointer', 'margin': '10px 5px'
                 'border-radius': '20px', 'font-size': '11px', 'font-weight': '800', 'cursor': 'pointer', 'margin': '10px 5px'
             });
             });
             $protBtn.click(function() {
             $protBtn.click(function() {
                 if (!user) { window.location.href = mw.util.getUrl('Istimewa:Masuk_log', { returnto: pageName }); return; }
                 if (!user) { window.location.href = mw.util.getUrl('Istimewa:Masuk_log', { returnto: pageName }); return; }
                 sessionStorage.setItem('mippedia_prot_type', isSemi ? "Perlindungan Penuh" : "Semi Perlindungan");
                var talkPage = "Pembicaraan_Berkas:" + mw.config.get('wgTitle');
                 window.location.href = mw.util.getUrl("Pembicaraan_Berkas:" + mw.config.get('wgTitle'), { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' });
                 sessionStorage.setItem('mippedia_protect_text', "Halo Pengurus Mippedia,\n\nSaya memohon perlindungan (protection) untuk berkas [[:" + pageName + "]] guna menghindari penyalahgunaan.");
                 window.location.href = mw.util.getUrl(talkPage, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' });
             });
             });
 
             setTimeout(function() { $('#firstHeading').after($protBtn); }, 650);
             $('#firstHeading').after($protBtn);
         }
         });
     }
     }


     // --- 3. SISI ADMIN: EKSEKUSI OTOMATIS ---
     // --- 3. PANEL ADMIN PERLINDUNGAN (DI HALAMAN PEMBICARAAN) ---
     if (ns === 7 && isAdmin && $('#mw-content-text').text().includes("Sedang diajukan")) {
     if (ns === 7) {
        var api = new mw.Api();
         var filePage = pageName.replace('Pembicaraan_Berkas:', 'Berkas:');
         var filePage = pageName.replace('Pembicaraan_Berkas:', 'Berkas:');
          
         var isPending = $content.text().includes("Status: 🕒 Sedang diajukan");
        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user|content', rvlimit: 1 }).done(function(res) {
            var pg = res.query.pages[Object.keys(res.query.pages)[0]];
            var requester = pg.revisions[0].user;
            var content = pg.revisions[0]['*'];


            var $panel = $('<div style="background:#fff0f0; border:2px solid #d33; padding:15px; border-radius:12px; margin-bottom:20px;">' +
        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user', rvlimit: 1, rvdir: 'newer' }).done(function(data) {
                          '<b style="color:#d33;">🛡️ ADMIN PROTECTION CONTROL</b><br><small>User: '+requester+'</small></div>');
            var pages = data.query.pages;
           
             var requester = "";
            var $btnApprove = $('<button>').text('✅ SETUJUI & LOCK').css({'background':'#d33','color':'#fff','padding':'8px 15px','border':'none','cursor':'pointer','font-weight':'bold'});
            for (var id in pages) { requester = pages[id].revisions[0].user; }
             var $btnReject = $('<button>').text('❌ TOLAK').css({'background':'#555','color':'#fff','padding':'8px 15px','border':'none','cursor':'pointer','margin-left':'10px'});


             $btnApprove.click(function() {
             if (isAdmin && isPending && $content.text().includes("Permintaan Perlindungan")) {
                 $(this).prop('disabled', true).text('Locking System...');
                 var $panel = $('<div style="background:#fff0f0; border:2px solid #d33; padding:15px; border-radius:10px; margin:15px 0;">' +
                    '<div style="font-weight:bold; color:#d33; margin-bottom:10px;">🛡️ ADMIN PROTECTION CONTROL</div>' +
                    '<p style="font-size:11px;">Pilih tingkat perlindungan untuk berkas ini:</p></div>');
                  
                  
                 var level = content.includes("Perlindungan Penuh") ? "sysop" : "autoconfirmed";
                 var $btnSemi = $('<button>').text('SEMI-PROT').attr('title', 'Hanya user terdaftar').css({'background':'#faad14','color':'#fff','border':'none','padding':'8px 12px','margin-right':'8px','cursor':'pointer','font-weight':'bold'});
                 var dur = content.match(/Durasi:\s*(.*)/) ? content.match(/Durasi:\s*(.*)/)[1] : "infinite";
                 var $btnFull = $('<button>').text('FULL-PROT').attr('title', 'Hanya pengurus').css({'background':'#d33','color':'#fff','border':'none','padding':'8px 12px','margin-right':'8px','cursor':'pointer','font-weight':'bold'});
               
                var $btnReject = $('<button>').text('TOLAK').css({'background':'#555','color':'#fff','border':'none','padding':'8px 12px','cursor':'pointer'});
                // Urutan Eksekusi: Lock -> Update Teks Diskusi -> Kirim Pesan ke User
 
                api.postWithToken('csrf', {  
                // FUNGSI EKSEKUSI PROTEKSI
                    action: 'protect',  
                function executeProtect(level, levelName) {
                    title: filePage,  
                    var expiry = 'infinite';
                    protections: 'edit='+level+'|move='+level,  
                    var editRight = (level === 'sysop') ? 'sysop' : 'autoconfirmed';
                    expiry: dur,  
 
                    reason: 'Permintaan Perlindungan Disetujui'  
                    // STEP 1: PROTEKSI TEKNIS SISTEM
                }).then(function() {
                    api.postWithToken('csrf', {
                    return api.postWithToken('edit', {
                        action: 'protect',
                        action: 'edit',  
                        title: filePage,
                        title: pageName,  
                        protections: 'edit=' + editRight + '|move=' + editRight,
                        text: content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui & Dilindungi ("+level+")'''"),  
                        expiry: expiry,
                        summary: 'Update Status Perlindungan'  
                        reason: 'Permintaan disetujui: ' + levelName
                    }).done(function() {
                        // STEP 2: UPDATE TEKS STATUS
                        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) {
                            var content = res.query.pages[Object.keys(res.query.pages)[0]].revisions[0]['*'];
                            var newText = content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Dilindungi (" + levelName + ")'''");
                           
                            api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Status: Protection Granted' }).done(function() {
                                // STEP 3: NOTIF USER
                                var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan untuk [[:" + filePage + "]] telah '''DISETUJUI''' dengan tingkat '''" + levelName + "'''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.33 (UTC)";
                                api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() {
                                    location.reload();
                                });
                            });
                        });
                     });
                     });
                 }).then(function() {
                 }
                    var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permintaan perlindungan lo buat [[:" + filePage + "]] udah '''DISETUJUI''' dan berkas beneran udah gue kunci secara sistem. Aman, boys! --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.26 (UTC)";
                    return api.postWithToken('edit', {
                        action: 'edit',
                        title: "Pembicaraan_Pengguna:" + requester,
                        section: 'new',
                        text: msg,
                        summary: 'Notifikasi Perlindungan Berkas'
                    });
                }).done(function() {
                    location.reload();
                });
            });


            $btnReject.click(function() {
                $btnSemi.click(function() { executeProtect('autoconfirmed', 'Semi Perlindungan'); });
                var alasan = prompt("Alasan penolakan:");
                $btnFull.click(function() { executeProtect('sysop', 'Perlindungan Penuh'); });
                if (!alasan) return;
                $btnReject.click(function() {
                $(this).prop('disabled', true).text('Rejecting...');
                    var alasan = prompt("Alasan penolakan:");
 
                    if (!alasan) return;
                api.postWithToken('edit', {
                    api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) {
                    action: 'edit',
                        var content = res.query.pages[Object.keys(res.query.pages)[0]].revisions[0]['*'];
                    title: pageName,
                        var newText = content.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\n''Alasan: " + alasan + "''");
                    text: content.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\n''Alasan: " + alasan + "''"),  
                        api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Status: Protection Rejected' }).done(function() {
                    summary: 'Permintaan Perlindungan Ditolak'  
                            var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan untuk [[:" + filePage + "]] '''DITOLAK''' karena: ''" + alasan + "''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.33 (UTC)";
                }).then(function() {
                            api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() {
                    var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permintaan perlindungan lo buat [[:" + filePage + "]] '''DITOLAK''' karena: ''" + alasan + "''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.26 (UTC)";
                                location.reload();
                    return api.postWithToken('edit', {  
                            });
                        action: 'edit',  
                         });
                        title: "Pembicaraan_Pengguna:" + requester,  
                        section: 'new',  
                        text: msg,
                         summary: 'Notifikasi Penolakan Perlindungan'
                     });
                     });
                }).done(function() {
                    location.reload();
                 });
                 });
            });


            $panel.append($btnApprove, $btnReject);
                $panel.append($btnSemi, $btnFull, $btnReject);
            $('#mw-content-text').prepend($panel);
                $('#mw-content-text').prepend($panel);
            }
         });
         });
     }
     }
});
});