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 (V6 - GHOST PROTOCOL)
   🔵 MIPPEDIA ULTIMATE VERIFICATION SYSTEM (V3 - HIGH SECURITY)
  Fitur: Metadata Validation, Hidden Category for Non-Admins
   Fitur: Identitas Rahasia, Tombol Tolak, & Auto-Purge Data
  ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
    var user = mw.config.get('wgUserName');
    var user = mw.config.get('wgUserName');
    var pageName = mw.config.get('wgPageName');
    var pageName = mw.config.get('wgPageName');
    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 api = new mw.Api();
    var api = new mw.Api();
    var vFile = 'Verified_Badge.png';
    var vFile = 'Verified_Badge.png';


    // --- 1. POP-UP TERVERIFIKASI ---
    // --- 1. POP-UP TERVERIFIKASI ---
    function showVerifiedPopup() {
    function showVerifiedPopup() {
        api.parse('[[Berkas:' + vFile + '|60px|link=|middle]]').done(function(renderedImage) {
        api.parse('[[Berkas:' + vFile + '|60px|link=|middle]]').done(function(renderedImage) {
            var modalHtml = '<div id="mippedia-v-modal" style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.75);z-index:99999;display:flex;align-items:center;justify-content:center;">' +
            var modalHtml = '<div id="mippedia-v-modal" style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.75);z-index:99999;display:flex;align-items:center;justify-content:center;">' +
                '<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);position:relative;">' +
                '<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);position:relative;">' +
                '<div style="margin-bottom:15px;">' + renderedImage + '</div>' +
                '<div style="margin-bottom:15px;">' + renderedImage + '</div>' +
                '<h2 style="margin:0 0 10px 0;color:#1a1a1a;font-family:sans-serif;font-size:20px;font-weight:bold;">Akun Terverifikasi</h2>' +
                '<h2 style="margin:0 0 10px 0;color:#1a1a1a;font-family:sans-serif;font-size:20px;font-weight:bold;">Akun Terverifikasi</h2>' +
                '<p style="color:#555;line-height:1.5;font-size:13px;margin-bottom:20px;font-family:sans-serif;">Mippedia telah mengonfirmasi bahwa identitas pemilik akun ini adalah asli.</p>' +
                '<p style="color:#555;line-height:1.5;font-size:13px;margin-bottom:20px;font-family:sans-serif;">Mippedia telah mengonfirmasi bahwa identitas pemilik akun ini adalah asli. Lencana ini menandakan kredibilitas tinggi di dalam komunitas kami.</p>' +
                '<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:14px;">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:14px;">Mengerti</button>' +
                '</div></div>';
                '</div></div>';
            $('body').append(modalHtml);
            $('body').append(modalHtml);
            $('#close-v-modal').click(function() { $('#mippedia-v-modal').remove(); });
            $('#close-v-modal').click(function() { $('#mippedia-v-modal').remove(); });
        });
        });
    }
    }


    // --- 2. LOGIKA CENTANG BIRU GLOBAL ---
    // --- 2. LOGIKA CENTANG BIRU GLOBAL ---
    function applyGlobalBadge($element) {
    function applyGlobalBadge($element) {
        if ($element.data('has-badge') || $element.next('.mippedia-badge-global').length) return;  
        if ($element.data('has-badge') || $element.next('.mippedia-badge-global').length) return; 
        api.parse('[[Berkas:' + vFile + '|13px|link=|middle]]').done(function(renderedImage) {
        api.parse('[[Berkas:' + vFile + '|13px|link=|middle]]').done(function(renderedImage) {
            if ($element.next('.mippedia-badge-global').length) return;
            if ($element.next('.mippedia-badge-global').length) return;
            var cleanImage = $(renderedImage).find('img').first();
            var cleanImage = $(renderedImage).find('img').first();
            var $badge = $('<span class="mippedia-badge-global" style="margin-left: 4px; display: inline-flex; align-items: center; vertical-align: middle; position: relative; top: -1px; cursor: pointer;"></span>').append(cleanImage);
            var $badge = $('<span class="mippedia-badge-global" style="margin-left: 4px; display: inline-flex; align-items: center; vertical-align: middle; position: relative; top: -1px; cursor: pointer;"></span>').append(cleanImage);
            $badge.click(function(e) { e.preventDefault(); showVerifiedPopup(); });
            $badge.click(function(e) { e.preventDefault(); showVerifiedPopup(); });
            $element.after($badge);
            $element.after($badge);
            $element.data('has-badge', true);
            $element.data('has-badge', true);
        });
        });
    }
    }


    // --- 7. VALIDASI SISTEM (HANYA AKTIF JIKA DISETUJUI PENGURUS) ---
    api.get({ action: 'query', list: 'categorymembers', cmtitle: 'Category:Pengguna_Terverifikasi', cmlimit: 'max' }).done(function(data) {
    function checkOfficialStatus(targetUser, callback) {
        var verifiedUsers = data.query.categorymembers.map(function(member) { return member.title.replace('Pengguna:', ''); });
        // Cek riwayat suntingan terakhir pada halaman pengguna tersebut
        function scanLinks() {
        api.get({
            $('a.mw-userlink').each(function() {
            action: 'query',
                var username = $(this).text().trim();
            prop: 'revisions',
                if (verifiedUsers.includes(username)) { applyGlobalBadge($(this)); }
            titles: 'Pengguna:' + targetUser,
            });
            rvprop: 'comment|user',
        }
            rvlimit: 50 // Scan 50 revisi terakhir
        scanLinks();
        }).done(function(res) {
        mw.hook('wikipage.content').add(scanLinks);
            var pages = res.query.pages;
        var currentTitle = mw.config.get('wgTitle');
            var isOfficial = false;
        if ((ns === 2 || ns === 3) && verifiedUsers.includes(currentTitle)) {
            for (var id in pages) {
            if (!$('#firstHeading').find('.mippedia-profile-badge').length) {
                var revs = pages[id].revisions;
                api.parse('[[Berkas:' + vFile + '|22px|link=|middle]]').done(function(renderedImage) {
                if (revs) {
                    var cleanImage = $(renderedImage).find('img').first();
                    isOfficial = revs.some(function(r) {
                    var $pBadge = $('<span class="mippedia-profile-badge" style="margin-left: 6px; display: inline-flex; align-items: center; vertical-align: middle; cursor: pointer;"></span>').append(cleanImage);
                        // Status sah jika ada ringkasan suntingan khusus dari sistem/pengurus
                    $pBadge.click(showVerifiedPopup);
                        return r.comment.includes("Akun Terverifikasi") || r.comment.includes("Status Verifikasi Diberikan oleh Sistem");
                    $('#firstHeading').append($pBadge);
                    });
                });
                }
            }
            }
        }
            callback(isOfficial);
    });
        });
    }


    api.get({ action: 'query', list: 'categorymembers', cmtitle: 'Category:Pengguna_Terverifikasi', cmlimit: 'max' }).done(function(data) {
    // --- 3. AUTO-FILL TEKS PERMINTAAN (DENGAN FORM IDENTITAS RAHASIA) ---
        var potentialUsers = data.query.categorymembers.map(function(member) { return member.title.replace('Pengguna:', ''); });
    if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_verify_req')) {
       
        var identityTemplate = 
        function scanLinks() {
            "\n\n\n" +
            $('a.mw-userlink').each(function() {
            "<div class='sysop-show' style='background:#fff5f5; border:1px solid #ff0000; padding:10px;'>\n" +
                var $link = $(this);
            "=== Data Identitas Pemohon ===\n" +
                var username = $link.text().trim();
            "* '''Foto KTP/ID:''' [[Berkas:Isi_Nama_File_Di_Sini.jpg|thumb|150px]]\n" +
                if (potentialUsers.includes(username)) {
            "* '''Foto Selfie dengan KTP:''' [[Berkas:Isi_Nama_File_Di_Sini.jpg|thumb|150px]]\n" +
                    checkOfficialStatus(username, function(isOfficial) {
            "* '''Nama Lengkap:''' \n" +
                        if (isOfficial) applyGlobalBadge($link);
            "* '''Tautan Media Sosial:''' \n" +
                    });
            "</div>\n" +
                }
            "";
            });
        }
        scanLinks();
        mw.hook('wikipage.content').add(scanLinks);


        var currentTitle = mw.config.get('wgTitle');
        var savedText = sessionStorage.getItem('mippedia_verify_req');
        if ((ns === 2 || ns === 3) && potentialUsers.includes(currentTitle)) {
        $('#wpTextbox1').val(savedText + "\n\n**Persyaratan Verifikasi:** \n(Tulis alasan mengapa akun lo layak dapet centang biru, boys!) " + identityTemplate + "\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user);
            checkOfficialStatus(currentTitle, function(isOfficial) {
        sessionStorage.removeItem('mippedia_verify_req');
                if (isOfficial && !$('#firstHeading').find('.mippedia-profile-badge').length) {
    }
                    api.parse('[[Berkas:' + vFile + '|22px|link=|middle]]').done(function(renderedImage) {
                        var cleanImage = $(renderedImage).find('img').first();
                        var $pBadge = $('<span class="mippedia-profile-badge" style="margin-left: 6px; display: inline-flex; align-items: center; vertical-align: middle; cursor: pointer;"></span>').append(cleanImage);
                        $pBadge.click(showVerifiedPopup);
                        $('#firstHeading').append($pBadge);
                    });
                }
            });
        }
    });


    // --- 3. AUTO-FILL TEKS PERMINTAAN ---
    // --- 4. SEMBUNYIKAN DATA PRIVASI DARI NON-ADMIN ---
    if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_verify_req')) {
    if (!isAdmin) {
        var identityTemplate = "\n\n<div class='sysop-show' style='background:#fff5f5; border:1px solid #ff0000; padding:10px;'>\n=== Data Identitas Pemohon ===\n* '''Foto KTP/ID:''' [[Berkas:Isi_Nama_File_Di_Sini.jpg|thumb|150px]]\n* '''Nama Lengkap:''' \n</div>";
        $('.sysop-show').hide();
        var savedText = sessionStorage.getItem('mippedia_verify_req');
    }
        $('#wpTextbox1').val(savedText + "\n\n**Persyaratan Verifikasi:** " + identityTemplate + "\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user);
        sessionStorage.removeItem('mippedia_verify_req');
    }


    // --- 4. SEMBUNYIKAN KATEGORI DARI NON-ADMIN ---
    // --- 5. TOMBOL MINTA VERIFIKASI ---
    if (!isAdmin) {
    if (ns === 2 && user && mw.config.get('wgTitle') === user) { 
        $('.sysop-show').hide();
        if (!$('#ca-verify-request').length) {
        // Sembunyikan kategori manual dari daftar kategori di bawah halaman
            var $verifyLink = $('<li>').attr({'id': 'ca-verify-request', 'class': 'mw-list-item'}).append(
        $('#mw-normal-catlinks ul li a[title="Kategori:Pengguna Terverifikasi"]').parent().hide();
                $('<a>').attr({'href': '#', 'title': 'Minta Verifikasi'}).css({
        if ($('#mw-normal-catlinks ul li:visible').length === 0) {
                    'display': 'flex', 'align-items': 'center', 'padding': '6px 12px'
            $('#mw-normal-catlinks').hide();
                }).append(
        }
                    $('<span>').html('🔵 Verifikasi').css({'color': '#0095f6', 'font-weight': 'bold', 'margin-left': '2px'})
    }
                )
            );
            $verifyLink.click(function(e) {
                e.preventDefault();
                sessionStorage.setItem('mippedia_verify_req', "Halo Pengurus Mippedia,\n\nSaya mengajukan permohonan verifikasi identitas akun untuk profil [[" + pageName + "]] sesuai dengan kebijakan komunitas.");
                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);
        }
    }


    // --- 5. TOMBOL MINTA VERIFIKASI ---
    // --- 6. PANEL ADMIN VERIFIKASI (APPROVE & REJECT) ---
    if (ns === 2 && user && mw.config.get('wgTitle') === user) {
    if (ns === 3 && isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
        if (!$('#ca-verify-request').length) {
        var targetUserPage = "Pengguna:" + mw.config.get('wgTitle');
            var $verifyLink = $('<li>').attr({'id': 'ca-verify-request', 'class': 'mw-list-item'}).append(
        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user|content', rvlimit: 1 }).done(function(res) {
                $('<a>').attr({'href': '#'}).append($('<span>').html('🔵 Verifikasi').css({'color': '#0095f6', 'font-weight': 'bold'}))
            var pg = res.query.pages[Object.keys(res.query.pages)[0]];
            );
            if (!pg || !pg.revisions) return;
            $verifyLink.click(function(e) {
            var requester = pg.revisions[0].user;
                e.preventDefault();
            var oldContent = pg.revisions[0]['*'];
                sessionStorage.setItem('mippedia_verify_req', "Saya mengajukan verifikasi profil.");
            if (!$('#mw-content-text').text().includes("Permintaan Verifikasi Profil Pengguna")) return;
                window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:" + user, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Verifikasi' });
            });
            $('#p-cactions ul, #p-views ul').append($verifyLink);
        }
    }


    // --- 6. PANEL ADMIN VERIFIKASI ---
            var $panel = $('<div style="background:#f0f7ff; border:2px solid #0095f6; padding:15px; border-radius:12px; margin-bottom:15px; display:flex; flex-direction:column; gap:10px;">' +
    if (ns === 3 && isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
                '<div><b style="color:#0095f6;">🔵 ADMIN VERIFICATION PANEL</b><br><small>Memproses permohonan: <b>'+requester+'</b></small></div></div>');
        var targetUserPage = "Pengguna:" + mw.config.get('wgTitle');
            
        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user|content', rvlimit: 1 }).done(function(res) {
            var $btnGroup = $('<div style="display:flex; gap:10px;"></div>');
            var pg = res.query.pages[Object.keys(res.query.pages)[0]];
            var $btnApprove = $('<button>').text('✅ SETUJUI').css({'background':'#0095f6','color':'#fff','padding':'8px 15px','border':'none','border-radius':'6px','cursor':'pointer','font-weight':'bold'});
            if (!pg || !pg.revisions) return;
            var $btnReject = $('<button>').text('❌ TOLAK').css({'background':'#ff4d4d','color':'#fff','padding':'8px 15px','border':'none','border-radius':'6px','cursor':'pointer','font-weight':'bold'});
            var requester = pg.revisions[0].user;
            var oldContent = pg.revisions[0]['*'];


            var $panel = $('<div style="background:#f0f7ff; border:2px solid #0095f6; padding:15px; border-radius:12px; margin-bottom:15px;">' +
            // LOGIKA SETUJUI
                '<b style="color:#0095f6;">🔵 ADMIN PANEL</b><br></div>');
            $btnApprove.click(function() {
           
                $(this).prop('disabled', true).text('Approving...');
            var $btnApprove = $('<button>').text('✅ SETUJUI').css({'background':'#0095f6','color':'#fff','padding':'5px 15px','border':'none','border-radius':'5px','cursor':'pointer','font-weight':'bold'});
                sessionStorage.setItem('is_system_verify', 'true');
                api.postWithToken('edit', { action: 'edit', title: targetUserPage, appendtext: '\n[[Category:Pengguna_Terverifikasi]]', summary: 'Akun Terverifikasi'
                }).then(function() {
                    // HAPUS DATA PRIVASI OTOMATIS SAAT DISETUJUI
                    var cleanText = oldContent.replace(/<div class='sysop-show'[\s\S]*?<\/div>/g, "''(Data identitas telah dihapus otomatis demi keamanan tingkat tinggi)''");
                    var newText = cleanText.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                    return api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Approved & Purged Identity Data' });
                }).then(function() {
                    var msg = "\n== Selamat! Profil Anda Terverifikasi ==\nHalo [["+requester+"]],\n\nKabar gembira! Tim Pengurus Mippedia telah meninjau data identitas Anda dan memutuskan untuk **MENYETUJUI** permohonan verifikasi Anda. Akun Anda kini memiliki lencana centang biru 🔵 sebagai tanda kredibilitas asli.\n\nData identitas yang Anda kirimkan telah kami hapus secara otomatis dari sistem kami demi menjaga keamanan privasi Anda. Terima kasih telah berkontribusi di Mippedia! --[[Pengguna:Admin|Admin]]";
                    return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: msg });
                }).done(function() { 
                    sessionStorage.removeItem('is_system_verify');
                    location.reload(); 
                });
            });


            $btnApprove.click(function() {
            // LOGIKA TOLAK
                $(this).prop('disabled', true).text('Approving...');
            $btnReject.click(function() {
                api.postWithToken('edit', {  
                $(this).prop('disabled', true).text('Rejecting...');
                    action: 'edit',  
                // HAPUS DATA PRIVASI OTOMATIS SAAT DITOLAK
                    title: targetUserPage,  
                var cleanText = oldContent.replace(/<div class='sysop-show'[\s\S]*?<\/div>/g, "''(Data identitas telah dihapus otomatis demi keamanan tingkat tinggi)''");
                    appendtext: '\n[[Category:Pengguna_Terverifikasi]]',  
                var newText = cleanText.replace("Status: 🕒 Sedang diverifikasi", "Status: ❌ '''Permintaan Ditolak'''");
                    summary: 'Akun Terverifikasi (OFFICIAL SYSTEM)' // Metadata kunci
                
                }).then(function() {
                api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Rejected & Purged Identity Data'
                    var newText = oldContent.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                }).then(function() {
                    return api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Approved' });
                    var msg = "\n== Informasi: Permintaan Verifikasi Belum Disetujui ==\nHalo [["+requester+"]],\n\nMohon maaf, setelah melakukan peninjauan terhadap data yang Anda kirimkan, Tim Pengurus Mippedia memutuskan untuk **BELUM DAPAT MENYETUJUI** permohonan verifikasi Anda saat ini. Hal ini bisa disebabkan oleh data yang kurang jelas atau tidak memenuhi kriteria verifikasi kami.\n\nJangan khawatir, data identitas sensitif yang Anda kirimkan sudah kami hapus secara otomatis demi keamanan Anda. Anda dapat mengajukan permohonan kembali di masa mendatang dengan data yang lebih lengkap. --[[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(); 
                });
            });


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