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 V7 - THE FINAL STABLE
   🔵 MIPPEDIA IRONCLAD V6 - TOTAL AUTOMATION
   Skenario: Auto-Category, Auto-Status, Message, & Security
   Fitur: Auto-Text, Auto-Status, Auto-Message (Approve/Reject),
          Hidden Proof, & Strict Security.
   ========================================================== */
   ========================================================== */
(function(mw, $) {
$(document).ready(function() {
    'use strict';
    var user = mw.config.get('wgUserName'),
        pName = mw.config.get('wgPageName'),
        ns = mw.config.get('wgNamespaceNumber'),
        isAdmin = mw.config.get('wgUserGroups').includes('sysop'),
        api = new mw.Api();


     var config = {
     var vBadgeUrl = mw.config.get('wgScriptPath') + '/index.php?title=Special:Redirect/file/Verified_Badge.png';
        badgeUrl: mw.config.get('wgScriptPath') + '/index.php?title=Special:Redirect/file/Verified_Badge.png',
        category: 'Category:Pengguna_Terverifikasi',
        isAdmin: mw.config.get('wgUserGroups').includes('sysop'),
        user: mw.config.get('wgUserName'),
        pName: mw.config.get('wgPageName'),
        ns: mw.config.get('wgNamespaceNumber'),
        action: mw.config.get('wgAction')
    };


    var api = new mw.Api();
     // --- 1. POP-UP PENJELASAN (DIHALAMAN PENGGUNA) ---
 
     // 1. FUNGSI TAMPILAN POP-UP (FIX CENTER)
     function showVPopup() {
     function showVPopup() {
         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 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;">' +
             '<div style="background:#fff;padding:25px;border-radius:15px;width:80%;max-width:300px;text-align: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);">' +
             '<img src="'+config.badgeUrl+'&width=60" style="width:60px;margin-bottom:15px;">' +
             '<img src="'+vBadgeUrl+'&width=60" style="width:60px;margin-bottom:15px;">' +
             '<h3 style="margin-top:0;">Akun Terverifikasi</h3>' +
             '<h2 style="margin:0 0 10px;font-size:20px;font-weight:bold;">Akun Terverifikasi</h2>' +
             '<p style="font-size:13px;color:#444;">Identitas akun ini telah divalidasi oleh tim Mippedia.</p>' +
             '<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>' +
             '<button id="c-v-m" style="background:#0095f6;color:#fff;border:none;padding:10px;width:100%;border-radius:8px;font-weight:bold;cursor:pointer;">Tutup</button>' +
             '<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>';
             '</div></div>';
         $('body').append(h); $('#c-v-m').on('click', function(){ $('#v-m').remove(); });
         $('body').append(h); $('#c-v-m').click(function(){$('#v-m').remove();});
     }
     }


     // 2. DETEKSI & RENDER CENTANG BIRU
     // --- 2. RENDER BADGE ---
     function renderBadges() {
     api.get({ action: 'query', list: 'categorymembers', cmtitle: 'Category:Pengguna_Terverifikasi', cmlimit: 'max' }).done(function(d) {
        api.get({ action: 'query', list: 'categorymembers', cmtitle: config.category, 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:', ''); });
        mw.hook('wikipage.content').add(function() {
           
            $('.mw-userlink').each(function() {
            // Di Link Nama Pengguna
                if (vUsers.includes($(this).text().trim()) && !$(this).next('.mp-v-g').length) {
            mw.hook('wikipage.content').add(function() {
                    $(this).after('<span class="mp-v-g" style="margin-left:3px;vertical-align:middle;"><img src="'+vBadgeUrl+'&width=13" style="width:13px;"></span>');
                $('.mw-userlink').each(function() {
                 }
                    var name = $(this).text().trim();
                    if (vUsers.includes(name) && !$(this).next('.mp-v-g').length) {
                        $(this).after('<img class="mp-v-g" src="'+config.badgeUrl+'&width=13" style="width:13px;margin-left:3px;vertical-align:middle;">');
                    }
                 });
             });
             });
            // Di Judul Halaman
            var pageTitle = mw.config.get('wgTitle');
            if ((config.ns === 2 || config.ns === 3) && vUsers.includes(pageTitle) && !$('#firstHeading .mp-v-p').length) {
                var $b = $('<img class="mp-v-p" src="'+config.badgeUrl+'&width=20" style="width:20px;margin-left:8px;vertical-align:middle;cursor:pointer;">');
                $b.on('click', showVPopup);
                $('#firstHeading').append($b);
            }
         });
         });
     }
        if ((ns===2||ns===3) && vUsers.includes(mw.config.get('wgTitle')) && !$('#firstHeading .mp-v-p').length) {
            $('<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 (HANYA DI NAMESPACE PENGGUNA)
     // --- 3. PROTEKSI KATEGORI (SATPAM NS PENGGUNA) ---
     if (config.ns === 2 && ['edit', 'submit'].includes(config.action)) {
     if (ns===2 && ['edit','submit'].includes(mw.config.get('wgAction'))) {
         $('#editform').on('submit', function(e) {
         $('#editform').on('submit', function() {
             var c = $('#wpTextbox1').val();
             var c = $('#wpTextbox1').val();
             if (/\[\[Category:Pengguna_Terverifikasi\]\]/gi.test(c) && !sessionStorage.getItem('sys_v')) {
             if (/\[\[Category:Pengguna_Terverifikasi\]\]/gi.test(c) && !sessionStorage.getItem('sys_v')) {
                 alert("⚠️ DILARANG: Kategori ini hanya bisa ditambah otomatis oleh sistem!");
                 alert("⚠️ DILARANG: Kategori verifikasi tidak boleh ditambahkan secara manual di halaman pengguna!");
                 $('#wpTextbox1').val(c.replace(/\[\[Category:Pengguna_Terverifikasi\]\]/gi, ''));
                 $('#wpTextbox1').val(c.replace(/\[\[Category:Pengguna_Terverifikasi\]\]/gi, ''));
                 return false;
                 return false;
Baris 1.068: Baris 1.053:
     }
     }


     // 4. TOMBOL VERIFIKASI & TEKS OTOMATIS
     // --- 4. TOMBOL & TEKS OTOMATIS (MINTA VERIFIKASI) ---
     if (config.ns === 2 && config.user && config.pName.includes('Pengguna:' + config.user)) {
     if (ns===2 && user && pName.includes('Pengguna:'+user)) {
         var $li = $('<li id="ca-v-req" class="mw-list-item">').append($('<a href="#">').append($('<span>').text('🔵 Verifikasi').css({'color':'#0095f6','font-weight':'bold'})));
         if (!$('#ca-v-req').length) {
        $li.on('click', function(e) {
            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'})));
            e.preventDefault();
            $btn.click(function(e) {
            var tpl = "== Permintaan Verifikasi ==\nHalo Pengurus, mohon verifikasi akun saya.\n\n{| class='wikitable'\n! Bukti Identitas !! URL/Tautan\n|-\n| Identitas Resmi || (Tautan Bukti Di Sini)\n|}\n\n\n<pre class='hidden-proof' style='display:none'>(Masukkan URL Bukti Sekali Lagi)</pre>\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + config.user;
                e.preventDefault();
            sessionStorage.setItem('v_req_txt', tpl);
                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;
            window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:" + config.user, { action: 'edit', section: 'new' });
                sessionStorage.setItem('v_req_txt', tpl);
        });
                window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:"+user, {action:'edit', section:'new'});
        $('#p-cactions ul, #p-views ul').append($li);
            });
            $('#p-cactions ul, #p-views ul').append($btn);
        }
     }
     }


    // Masukkan Teks Otomatis ke Kotak Edit
     if (mw.config.get('wgAction')==='edit' && sessionStorage.getItem('v_req_txt')) {
     if (config.action === 'edit' && sessionStorage.getItem('v_req_txt')) {
         $('#wpTextbox1').val(sessionStorage.getItem('v_req_txt'));
         $('#wpTextbox1').val(sessionStorage.getItem('v_req_txt'));
         sessionStorage.removeItem('v_req_txt');
         sessionStorage.removeItem('v_req_txt');
     }
     }


     // 5. PANEL ADMIN (APPROVE & REJECT + NOTIF)
     // --- 5. PANEL ADMIN (AUTO-APPROVE / REJECT) ---
     if (config.ns === 3 && config.isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
     if (ns===3 && isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
         api.get({ action: 'query', prop: 'revisions', titles: config.pName, rvprop: 'user|content', rvlimit: 1 }).done(function(r) {
         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]],  
             var pg = r.query.pages[Object.keys(r.query.pages)[0]],  
                 requester = pg.revisions[0].user,  
                 req = pg.revisions[0].user,  
                 oldContent = pg.revisions[0]['*'];
                 con = pg.revisions[0]['*'];
              
              
             var proof = $($.parseHTML(oldContent)).find('.hidden-proof').text() || "Tidak ada bukti";
             var proof = $($.parseHTML(con)).find('.hidden-proof').text() || "Tidak ada bukti terlampir";


             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</b><br>');
             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>');
             var $btnView = $('<button>').text('👁️ BUKTI').css({'margin-right':'5px','cursor':'pointer'}).click(function(){ alert("Bukti: " + proof); });
             var $btnShow = $('<button>').text('👁️ LIHAT BUKTI').css({'margin-right':'8px','padding':'5px 10px','cursor':'pointer','border-radius':'4px','border':'1px solid #ccc'});
             var $btnApp = $('<button>').text('✅ SETUJU').css({'background':'#0095f6','color':'#fff','border':'none','padding':'5px 10px','cursor':'pointer','font-weight':'bold','border-radius':'4px','margin-right':'5px'});
             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'});
             var $btnRej = $('<button>').text('❌ TOLAK').css({'background':'#ff4d4d','color':'#fff','border':'none','padding':'5px 10px','cursor':'pointer','font-weight':'bold','border-radius':'4px'});
             var $btnRej = $('<button>').text('❌ TOLAK').css({'background':'#ff4d4d','color':'#fff','border':'none','padding':'5px 15px','cursor':'pointer','font-weight':'bold','border-radius':'4px'});


             // LOGIKA APPROVE
            $btnShow.click(function(){ alert("Bukti Identitas:\n" + proof); });
             $btnApp.on('click', function() {
 
                 $(this).prop('disabled', true).text('...');
             // FUNGSI SETUJUI
             $btnApp.click(function() {
                 $(this).prop('disabled',true).text('Memproses...');
                 sessionStorage.setItem('sys_v', 'true');
                 sessionStorage.setItem('sys_v', 'true');
                 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: Akun Terverifikasi'})
                 .then(function() {
                 .then(function() {
                     var newT = oldContent.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                     var up = con.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                     return api.postWithToken('edit', { action: 'edit', title: config.pName, text: newT, summary: 'Approved' });
                     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:" + requester, section: 'new', text: "== Verifikasi Berhasil ==\nHalo [["+requester+"]], akun Anda resmi terverifikasi 🔵. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 21.39 (UTC)", summary: 'Notice' });
                     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'});
                 }).done(function() {  
                 }).done(function() {  
                     sessionStorage.removeItem('sys_v'); location.reload();  
                     sessionStorage.removeItem('sys_v'); location.reload();  
Baris 1.115: Baris 1.103:
             });
             });


             // LOGIKA REJECT
             // FUNGSI TOLAK
             $btnRej.on('click', function() {
             $btnRej.click(function() {
                 var alasan = prompt("Alasan penolakan:");
                 var alasan = prompt("Masukkan alasan penolakan:");
                 if (!alasan) return;
                 if (!alasan) return;
                 $(this).prop('disabled', true).text('...');
                 $(this).prop('disabled',true).text('Memproses...');
                 var newT = oldContent.replace("Status: 🕒 Sedang diverifikasi", "Status: ❌ '''Verifikasi Ditolak'''");
                 var up = con.replace("Status: 🕒 Sedang diverifikasi", "Status: ❌ '''Verifikasi Ditolak'''");
                 api.postWithToken('edit', { action: 'edit', title: config.pName, text: newT + "\n\n'''Alasan:''' " + alasan, summary: 'Rejected' })
                 api.postWithToken('edit', {action:'edit', title:pName, text:up + "\n\n'''Alasan Penolakan:''' " + alasan, summary:'Rejected'})
                 .then(function() {
                 .then(function() {
                     return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: "== Verifikasi Ditolak ==\nHalo [["+requester+"]], permohonan Anda ditolak.\n\n'''Alasan:''' " + alasan + ". --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 21.39 (UTC)", summary: 'Notice' });
                     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'});
                 }).done(function() { location.reload(); });
                 }).done(function() { location.reload(); });
             });
             });


             $('#mw-content-text').prepend($pnl.append($btnView, $btnApp, $btnRej));
             $('#mw-content-text').prepend($pnl.append($btnShow, $btnApp, $btnRej));
         });
         });
     }
     }
 
});
    renderBadges();
})(mediaWiki, jQuery);