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 1.001: Baris 1.001:


/* ==========================================================
/* ==========================================================
  🔵 MIPPEDIA IRONCLAD V6 - TOTAL AUTOMATION
    🔵 MIPPEDIA ACCOUNT VERIFICATION SYSTEM
  Fitur: Auto-Text, Auto-Status, Auto-Message (Approve/Reject),  
    Versi Stabil: Auto-Fill, Admin Panel, & Strict Security
          Hidden Proof, & Strict Security.
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
     var user = mw.config.get('wgUserName'),
     var user = mw.config.get('wgUserName');
        pName = mw.config.get('wgPageName'),
    var pageName = mw.config.get('wgPageName');
        ns = mw.config.get('wgNamespaceNumber'),
    var ns = mw.config.get('wgNamespaceNumber');
        isAdmin = mw.config.get('wgUserGroups').includes('sysop'),
    var isAdmin = mw.config.get('wgUserGroups').includes('sysop');
        api = new mw.Api();
    var $content = $('#mw-content-text');
    var api = new mw.Api();


    // URL Ikon Centang Biru (Pastikan file ini ada di Wiki lo)
     var vBadgeUrl = mw.config.get('wgScriptPath') + '/index.php?title=Special:Redirect/file/Verified_Badge.png';
     var vBadgeUrl = mw.config.get('wgScriptPath') + '/index.php?title=Special:Redirect/file/Verified_Badge.png';


     // --- 1. POP-UP PENJELASAN (DIHALAMAN PENGGUNA) ---
     // --- 1. AUTO-FILL TEKS VERIFIKASI ---
     function showVPopup() {
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_auth_verify')) {
         var h = '<div id="v-m" style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);z-index:99999;display:flex;align-items:center;justify-content:center;">' +
         var savedText = sessionStorage.getItem('mippedia_auth_verify');
            '<div style="background:#fff;padding:30px;border-radius:20px;width:85%;max-width:320px;text-align:center;box-shadow:0 15px 35px rgba(0,0,0,0.5);">' +
        var vTable = "{| class='wikitable' style='width:100%'\n|+ Bukti Identitas Resmi\n|-\n! Dokumen !! Tautan/URL Bukti\n|-\n| KTP / Paspor / SIM || (Masukkan URL Foto Bukti lo di sini, boys!)\n|-\n| Akun Medsos / Website || (Masukkan URL pembuktian identitas lainnya)\n|}";
            '<img src="'+vBadgeUrl+'&width=60" style="width:60px;margin-bottom:15px;">' +
       
            '<h2 style="margin:0 0 10px;font-size:20px;font-weight:bold;">Akun Terverifikasi</h2>' +
        $('#wpTextbox1').val(savedText + "\n\n" + vTable + "\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user);
            '<p style="color:#555;font-size:13px;line-height:1.5;margin-bottom:20px;">Identitas pemilik akun ini telah divalidasi oleh tim Mippedia berdasarkan dokumen resmi untuk memastikan keaslian profil.</p>' +
         sessionStorage.removeItem('mippedia_auth_verify');
            '<button id="c-v-m" style="background:#0095f6;color:#fff;border:none;padding:12px 0;width:100%;border-radius:10px;font-weight:bold;cursor:pointer;">Mengerti</button>' +
            '</div></div>';
         $('body').append(h); $('#c-v-m').click(function(){$('#v-m').remove();});
     }
     }


     // --- 2. RENDER BADGE ---
     // --- 2. TOMBOL VERIFIKASI (DI PROFIL SENDIRI) ---
     api.get({ action: 'query', list: 'categorymembers', cmtitle: 'Category:Pengguna_Terverifikasi', cmlimit: 'max' }).done(function(d) {
     if (ns === 2 && user && pageName.includes('Pengguna:' + user)) {
        var vUsers = d.query.categorymembers.map(function(m) { return m.title.replace('Pengguna:', ''); });
        if (!$('#ca-mippedia-verify').length) {
        mw.hook('wikipage.content').add(function() {
            var $vLink = $('<li>').attr({'id': 'ca-mippedia-verify', 'class': 'mw-list-item'}).append(
            $('.mw-userlink').each(function() {
                $('<a>').attr({'href': '#', 'title': 'Ajukan verifikasi akun'}).css({
                 if (vUsers.includes($(this).text().trim()) && !$(this).next('.mp-v-g').length) {
                    'display': 'flex', 'align-items': 'center', 'padding': '6px 12px'
                    $(this).after('<span class="mp-v-g" style="margin-left:3px;vertical-align:middle;"><img src="'+vBadgeUrl+'&width=13" style="width:13px;"></span>');
                }).append(
                 }
                    $('<span>').html('🔵 Verifikasi').css({'color': '#0095f6', 'font-weight': 'bold'})
                )
            );
 
            $vLink.click(function(e) {
                 e.preventDefault();
                var talkPage = "Pembicaraan_Pengguna:" + mw.config.get('wgTitle');
                sessionStorage.setItem('mippedia_auth_verify', "== Permintaan Verifikasi Akun ==\nHalo Pengurus,\n\nSaya memohon verifikasi untuk akun [[" + pageName + "]] agar mendapatkan lencana centang biru resmi.");
                 window.location.href = mw.util.getUrl(talkPage, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Verifikasi Akun' });
             });
             });
        });
 
        if ((ns===2||ns===3) && vUsers.includes(mw.config.get('wgTitle')) && !$('#firstHeading .mp-v-p').length) {
            $('#p-cactions ul, #p-views ul').append($vLink);
            $('<span class="mp-v-p" style="margin-left:6px;vertical-align:middle;cursor:pointer;"><img src="'+vBadgeUrl+'&width=20" style="width:20px;"></span>').click(showVPopup).appendTo('#firstHeading');
         }
         }
     });
     }


     // --- 3. PROTEKSI KATEGORI (SATPAM NS PENGGUNA) ---
     // --- 3. SISTEM PENCEGAHAN (SATPAM KATEGORI MANUAL) ---
     if (ns===2 && ['edit','submit'].includes(mw.config.get('wgAction'))) {
     if (ns === 2 && ['edit', 'submit'].includes(mw.config.get('wgAction'))) {
         $('#editform').on('submit', function() {
         $('#editform').on('submit', function() {
             var c = $('#wpTextbox1').val();
             var content = $('#wpTextbox1').val();
             if (/\[\[Category:Pengguna_Terverifikasi\]\]/gi.test(c) && !sessionStorage.getItem('sys_v')) {
             if (/\[\[Category:Pengguna_Terverifikasi\]\]/gi.test(content) && !sessionStorage.getItem('is_admin_action')) {
                 alert("⚠️ DILARANG: Kategori verifikasi tidak boleh ditambahkan secara manual di halaman pengguna!");
                 alert("⚠️ AKSES DITOLAK: Penambahan kategori verifikasi secara manual dilarang!\nSistem akan menghapus kategori tersebut secara otomatis.");
                 $('#wpTextbox1').val(c.replace(/\[\[Category:Pengguna_Terverifikasi\]\]/gi, ''));
                 $('#wpTextbox1').val(content.replace(/\[\[Category:Pengguna_Terverifikasi\]\]/gi, ''));
                 return false;
                 return false;
             }
             }
Baris 1.053: Baris 1.058:
     }
     }


     // --- 4. TOMBOL & TEKS OTOMATIS (MINTA VERIFIKASI) ---
     // --- 4. PANEL ADMIN (PROSES PERSETUJUAN) ---
     if (ns===2 && user && pName.includes('Pengguna:'+user)) {
     if (ns === 3 && isAdmin && $content.text().includes("Sedang diverifikasi")) {
         if (!$('#ca-v-req').length) {
         var targetUserPage = "Pengguna:" + mw.config.get('wgTitle');
            var $btn = $('<li>').attr('id','ca-v-req').addClass('mw-list-item').append($('<a>').attr('href','#').append($('<span>').text('🔵 Verifikasi').css({'color':'#0095f6','font-weight':'bold'})));
       
            $btn.click(function(e) {
        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user|content', rvlimit: 1 }).done(function(res) {
                e.preventDefault();
            var pg = res.query.pages[Object.keys(res.query.pages)[0]];
                var tpl = "== Permintaan Verifikasi ==\nHalo Pengurus, mohon verifikasi akun saya.\n\n{| class='wikitable'\n! Bukti Identitas !! URL/Tautan\n|-\n| Identitas Resmi || (Masukkan URL Bukti di sini)\n|}\n\n\n<pre class='hidden-proof' style='display:none'>(Masukkan URL Bukti Sekali Lagi di Sini)</pre>\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user;
            var requester = pg.revisions[0].user;
                sessionStorage.setItem('v_req_txt', tpl);
             var oldContent = pg.revisions[0]['*'];
                window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:"+user, {action:'edit', section:'new'});
             });
            $('#p-cactions ul, #p-views ul').append($btn);
        }
    }
 
    if (mw.config.get('wgAction')==='edit' && sessionStorage.getItem('v_req_txt')) {
        $('#wpTextbox1').val(sessionStorage.getItem('v_req_txt'));
        sessionStorage.removeItem('v_req_txt');
    }


    // --- 5. PANEL ADMIN (AUTO-APPROVE / REJECT) ---
            var $panel = $('<div style="background:#f0f7ff; border:2px solid #0095f6; padding:15px; border-radius:10px; margin-bottom:15px;">' +
    if (ns===3 && isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
                '<b>🔵 ADMIN VERIFICATION CONTROL</b><br><small>Pemohon: '+requester+'</small></div>');
        api.get({action:'query', prop:'revisions', titles:pName, rvprop:'user|content', rvlimit:1}).done(function(r) {
            var pg = r.query.pages[Object.keys(r.query.pages)[0]],
                req = pg.revisions[0].user,
                con = pg.revisions[0]['*'];
              
              
             var proof = $($.parseHTML(con)).find('.hidden-proof').text() || "Tidak ada bukti terlampir";
             var $btnOk = $('<button>').text('✅ SETUJUI').css({'background':'#0095f6','color':'#fff','padding':'5px 12px','border':'none','cursor':'pointer','font-weight':'bold'});
            var $btnNo = $('<button>').text('❌ TOLAK').css({'background':'#555','color':'#fff','padding':'5px 12px','border':'none','cursor':'pointer','margin-left':'10px'});


             var $pnl = $('<div style="background:#f0f7ff;border:2px solid #0095f6;padding:15px;border-radius:12px;margin-bottom:15px">').append('<b style="color:#0095f6;">🔵 ADMIN VERIFICATION SYSTEM</b><br>');
             $btnOk.click(function() {
            var $btnShow = $('<button>').text('👁️ LIHAT BUKTI').css({'margin-right':'8px','padding':'5px 10px','cursor':'pointer','border-radius':'4px','border':'1px solid #ccc'});
                $(this).prop('disabled', true).text('Processing...');
            var $btnApp = $('<button>').text('✅ SETUJUI').css({'background':'#0095f6','color':'#fff','border':'none','padding':'5px 15px','cursor':'pointer','font-weight':'bold','border-radius':'4px','margin-right':'8px'});
                sessionStorage.setItem('is_admin_action', 'true');
            var $btnRej = $('<button>').text('❌ TOLAK').css({'background':'#ff4d4d','color':'#fff','border':'none','padding':'5px 15px','cursor':'pointer','font-weight':'bold','border-radius':'4px'});


            $btnShow.click(function(){ alert("Bukti Identitas:\n" + proof); });
                // STEP 1: TAMBAH KATEGORI KE PROFIL
 
                 api.postWithToken('edit', {  
            // FUNGSI SETUJUI
                    action: 'edit', title: targetUserPage, appendtext: '\n[[Category:Pengguna_Terverifikasi]]', summary: 'System: Akun Terverifikasi'  
            $btnApp.click(function() {
                }).then(function() {
                $(this).prop('disabled',true).text('Memproses...');
                    // STEP 2: UPDATE STATUS DI TALKPAGE
                sessionStorage.setItem('sys_v', 'true');
                     var newText = oldContent.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                 api.postWithToken('edit', {action:'edit', title:"Pengguna:"+mw.config.get('wgTitle'), appendtext:'\n[[Category:Pengguna_Terverifikasi]]', summary:'System: Akun Terverifikasi'})
                     return api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Verification Approved' });
                .then(function() {
                     var up = con.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                     return api.postWithToken('edit', {action:'edit', title:pName, text:up, summary:'Approved'});
                 }).then(function() {
                 }).then(function() {
                     return api.postWithToken('edit', {action:'edit', title:"Pembicaraan_Pengguna:"+req, section:'new', text:"== Profil Terverifikasi ==\nHalo [["+req+"]], akun Anda resmi terverifikasi dengan centang biru 🔵. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 21.43 (UTC)", summary:'Notif'});
                     // STEP 3: PESAN OTOMATIS KE USER
                 }).done(function() {  
                    var msg = "\n== Akun Terverifikasi ==\nHalo [["+requester+"]], permohonan verifikasi lo udah disetujui, boys! Sekarang profil lo punya centang biru resmi. --[[Pengguna:Admin|Admin]] 🔵";
                     sessionStorage.removeItem('sys_v'); location.reload();  
                    return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: msg });
                 }).done(function() {
                     sessionStorage.removeItem('is_admin_action');
                    location.reload();
                 });
                 });
             });
             });


            // FUNGSI TOLAK
             $btnNo.click(function() {
             $btnRej.click(function() {
                 var alasan = prompt("Masukkan alasan penolakan:");
                 var alasan = prompt("Masukkan alasan penolakan:");
                 if (!alasan) return;
                 if (!alasan) return;
                 $(this).prop('disabled',true).text('Memproses...');
                 $(this).prop('disabled', true).text('Rejecting...');
                 var up = con.replace("Status: 🕒 Sedang diverifikasi", "Status: ❌ '''Verifikasi Ditolak'''");
               
                 api.postWithToken('edit', {action:'edit', title:pName, text:up + "\n\n'''Alasan Penolakan:''' " + alasan, summary:'Rejected'})
                 var newText = oldContent.replace("Status: 🕒 Sedang diverifikasi", "Status: ❌ '''Verifikasi Ditolak'''\n\nAlasan: " + alasan);
                .then(function() {
                 api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Verification Rejected' }).then(function() {
                     return api.postWithToken('edit', {action:'edit', title:"Pembicaraan_Pengguna:"+req, section:'new', text:"== Verifikasi Ditolak ==\nHalo [["+req+"]], permohonan verifikasi Anda belum dapat kami setujui.\n\n'''Alasan:''' " + alasan + "\n\nSilakan lengkapi data Anda kembali. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 21.43 (UTC)", summary:'Rejected Notif'});
                     var msg = "\n== Notifikasi Verifikasi ==\nHalo [["+requester+"]], permohonan verifikasi lo ditolak karena: " + alasan + ". Silakan ajukan ulang dengan bukti lebih kuat, boys! --[[Pengguna:Admin|Admin]]";
                 }).done(function() { location.reload(); });
                    return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: msg });
                 }).done(function() {
                    location.reload();
                });
             });
             });


             $('#mw-content-text').prepend($pnl.append($btnShow, $btnApp, $btnRej));
            $panel.append($btnOk, $btnNo);
             $('#mw-content-text').prepend($panel);
         });
         });
     }
     }
});
});