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 SMART PROTECTION SYSTEM (ALL-IN-ONE)
   🛡️ MIPPEDIA ULTIMATE AUTOMATION v9.0 (STABLE)
  Sistem Verifikasi & Perlindungan Terpadu
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
Baris 645: 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 $content = $('#mw-content-text');
     var api = new mw.Api();


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


     // --- 2. TOMBOL DINAMIS & CEK STATUS (HALAMAN BERKAS) ---
     // --- 2. TOMBOL DI HALAMAN BERKAS ---
     if (ns === 6) {
     if (ns === 6) {
        var api = new mw.Api();
         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(data) {
             var p = d.query.pages[Object.keys(d.query.pages)[0]];
             var page = data.query.pages[Object.keys(data.query.pages)[0]];
             var isOfficial = $('#mw-content-text').text().includes("Aset Resmi");
             var protections = page.protection;
             var prot = p.protection;
              
             var isFull = prot.some(x => x.level === 'sysop');
             var isFull = false;
             var isSemi = prot.some(x => x.level === 'autoconfirmed');
             var isSemi = false;


             protections.forEach(function(p) {
             // Tombol Verifikasi
                 if (p.type === 'edit') {
            if (!isOfficial) {
                     if (p.level === 'sysop') isFull = true;
                 var $vBtn = $('<button>').html('📩 Minta Verifikasi').css({'background':'#36c','color':'#fff','border':'none','padding':'5px 12px','border-radius':'20px','cursor':'pointer','margin-right':'5px'});
                     if (p.level === 'autoconfirmed') isSemi = true;
                $vBtn.click(function() {
                 }
                     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' });
                 });
                $('#firstHeading').after($vBtn);
             }


             // Jika Full Protect, tombol hilang total sesuai request lo
             // Tombol Proteksi
             if (isFull) return;
             if (!isFull) {
 
                var txt = isSemi ? "🔒 Tingkatkan Proteksi" : "🔒 Minta Proteksi";
            var btnText = isSemi ? "🔒 Minta Peningkatan Perlindungan" : "🔒 Minta Perlindungan";
                var $pBtn = $('<button>').html(txt).css({'background':'#d33','color':'#fff','border':'none','padding':'5px 12px','border-radius':'20px','cursor':'pointer'});
            var btnColor = isSemi ? "#ff4d4f" : "#d33"; // Warna beda kalo upgrade
                $pBtn.click(function() {
 
                    sessionStorage.setItem('mippedia_prot_type', isSemi ? "Perlindungan Penuh" : "Semi Perlindungan");
            var $protBtn = $('<button>').html(btnText).css({
                    window.location.href = mw.util.getUrl("Pembicaraan_Berkas:" + mw.config.get('wgTitle'), { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' });
                'background': btnColor, 'color': '#fff', 'border': 'none', 'padding': '5px 15px',  
                });
                'border-radius': '20px', 'font-size': '11px', 'font-weight': '800', 'cursor': 'pointer', 'margin': '10px 5px'
                $('#firstHeading').after($pBtn);
            });
            }
 
            $protBtn.click(function() {
                if (!user) { window.location.href = mw.util.getUrl('Istimewa:Masuk_log', { returnto: pageName }); return; }
                var talkPage = "Pembicaraan_Berkas:" + mw.config.get('wgTitle');
               
                // Jika sudah semi, otomatis arahkan ke Full. Jika belum, kasih pilihan.
                var finalType = isSemi ? "Perlindungan Penuh" : prompt("Ketik jenis perlindungan: (Semi / Full)", "Semi");
                if (finalType === "Full") finalType = "Perlindungan Penuh";
                if (finalType === "Semi") finalType = "Semi Perlindungan";
 
                sessionStorage.setItem('mippedia_prot_type', finalType);
                window.location.href = mw.util.getUrl(talkPage, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' });
            });
 
            setTimeout(function() { $('#firstHeading').after($protBtn); }, 650);
         });
         });
     }
     }


     // --- 3. PANEL ADMIN & NOTIFIKASI OTOMATIS (HALAMAN PEMBICARAAN) ---
     // --- 3. PANEL ADMIN (HALAMAN PEMBICARAAN) ---
     if (ns === 7) {
     if (ns === 7 && isAdmin && $('#mw-content-text').text().includes("Sedang diajukan")) {
        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]['*'];


        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user', rvlimit: 1, rvdir: 'newer' }).done(function(data) {
             var isProtectReq = content.includes("Perlindungan");
             var pages = data.query.pages;
             var color = isProtectReq ? "#fff0f0" : "#f0f5ff";
             var requester = "";
             var border = isProtectReq ? "#d33" : "#36c";
             for (var id in pages) { requester = pages[id].revisions[0].user; }


             if (isAdmin && isPending) {
             var $panel = $('<div style="background:'+color+'; border:2px solid '+border+'; padding:15px; border-radius:10px; margin-bottom:10px;">' +
                var reqText = $content.text();
                          '<b>🛡️ MIPPEDIA ADMIN CONTROL</b><br><small>Target: '+requester+'</small><br></div>');
                // Deteksi level dan durasi dari teks yang dibuat sistem tadi
           
                var targetLevel = reqText.includes("Perlindungan Penuh") ? "sysop" : "autoconfirmed";
            var $btnOk = $('<button>').text('✅ SETUJUI').css({'background':'#00af89','color':'#fff','padding':'5px 10px','border':'none','cursor':'pointer','margin-top':'10px'});
                var levelLabel = (targetLevel === "sysop") ? "Perlindungan Penuh" : "Semi Perlindungan";
            var $btnNo = $('<button>').text('❌ TOLAK').css({'background':'#d33','color':'#fff','padding':'5px 10px','border':'none','cursor':'pointer','margin-left':'5px'});
                var targetDur = reqText.match(/Durasi:\s*(.*)/) ? reqText.match(/Durasi:\s*(.*)/)[1] : "infinite";


                 var $panel = $('<div style="background:#fff0f0; border:2px solid #d33; padding:15px; border-radius:10px; margin:15px 0;">' +
            $btnOk.click(function() {
                    '<div style="font-weight:bold; color:#d33; margin-bottom:10px;">🛡️ ADMIN ACTION: PROTECTION</div>' +
                 $(this).prop('disabled', true).text('Processing...');
                    '<p style="font-size:11px;">Permintaan: <b>' + levelLabel + '</b> | Durasi: <b>' + targetDur + '</b></p></div>');
                  
                  
                 var $btnApprove = $('<button>').text('✅ SETUJUI & KUNCI').css({'background':'#d33','color':'#fff','border':'none','padding':'8px 15px','cursor':'pointer','font-weight':'bold'});
                 if (isProtectReq) {
                var $btnReject = $('<button>').text('❌ TOLAK').css({'background':'#555','color':'#fff','border':'none','padding':'8px 15px','margin-left':'8px','cursor':'pointer'});
                    // LOGIKA PROTEKSI
 
                    var level = content.includes("Perlindungan Penuh") ? "sysop" : "autoconfirmed";
                $btnApprove.click(function() {
                    var dur = content.match(/Durasi:\s*(.*)/) ? content.match(/Durasi:\s*(.*)/)[1] : "infinite";
                    $btnApprove.prop('disabled', true).text('Processing...');
                      
                      
                    // A. EKSEKUSI LOCK SISTEM
                     api.postWithToken('csrf', { action: 'protect', title: filePage, protections: 'edit='+level+'|move='+level, expiry: dur, reason: 'Request approved' })
                     api.postWithToken('csrf', {
                     .then(function() { return api.postWithToken('edit', { action: 'edit', title: pageName, text: content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui & Dilindungi'''"), summary: 'Status Update' }); })
                        action: 'protect',
                    .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' }); })
                        title: filePage,
                    .done(function() { location.reload(); });
                        protections: 'edit=' + targetLevel + '|move=' + targetLevel,
                } else {
                        expiry: targetDur,
                    // LOGIKA VERIFIKASI
                        reason: 'Permintaan disetujui: ' + levelLabel
                    api.postWithToken('edit', { action: 'edit', title: filePage, appendtext: '\nAset Resmi', summary: 'Official Asset' })
                     }).done(function() {
                    .then(function() { return api.postWithToken('edit', { action: 'edit', title: pageName, text: content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui'''"), summary: 'Status Update' }); })
                        // B. UPDATE TEKS STATUS DI DISKUSI
                    .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' }); })
                        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) {
                    .done(function() { location.reload(); });
                            var content = res.query.pages[Object.keys(res.query.pages)[0]].revisions[0]['*'];
                }
                            var updatedContent = content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui (" + levelLabel + ")'''");
            });
                           
                            api.postWithToken('edit', { action: 'edit', title: pageName, text: updatedContent, summary: 'Status Updated: Protected' }).done(function() {
                                // C. KIRIM PESAN OTOMATIS KE PENGGUNA (Gak boleh ilang!)
                                var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan lo untuk [[:" + filePage + "]] telah '''DISETUJUI''' dengan tingkat '''" + levelLabel + "''' selama '''" + targetDur + "'''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.09 (UTC)";
                                api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() {
                                    location.reload();
                                });
                            });
                        });
                    });
                });


                $btnReject.click(function() {
            $btnNo.click(function() {
                    var alasan = prompt("Alasan penolakan:");
                var alasan = prompt("Alasan:");
                    if (!alasan) return;
                if (!alasan) return;
                    $btnReject.prop('disabled', true).text('Processing...');
                api.postWithToken('edit', { action: 'edit', title: pageName, text: content.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\nAlasan: "+alasan), summary: 'Rejected' })
 
                .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' }); })
                    api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) {
                .done(function() { location.reload(); });
                        var content = res.query.pages[Object.keys(res.query.pages)[0]].revisions[0]['*'];
            });
                        var updatedContent = content.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\n''Alasan: " + alasan + "''");
                       
                        api.postWithToken('edit', { action: 'edit', title: pageName, text: updatedContent, summary: 'Status Updated: Rejected' }).done(function() {
                            // Pesan penolakan otomatis
                            var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan lo untuk [[:" + filePage + "]] '''DITOLAK''' karena: ''" + alasan + "''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.09 (UTC)";
                            api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() {
                                location.reload();
                            });
                        });
                    });
                });


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