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 VERIFICATION SYSTEM
   🔵 MIPPEDIA IRONCLAD SYSTEM V2
   Fitur: Anti-Manual Category, Pop-up Detail, & Auto-System
   Fitur: Proteksi Kategori Ketat, Pop-up Centered, & Full Auto
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
Baris 1.011: Baris 1.011:
         api = new mw.Api();
         api = new mw.Api();


     // --- 1. LOGIKA CENTANG BIRU & POP-UP ---
    // URL Gambar Centang Biru Asli
    var vBadgeUrl = mw.config.get('wgScriptPath') + '/index.php?title=Special:Redirect/file/Verified_Badge.png';
 
     // --- 1. POP-UP TERVERIFIKASI (FIX TAMPILAN) ---
     function showVerifiedPopup() {
     function showVerifiedPopup() {
         var modalHtml = '<div id="mippedia-v-modal" style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.6);z-index:10000;display:flex;align-items:center;justify-content:center;padding:20px;">' +
         var modalHtml = '<div id="mippedia-v-modal" style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);z-index:99999;display:flex;align-items:center;justify-content:center;">' +
             '<div style="background:#fff;padding:25px;border-radius:15px;max-width:400px;text-align:center;box-shadow:0 10px 30px rgba(0,0,0,0.3);">' +
             '<div style="background:#fff;padding:30px;border-radius:20px;width:85%;max-width:350px;text-align:center;box-shadow:0 15px 35px rgba(0,0,0,0.4);position:relative;margin:auto;">' +
             '<div style="font-size:50px;margin-bottom:15px;">🔵</div>' +
             '<img src="' + vBadgeUrl + '&width=60" style="width:60px;height:60px;margin-bottom:20px;">' +
             '<h2 style="margin-top:0;color:#333;">Akun Terverifikasi</h2>' +
             '<h2 style="margin:0 0 15px 0;color:#1a1a1a;font-family:sans-serif;font-size:22px;">Akun Terverifikasi</h2>' +
             '<p style="color:#666;line-height:1.5;font-size:14px;">Mippedia telah mengonfirmasi bahwa individu atau entitas ini adalah asli. Akun ini telah melewati proses verifikasi ketat untuk memastikan kredibilitas dan mencegah peniruan identitas di komunitas kami.</p>' +
             '<p style="color:#555;line-height:1.6;font-size:14px;margin-bottom:25px;font-family:sans-serif;">Mippedia telah mengonfirmasi bahwa individu atau entitas ini adalah asli. Akun ini telah melewati proses verifikasi ketat untuk memastikan kredibilitas dan mencegah peniruan identitas.</p>' +
             '<button id="close-v-modal" style="background:#0095f6;color:#fff;border:none;padding:10px 25px;border-radius:20px;cursor:pointer;font-weight:bold;margin-top:10px;">Mengerti</button>' +
             '<button id="close-v-modal" style="background:#0095f6;color:#fff;border:none;padding:12px 0;width:100%;border-radius:10px;cursor:pointer;font-weight:bold;font-size:16px;">Mengerti</button>' +
             '</div></div>';
             '</div></div>';
         $('body').append(modalHtml);
         $('body').append(modalHtml);
Baris 1.024: Baris 1.027:
     }
     }


    // --- 2. RENDER BADGE (RIWAYAT & PROFIL) ---
     api.get({ action: 'query', list: 'categorymembers', cmtitle: 'Category:Pengguna_Terverifikasi', cmlimit: 'max' }).done(function(d) {
     api.get({ action: 'query', list: 'categorymembers', cmtitle: 'Category:Pengguna_Terverifikasi', cmlimit: 'max' }).done(function(d) {
         var vUsers = d.query.categorymembers.map(function(m) { return m.title.replace('Pengguna:', ''); });
         var vUsers = d.query.categorymembers.map(function(m) { return m.title.replace('Pengguna:', ''); });


        // Badge di Riwayat (Kecil)
         mw.hook('wikipage.content').add(function() {
         mw.hook('wikipage.content').add(function() {
             $('a.mw-userlink').each(function() {
             $('.mw-userlink').each(function() {
                 var name = $(this).text().trim();
                 var name = $(this).text().trim();
                 if (vUsers.includes(name) && !$(this).next('.mp-v-g').length) {
                 if (vUsers.includes(name) && !$(this).next('.mp-v-g').length) {
                     $(this).after('<span class="mp-v-g" style="margin-left:3px;vertical-align:middle;display:inline-block;cursor:default;"><img src="' + mw.config.get('wgScriptPath') + '/index.php?title=Special:Redirect/file/Verified_Badge.png&width=13" style="width:13px;height:13px;position:relative;top:-1px;"></span>');
                     $(this).after('<span class="mp-v-g" style="margin-left:3px;vertical-align:middle;display:inline-block;"><img src="' + vBadgeUrl + '&width=13" style="width:13px;height:13px;position:relative;top:-1px;"></span>');
                 }
                 }
             });
             });
         });
         });


        // Badge di Profil (Besar + Klik Pop-up)
         var currentTitle = mw.config.get('wgTitle');
         var currentTitle = mw.config.get('wgTitle');
         if ((ns === 2 || ns === 3) && vUsers.includes(currentTitle) && !$('#firstHeading .mp-v-p').length) {
         if ((ns === 2 || ns === 3) && vUsers.includes(currentTitle) && !$('#firstHeading .mp-v-p').length) {
             var $pBadge = $('<span class="mp-v-p" style="margin-left:6px;vertical-align:middle;display:inline-flex;cursor:pointer;"><img src="' + mw.config.get('wgScriptPath') + '/index.php?title=Special:Redirect/file/Verified_Badge.png&width=20" style="width:20px;height:20px;"></span>');
             var $pBadge = $('<span class="mp-v-p" style="margin-left:6px;vertical-align:middle;display:inline-flex;cursor:pointer;"><img src="' + vBadgeUrl + '&width=20" style="width:20px;height:20px;"></span>');
             $pBadge.click(showVerifiedPopup);
             $pBadge.click(showVerifiedPopup);
             $('#firstHeading').append($pBadge);
             $('#firstHeading').append($pBadge);
Baris 1.046: Baris 1.048:
     });
     });


     // --- 2. PROTEKSI KATEGORI MANUAL (SATPAM) ---
     // --- 3. PROTEKSI KATEGORI (SATPAM KETAT) ---
     if (mw.config.get('wgAction') === 'edit' || mw.config.get('wgAction') === 'submit') {
     if (['edit', 'submit'].includes(mw.config.get('wgAction'))) {
         $('#editform').on('submit', function(e) {
         function checkCategory() {
             var $box = $('#wpTextbox1');
             var $box = $('#wpTextbox1');
            if (!$box.length) return;
           
             var content = $box.val();
             var content = $box.val();
             var catTag = /\[\[Category:Pengguna_Terverifikasi\]\]/gi;
             var catPattern = /\[\[Category:Pengguna_Terverifikasi\]\]/gi;
           
 
             // Logika: Jika user bukan sistem verifikasi otomatis (tidak ada flag di session)
             // Jika ada kategori manual dinput & bukan lewat sistem otomatis
             if (!sessionStorage.getItem('is_system_verify')) {
             if (catPattern.test(content) && !sessionStorage.getItem('is_system_verify')) {
                 // Jika teks kategori ada, cek apakah sebelumnya sudah ada (menghapus dibolehkan, menambah dilarang)
                 alert("⚠️ AKSES DITOLAK: Kategori verifikasi tidak boleh ditambahkan secara manual!\n\nGunakan tombol 'Verifikasi' di menu profil.");
                if (catTag.test(content)) {
                $box.val(content.replace(catPattern, '')); // Hapus teksnya secara paksa
                    // Cari konten versi asli dari database (jika bisa) atau blokir penambahan baru
                 return false;
                    alert("⚠️ KEAMANAN: Kategori verifikasi tidak boleh ditambahkan secara manual! Silakan gunakan sistem verifikasi resmi.");
            }
                    $box.val(content.replace(catTag, '')); // Hapus paksa teks kategorinya
            return true;
                 }
        }
 
        // Cek saat tombol simpan diklik
        $('#wpSave, #wpPreview, #wpDiff').on('click', function(e) {
            if (!checkCategory()) {
                e.preventDefault();
                return false;
             }
             }
         });
         });
     }
     }


     // --- 3. AUTO-FILL & REQUEST ---
     // --- 4. AUTO-FILL & REQUEST ---
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_verify_req')) {
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_verify_req')) {
         $('#wpTextbox1').val(sessionStorage.getItem('mippedia_verify_req') + "\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user);
         $('#wpTextbox1').val(sessionStorage.getItem('mippedia_verify_req') + "\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user);
Baris 1.072: Baris 1.082:


     if (ns === 2 && user && pageName.includes('Pengguna:' + user)) {
     if (ns === 2 && user && pageName.includes('Pengguna:' + user)) {
         var $btn = $('<li>').addClass('mw-list-item').append($('<a>').attr('href', '#').append($('<span>').text('🔵 Verifikasi').css({'color':'#0095f6','font-weight':'bold'})));
         if (!$('#ca-verify-request').length) {
        $btn.click(function(e) {
            var $btn = $('<li>').attr('id','ca-verify-request').addClass('mw-list-item').append($('<a>').attr('href', '#').append($('<span>').text('🔵 Verifikasi').css({'color':'#0095f6','font-weight':'bold'})));
            e.preventDefault();
            $btn.click(function(e) {
            sessionStorage.setItem('mippedia_verify_req', "Halo Pengurus,\n\nMohon verifikasi akun saya agar terverifikasi.");
                e.preventDefault();
            window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:" + user, { action: 'edit', section: 'new' });
                sessionStorage.setItem('mippedia_verify_req', "Halo Pengurus,\n\nMohon verifikasi akun saya.");
        });
                window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:" + user, { action: 'edit', section: 'new' });
        $('#p-cactions ul, #p-views ul').append($btn);
            });
            $('#p-cactions ul, #p-views ul').append($btn);
        }
     }
     }


     // --- 4. PANEL ADMIN (DENGAN BYPASS PROTEKSI) ---
     // --- 5. PANEL ADMIN (BYPASS PROTEKSI) ---
     if (ns === 3 && isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
     if (ns === 3 && isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
         var $pnl = $('<div style="background:#f0f7ff;border:2px solid #0095f6;padding:12px;border-radius:10px;margin-bottom:10px">').append('<b>🔵 ADMIN SYSTEM</b><br>');
         var $pnl = $('<div style="background:#f0f7ff;border:2px solid #0095f6;padding:12px;border-radius:10px;margin-bottom:10px">').append('<b>🔵 ADMIN SYSTEM</b><br>');
Baris 1.088: Baris 1.100:
         $btnApprove.click(function() {
         $btnApprove.click(function() {
             $(this).prop('disabled', true).text('Working...');
             $(this).prop('disabled', true).text('Working...');
             sessionStorage.setItem('is_system_verify', 'true'); // Flag agar tidak diblokir satpam
             sessionStorage.setItem('is_system_verify', 'true'); // Flag bypass satpam
              
              
             api.postWithToken('edit', { action: 'edit', title: "Pengguna:" + mw.config.get('wgTitle'), appendtext: '\n[[Category:Pengguna_Terverifikasi]]', summary: 'System: Account Verified' })
             api.postWithToken('edit', { action: 'edit', title: "Pengguna:" + mw.config.get('wgTitle'), appendtext: '\n[[Category:Pengguna_Terverifikasi]]', summary: 'System: Account Verified' })
             .then(function() {
             .then(function() {
                 return api.postWithToken('edit', { action: 'edit', title: pageName, text: $('#mw-content-text').text().replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵"), summary: 'Approved' });
                 var newT = $('#mw-content-text').text().replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                return api.postWithToken('edit', { action: 'edit', title: pageName, text: newT, summary: 'Approved' });
             }).done(function() {  
             }).done(function() {  
                 sessionStorage.removeItem('is_system_verify');
                 sessionStorage.removeItem('is_system_verify');