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 ULTIMATE VERIFICATION SYSTEM (STYLE FIX)
   🔵 MIPPEDIA IRONCLAD VERIFICATION SYSTEM
   Fitur: Satu Centang, Ukuran Kecil di Riwayat, & Sejajar Nama
   Fitur: Anti-Manual Category, Pop-up Detail, & Auto-System
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
     var user = mw.config.get('wgUserName');
     var user = mw.config.get('wgUserName'),
    var pageName = mw.config.get('wgPageName');
        pageName = mw.config.get('wgPageName'),
    var ns = mw.config.get('wgNamespaceNumber');
        ns = mw.config.get('wgNamespaceNumber'),
    var isAdmin = mw.config.get('wgUserGroups').includes('sysop');
        isAdmin = mw.config.get('wgUserGroups').includes('sysop'),
    var api = new mw.Api();
        api = new mw.Api();


     // --- 1. LOGIKA CENTANG BIRU GLOBAL (RIWAYAT, RECENT CHANGES, DLL) ---
     // --- 1. LOGIKA CENTANG BIRU & POP-UP ---
     function applyGlobalBadge($element) {
     function showVerifiedPopup() {
         // Cek agar tidak duplikat
         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;">' +
        if ($element.data('has-badge') || $element.next('.mippedia-badge-global').length) return;  
             '<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="font-size:50px;margin-bottom:15px;">🔵</div>' +
        api.parse('[[Berkas:Verified_Badge.png|13px|link=|middle]]').done(function(renderedImage) {
            '<h2 style="margin-top:0;color:#333;">Akun Terverifikasi</h2>' +
             if ($element.next('.mippedia-badge-global').length) return;
             '<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>' +
 
             '<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>' +
             var cleanImage = $(renderedImage).find('img').first();
            '</div></div>';
              
        $('body').append(modalHtml);
            // Pengaturan posisi: margin-top disesuaikan agar sejajar teks nama
        $('#close-v-modal').click(function() { $('#mippedia-v-modal').remove(); });
             var $badge = $('<span class="mippedia-badge-global" style="margin-left: 4px; display: inline-flex; align-items: center; vertical-align: middle; position: relative; top: -1px;"></span>').append(cleanImage);
           
            $element.after($badge);
            $element.data('has-badge', true);
        });
     }
     }


    // Ambil daftar user terverifikasi dari kategori
     api.get({ action: 'query', list: 'categorymembers', cmtitle: 'Category:Pengguna_Terverifikasi', cmlimit: 'max' }).done(function(d) {
     api.get({
         var vUsers = d.query.categorymembers.map(function(m) { return m.title.replace('Pengguna:', ''); });
        action: 'query',
        list: 'categorymembers',
        cmtitle: 'Category:Pengguna_Terverifikasi',
        cmlimit: 'max'
    }).done(function(data) {
         var verifiedUsers = data.query.categorymembers.map(function(member) {
            return member.title.replace('Pengguna:', '');
        });


         // Scan link pengguna di halaman riwayat/recent changes
         // Badge di Riwayat (Kecil)
         function scanLinks() {
         mw.hook('wikipage.content').add(function() {
             $('a.mw-userlink').each(function() {
             $('a.mw-userlink').each(function() {
                 var username = $(this).text().trim();
                 var name = $(this).text().trim();
                 if (verifiedUsers.includes(username)) {
                 if (vUsers.includes(name) && !$(this).next('.mp-v-g').length) {
                     applyGlobalBadge($(this));
                     $(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>');
                 }
                 }
             });
             });
         }
         });
 
        scanLinks();
        mw.hook('wikipage.content').add(scanLinks);


         // Khusus di Halaman Profil (firstHeading) - Tetap Besar & Sejajar
         // Badge di Profil (Besar + Klik Pop-up)
         var currentTitle = mw.config.get('wgTitle');
         var currentTitle = mw.config.get('wgTitle');
         if ((ns === 2 || ns === 3) && verifiedUsers.includes(currentTitle)) {
         if ((ns === 2 || ns === 3) && vUsers.includes(currentTitle) && !$('#firstHeading .mp-v-p').length) {
            if (!$('#firstHeading').find('.mippedia-profile-badge').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>');
                api.parse('[[Berkas:Verified_Badge.png|20px|link=|middle]]').done(function(renderedImage) {
            $pBadge.click(showVerifiedPopup);
                    var cleanImage = $(renderedImage).find('img').first();
            $('#firstHeading').append($pBadge);
                    $('#firstHeading').append($('<span class="mippedia-profile-badge" style="margin-left: 6px; display: inline-flex; align-items: center; vertical-align: middle;"></span>').append(cleanImage));
                });
            }
         }
         }
     });
     });


     // --- 2. AUTO-FILL TEKS PERMINTAAN ---
     // --- 2. PROTEKSI KATEGORI MANUAL (SATPAM) ---
    if (mw.config.get('wgAction') === 'edit' || mw.config.get('wgAction') === 'submit') {
        $('#editform').on('submit', function(e) {
            var $box = $('#wpTextbox1');
            var content = $box.val();
            var catTag = /\[\[Category:Pengguna_Terverifikasi\]\]/gi;
           
            // Logika: Jika user bukan sistem verifikasi otomatis (tidak ada flag di session)
            if (!sessionStorage.getItem('is_system_verify')) {
                // Jika teks kategori ada, cek apakah sebelumnya sudah ada (menghapus dibolehkan, menambah dilarang)
                if (catTag.test(content)) {
                    // Cari konten versi asli dari database (jika bisa) atau blokir penambahan baru
                    alert("⚠️ KEAMANAN: Kategori verifikasi tidak boleh ditambahkan secara manual! Silakan gunakan sistem verifikasi resmi.");
                    $box.val(content.replace(catTag, '')); // Hapus paksa teks kategorinya
                }
            }
        });
    }
 
    // --- 3. 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')) {
        var savedText = 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(savedText + "\n\n**Persyaratan Verifikasi:** \n(Tulis alasan verifikasi, boys!) \n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user);
         sessionStorage.removeItem('mippedia_verify_req');
         sessionStorage.removeItem('mippedia_verify_req');
     }
     }


    // --- 3. TOMBOL MINTA VERIFIKASI ---
     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 $verifyLink = $('<li>').attr({'id': 'ca-verify-request', 'class': 'mw-list-item'}).append(
            e.preventDefault();
                $('<a>').attr({'href': '#', 'title': 'Minta Verifikasi'}).css({
            sessionStorage.setItem('mippedia_verify_req', "Halo Pengurus,\n\nMohon verifikasi akun saya agar terverifikasi.");
                    'display': 'flex', 'align-items': 'center', 'padding': '6px 12px'
            window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:" + user, { action: 'edit', section: 'new' });
                }).append(
        });
                    $('<span>').html('🔵 Verifikasi').css({'color': '#0095f6', 'font-weight': 'bold', 'margin-left': '2px'})
        $('#p-cactions ul, #p-views ul').append($btn);
                )
            );
            $verifyLink.click(function(e) {
                e.preventDefault();
                sessionStorage.setItem('mippedia_verify_req', "Halo Pengurus,\n\nSaya memohon verifikasi untuk akun [[" + pageName + "]] agar terverifikasi.");
                window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:" + user, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Verifikasi Profil Pengguna' });
            });
            $('#p-cactions ul, #p-views ul').append($verifyLink);
        }
     }
     }


     // --- 4. PANEL ADMIN VERIFIKASI ---
     // --- 4. PANEL ADMIN (DENGAN 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 targetUserPage = "Pengguna:" + mw.config.get('wgTitle');
         var $pnl = $('<div style="background:#f0f7ff;border:2px solid #0095f6;padding:12px;border-radius:10px;margin-bottom:10px">').append('<b>🔵 ADMIN SYSTEM</b><br>');
         api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user|content', rvlimit: 1 }).done(function(res) {
         var $btnApprove = $('<button>').text('✅ APPROVE').css({'background':'#0095f6','color':'#fff','border':'none','padding':'5px 15px','cursor':'pointer','font-weight':'bold','border-radius':'4px'});
            var pg = res.query.pages[Object.keys(res.query.pages)[0]];
            var requester = pg.revisions[0].user;
            var oldContent = pg.revisions[0]['*'];
            if (!$('#mw-content-text').text().includes("Permintaan Verifikasi Profil Pengguna")) return;


            var $panel = $('<div style="background:#f0f7ff; border:2px solid #0095f6; padding:15px; border-radius:12px; margin-bottom:15px;">' +
        $btnApprove.click(function() {
                '<b style="color:#0095f6;">🔵 ADMIN VERIFICATION</b><br><small>User: '+requester+'</small></div>');
             $(this).prop('disabled', true).text('Working...');
             var $btnApprove = $('<button>').text('✅ VERIFIKASI').css({'background':'#0095f6','color':'#fff','padding':'5px 12px','border':'none','cursor':'pointer','font-weight':'bold'});
            sessionStorage.setItem('is_system_verify', 'true'); // Flag agar tidak diblokir satpam
              
              
             $btnApprove.click(function() {
             api.postWithToken('edit', { action: 'edit', title: "Pengguna:" + mw.config.get('wgTitle'), appendtext: '\n[[Category:Pengguna_Terverifikasi]]', summary: 'System: Account Verified' })
                $(this).prop('disabled', true).text('Processing...');
            .then(function() {
                api.postWithToken('edit', { action: 'edit', title: targetUserPage, appendtext: '\n[[Category:Pengguna_Terverifikasi]]', summary: 'Akun Terverifikasi'
                return api.postWithToken('edit', { action: 'edit', title: pageName, text: $('#mw-content-text').text().replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵"), summary: 'Approved' });
                }).then(function() {
            }).done(function() {  
                    var newText = oldContent.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                sessionStorage.removeItem('is_system_verify');
                    return api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Approved' });
                location.reload();  
                }).then(function() {
                    var msg = "\n== Profil Terverifikasi ==\nHalo [["+requester+"]], akun Anda resmi terverifikasi dengan centang biru 🔵. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 20.50 (UTC)";
                    return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: msg });
                }).done(function() { location.reload(); });
             });
             });
            $panel.append($btnApprove);
            $('#mw-content-text').prepend($panel);
         });
         });
        $('#mw-content-text').prepend($pnl.append($btnApprove));
     }
     }
});
});