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 ULTIMATE AUTOMATION v9.0 (STABLE)
   🛡️ MIPPEDIA EXCLUSIVE PROTECTION SYSTEM (STABLE)
   Sistem Verifikasi & Perlindungan Terpadu
   Fokus: Request Protect, Auto-Lock, & Notif Ke User
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
Baris 648: Baris 648:
     var api = new mw.Api();
     var api = new mw.Api();


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


     // --- 2. TOMBOL DI HALAMAN BERKAS ---
     // --- 2. SISI HALAMAN BERKAS: TOMBOL DINAMIS ---
     if (ns === 6) {
     if (ns === 6) {
         api.get({ action: 'query', prop: 'info', titles: pageName, inprop: 'protection' }).done(function(d) {
         api.get({ action: 'query', prop: 'info', titles: pageName, inprop: 'protection' }).done(function(d) {
             var p = d.query.pages[Object.keys(d.query.pages)[0]];
             var pg = d.query.pages[Object.keys(d.query.pages)[0]];
            var isOfficial = $('#mw-content-text').text().includes("Aset Resmi");
             var prot = pg.protection;
             var prot = p.protection;
             var isFull = prot.some(x => x.level === 'sysop');
             var isFull = prot.some(x => x.level === 'sysop');
             var isSemi = prot.some(x => x.level === 'autoconfirmed');
             var isSemi = prot.some(x => x.level === 'autoconfirmed');


             // Tombol Verifikasi
             if (isFull) return; // Full protection = Tombol Hilang
             if (!isOfficial) {
 
                var $vBtn = $('<button>').html('📩 Minta Verifikasi').css({'background':'#36c','color':'#fff','border':'none','padding':'5px 12px','border-radius':'20px','cursor':'pointer','margin-right':'5px'});
             var btnText = isSemi ? "🔒 Minta Peningkatan Perlindungan" : "🔒 Minta Perlindungan";
                $vBtn.click(function() {
            var btnColor = isSemi ? "#ff4d4f" : "#d33";
                    sessionStorage.setItem('mippedia_req_text', "Halo Pengurus, mohon verifikasi berkas [[:" + pageName + "]] ini.");
 
                    window.location.href = mw.util.getUrl("Pembicaraan_Berkas:" + mw.config.get('wgTitle'), { action: 'edit', section: 'new', preloadtitle: 'Permintaan Verifikasi Berkas' });
            var $protBtn = $('<button>').html(btnText).css({
                });
                'background': btnColor, 'color': '#fff', 'border': 'none', 'padding': '5px 15px',  
                $('#firstHeading').after($vBtn);
                'border-radius': '20px', 'font-size': '11px', 'font-weight': '800', 'cursor': 'pointer', 'margin': '10px 5px'
            }
            });
 
            $protBtn.click(function() {
                if (!user) { window.location.href = mw.util.getUrl('Istimewa:Masuk_log', { returnto: pageName }); return; }
                sessionStorage.setItem('mippedia_prot_type', isSemi ? "Perlindungan Penuh" : "Semi Perlindungan");
                window.location.href = mw.util.getUrl("Pembicaraan_Berkas:" + mw.config.get('wgTitle'), { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' });
            });


             // Tombol Proteksi
             $('#firstHeading').after($protBtn);
            if (!isFull) {
                var txt = isSemi ? "🔒 Tingkatkan Proteksi" : "🔒 Minta Proteksi";
                var $pBtn = $('<button>').html(txt).css({'background':'#d33','color':'#fff','border':'none','padding':'5px 12px','border-radius':'20px','cursor':'pointer'});
                $pBtn.click(function() {
                    sessionStorage.setItem('mippedia_prot_type', isSemi ? "Perlindungan Penuh" : "Semi Perlindungan");
                    window.location.href = mw.util.getUrl("Pembicaraan_Berkas:" + mw.config.get('wgTitle'), { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' });
                });
                $('#firstHeading').after($pBtn);
            }
         });
         });
     }
     }


     // --- 3. PANEL ADMIN (HALAMAN PEMBICARAAN) ---
     // --- 3. SISI ADMIN: EKSEKUSI OTOMATIS ---
     if (ns === 7 && isAdmin && $('#mw-content-text').text().includes("Sedang diajukan")) {
     if (ns === 7 && isAdmin && $('#mw-content-text').text().includes("Sedang diajukan")) {
         var filePage = pageName.replace('Pembicaraan_Berkas:', 'Berkas:');
         var filePage = pageName.replace('Pembicaraan_Berkas:', 'Berkas:');
Baris 703: Baris 700:
             var content = pg.revisions[0]['*'];
             var content = pg.revisions[0]['*'];


            var isProtectReq = content.includes("Perlindungan");
             var $panel = $('<div style="background:#fff0f0; border:2px solid #d33; padding:15px; border-radius:12px; margin-bottom:20px;">' +
            var color = isProtectReq ? "#fff0f0" : "#f0f5ff";
                           '<b style="color:#d33;">🛡️ ADMIN PROTECTION CONTROL</b><br><small>User: '+requester+'</small></div>');
            var border = isProtectReq ? "#d33" : "#36c";
 
             var $panel = $('<div style="background:'+color+'; border:2px solid '+border+'; padding:15px; border-radius:10px; margin-bottom:10px;">' +
                           '<b>🛡️ MIPPEDIA ADMIN CONTROL</b><br><small>Target: '+requester+'</small><br></div>');
              
              
             var $btnOk = $('<button>').text('✅ SETUJUI').css({'background':'#00af89','color':'#fff','padding':'5px 10px','border':'none','cursor':'pointer','margin-top':'10px'});
             var $btnApprove = $('<button>').text('✅ SETUJUI & LOCK').css({'background':'#d33','color':'#fff','padding':'8px 15px','border':'none','cursor':'pointer','font-weight':'bold'});
             var $btnNo = $('<button>').text('❌ TOLAK').css({'background':'#d33','color':'#fff','padding':'5px 10px','border':'none','cursor':'pointer','margin-left':'5px'});
             var $btnReject = $('<button>').text('❌ TOLAK').css({'background':'#555','color':'#fff','padding':'8px 15px','border':'none','cursor':'pointer','margin-left':'10px'});


             $btnOk.click(function() {
             $btnApprove.click(function() {
                 $(this).prop('disabled', true).text('Processing...');
                 $(this).prop('disabled', true).text('Locking System...');
                  
                  
                 if (isProtectReq) {
                 var level = content.includes("Perlindungan Penuh") ? "sysop" : "autoconfirmed";
                    // LOGIKA PROTEKSI
                var dur = content.match(/Durasi:\s*(.*)/) ? content.match(/Durasi:\s*(.*)/)[1] : "infinite";
                    var level = content.includes("Perlindungan Penuh") ? "sysop" : "autoconfirmed";
               
                    var dur = content.match(/Durasi:\s*(.*)/) ? content.match(/Durasi:\s*(.*)/)[1] : "infinite";
                // Urutan Eksekusi: Lock -> Update Teks Diskusi -> Kirim Pesan ke User
                   
                api.postWithToken('csrf', {  
                    api.postWithToken('csrf', { action: 'protect', title: filePage, protections: 'edit='+level+'|move='+level, expiry: dur, reason: 'Request approved' })
                    action: 'protect',  
                    .then(function() { return api.postWithToken('edit', { action: 'edit', title: pageName, text: content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui & Dilindungi'''"), summary: 'Status Update' }); })
                    title: filePage,  
                    .then(function() { return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: "== Notifikasi ==\nPermintaan proteksi lo buat [[:"+filePage+"]] udah beres, boys! --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.19 (UTC)", summary: 'Notif' }); })
                    protections: 'edit='+level+'|move='+level,  
                    .done(function() { location.reload(); });
                    expiry: dur,  
                } else {
                    reason: 'Permintaan Perlindungan Disetujui'  
                    // LOGIKA VERIFIKASI
                }).then(function() {
                     api.postWithToken('edit', { action: 'edit', title: filePage, appendtext: '\nAset Resmi', summary: 'Official Asset' })
                    return api.postWithToken('edit', {  
                    .then(function() { return api.postWithToken('edit', { action: 'edit', title: pageName, text: content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui'''"), summary: 'Status Update' }); })
                        action: 'edit',  
                    .then(function() { return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: "== Notifikasi ==\nBerkas [[:"+filePage+"]] udah diverifikasi ya, boys! --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.19 (UTC)", summary: 'Notif' }); })
                        title: pageName,  
                    .done(function() { location.reload(); });
                        text: content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui & Dilindungi ("+level+")'''"),  
                }
                        summary: 'Update Status Perlindungan'  
                    });
                }).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();
                });
             });
             });


             $btnNo.click(function() {
             $btnReject.click(function() {
                 var alasan = prompt("Alasan:");
                 var alasan = prompt("Alasan penolakan:");
                 if (!alasan) return;
                 if (!alasan) return;
                 api.postWithToken('edit', { action: 'edit', title: pageName, text: content.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\nAlasan: "+alasan), summary: 'Rejected' })
                $(this).prop('disabled', true).text('Rejecting...');
                .then(function() { return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: "== Notifikasi ==\nSori boys, permintaan lo buat [[:"+filePage+"]] ditolak karena: "+alasan+" --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.19 (UTC)", summary: 'Notif' }); })
 
                .done(function() { location.reload(); });
                 api.postWithToken('edit', {  
                    action: 'edit',  
                    title: pageName,  
                    text: content.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\n''Alasan: " + alasan + "''"),  
                    summary: 'Permintaan Perlindungan Ditolak'  
                }).then(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)";
                    return api.postWithToken('edit', {
                        action: 'edit',
                        title: "Pembicaraan_Pengguna:" + requester,
                        section: 'new',  
                        text: msg,
                        summary: 'Notifikasi Penolakan Perlindungan'  
                    });
                }).done(function() {
                    location.reload();
                });
             });
             });


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