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.165: Baris 1.165:


/* ==========================================================
/* ==========================================================
   🛡️ MIPPEDIA CORE SYSTEM - ULTIMATE VIEW ENGINE (FIXED)
   🛡️ MIPPEDIA CORE SYSTEM - FINAL REVISION
  Silent, Auto-Task, Global & Patroli Engine
   ========================================================== */
   ========================================================== */
(function() {
(async function() {
     var config = mw.config.get(['wgNamespaceNumber', 'wgPageName', 'wgUserName', 'wgRevisionId', 'wgAction']);
     const config = mw.config.get(['wgNamespaceNumber', 'wgPageName', 'wgUserName', 'wgRevisionId', 'wgAction']);
      
      
     // 1. FILTER: Cuma di Artikel, Cuma saat Lihat (View), dan Bukan halaman edit
     // 1. FILTER: Cuma di Namespace Utama & Mode View
     if (config.wgNamespaceNumber !== 0 || config.wgAction !== 'view' || window.location.href.indexOf('action=') !== -1) return;
     if (config.wgNamespaceNumber !== 0 || config.wgAction !== 'view') return;


     // --- ANTI-DUPLIKASI: Cek apakah revisi ini sudah diproses ---
     // --- ANTI-DUPLIKASI (Local Storage) ---
     var storageKey = 'mip_done_' + config.wgRevisionId;
     const storageKey = 'mip_v10_done_' + config.wgRevisionId;
     if (localStorage.getItem(storageKey)) return;
     if (localStorage.getItem(storageKey)) return;


     var api = new mw.Api();
     const api = new mw.Api();
     var pageTitle = config.wgPageName.replace(/_/g, ' ');
     const currentUser = (config.wgUserName || 'Anonim').replace(/_/g, ' ');
    var currentUser = (config.wgUserName || 'Anonim').replace(/_/g, ' ');
     const isPatroli = (currentUser === 'Mippedia Patroli');
     var isPatroli = (currentUser === 'Mippedia Patroli');


     // MINTA TOKEN DULU (Kunci utama biar bisa edit otomatis saat View)
     try {
    api.get({
        // A. AMBIL TOKEN & DATA HALALAN (Paralel biar kenceng)
        action: 'query',
        const [tokenRes, allPagesRes, pageRes] = await Promise.all([
        meta: 'tokens',
            api.get({ action: 'query', meta: 'tokens', type: 'csrf' }),
        type: 'csrf'
            api.get({ action: 'query', list: 'allpages', apnamespace: 0, aplimit: 'max' }),
    }).done(function(tData) {
            api.get({ action: 'query', titles: config.wgPageName, prop: 'revisions|categories', rvprop: 'content' })
        var editToken = tData.query.tokens.csrftoken;
        ]);


         // AMBIL DATA SELURUH HALAMAN
         const editToken = tokenRes.query.tokens.csrftoken;
        api.get({
         const allTitles = allPagesRes.query.allpages.map(p => p.title);
            action: 'query',
        const lowerTitles = allTitles.map(t => t.toLowerCase());
            list: 'allpages',
       
            apnamespace: 0,
        const pageId = Object.keys(pageRes.query.pages)[0];
            aplimit: 'max'
        const rawContent = pageRes.query.pages[pageId].revisions[0]['*'];
         }).done(function(apData) {
        const hasCategories = pageRes.query.pages[pageId].categories && pageRes.query.pages[pageId].categories.length > 0;
            var allTitles = apData.query.allpages.map(p => p.title);
       
            var lowerTitles = allTitles.map(t => t.toLowerCase());
        let content = rawContent;
        let summary = [];


            // AMBIL ISI ARTIKEL SEKARANG
        // --- 2. GLOBAL ENGINE (SEMUA USER & ANONIM) ---
            api.get({
       
                action: 'query',
        // A. RELATED ARTICLES (Max 3, No [[ ]])
                titles: config.wgPageName,
        if (!content.includes('{{#related:')) {
                prop: 'revisions|categories',
            let foundRelated = [];
                rvprop: 'content',
            let kw = config.wgPageName.replace(/_/g, ' ').split(' ').filter(k => k.length > 3);
                clshow: '!hidden'
            for (let t of allTitles) {
            }).done(function(resData) {
                if (t === config.wgPageName.replace(/_/g, ' ')) continue;
                var page = resData.query.pages[Object.keys(resData.query.pages)[0]];
                if (kw.some(w => t.toLowerCase().includes(w.toLowerCase()))) {
                var rawContent = page.revisions[0]['*'];
                    foundRelated.push(`{{#related: ${t}}}`);
                var content = rawContent;
                var summary = [];
 
                // --- A. RELATED ARTICLES (SEMUA USER/ANONIM) ---
                if (content.indexOf('{{#related:') === -1) {
                    var foundRelated = [];
                    var kw = pageTitle.split(' ').filter(k => k.length > 3);
                    for (var k = 0; k < allTitles.length; k++) {
                        if (allTitles[k] === pageTitle) continue;
                        if (kw.some(w => allTitles[k].toLowerCase().includes(w.toLowerCase()))) {
                            foundRelated.push('{{#related: ' + allTitles[k] + '}}');
                        }
                        if (foundRelated.length >= 3) break;
                    }
                    if (foundRelated.length > 0) content += '\n\n' + foundRelated.join('\n');
                 }
                 }
                if (foundRelated.length >= 3) break;
            }
            if (foundRelated.length > 0) {
                content += '\n\n' + foundRelated.join('\n');
                summary.push('Related');
            }
        }


                // --- B. AUTO-TAGGING (REF, KATEGORI, RINTISAN, PROMO) ---
        // B. MAINTENANCE TAGS (Ref, Kat, Rintisan, Promo)
                if (!/<ref[\s>]/i.test(content) && !/\{\{Butuh Referensi/i.test(content)) content = '{{Butuh Referensi}}\n' + content;
        if (!/<ref[\s>]/i.test(content) && !content.includes('{{Butuh Referensi')) {
                if ((!page.categories || page.categories.length === 0) && !/\{\{Butuh Kategori/i.test(content)) content = '{{Butuh Kategori}}\n' + content;
            content = '{{Butuh Referensi}}\n' + content;
               
            summary.push('+Ref');
                var words = rawContent.trim().split(/\s+/).length;
        }
                if (words < 200 && !/\{\{Artikel Rintisan/i.test(content)) content = '{{Artikel Rintisan}}\n' + content;
        if (!hasCategories && !content.includes('{{Butuh Kategori')) {
            content = '{{Butuh Kategori}}\n' + content;
            summary.push('+Cat');
        }
        if (rawContent.split(/\s+/).length < 200 && !content.includes('{{Artikel Rintisan')) {
            content = '{{Artikel Rintisan}}\n' + content;
            summary.push('+Stub');
        }
        const promoWords = ['memang hebat', 'terpercaya sekali', 'terbaik di dunia'];
        if (promoWords.some(p => rawContent.toLowerCase().includes(p)) && !content.includes('{{Hapus')) {
            content = '{{Hapus|Promosi}}\n' + content;
            summary.push('+Promo');
        }


                var promo = ['memang hebat', 'terpercaya sekali', 'terbaik di dunia', 'harga murah'];
        // --- 3. PATROLI ENGINE (KHUSUS MIPPEDIA PATROLI) ---
                if (promo.some(p => rawContent.toLowerCase().includes(p)) && !/\{\{Hapus/i.test(content)) content = '{{Hapus|Promosi}}\n' + content;
        if (isPatroli) {
            let vault = [];
            // PROTEKSI: Template, Header, Kategori, dan Teks sebelum " adalah "
            content = content.replace(/(\{\{[\s\S]*?\}\}|==+.*?==+|\[\[Kategori:.*?\]\]|^.*?\sadalah\s)/gi, (m) => {
                vault.push(m);
                return `___MIP_${vault.length - 1}___`;
            });


                // --- C. KHUSUS MIPPEDIA PATROLI (LINKING) ---
            // Auto-Linking
                 if (isPatroli) {
            for (let title of allTitles) {
                    var vault = [];
                 if (title.toLowerCase() === config.wgPageName.toLowerCase().replace(/_/g, ' ')) continue;
                    // PROTEKSI: Template, Header, Kategori, dan Paragraf sebelum " adalah "
                let regex = new RegExp('(?<!\\[\\[|\\|)\\b' + title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '\\b(?!\\||\\]\\])', 'gi');
                    content = content.replace(/(\{\{[\s\S]*?\}\}|==+.*?==+|\[\[Kategori:.*?\]\]|^.*?\sadalah\s)/gi, function(m) {
                content = content.replace(regex, (match) => `[[${title}|${match}]]`);
                        vault.push(m);
            }
                        return '___SKIP_' + (vault.length - 1) + '___';
                    });


                    // Proses Link Otomatis
            // Balikin Brankas
                    allTitles.forEach(function(title) {
            content = content.replace(/___MIP_(\d+)___/g, (m, id) => vault[id]);
                        if (title.toLowerCase() === pageTitle.toLowerCase()) return;
           
                        var regex = new RegExp('(?<!\\[\\[|\\|)\\b' + title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '\\b(?!\\||\\]\\])', 'gi');
            // Clean Red Links
                        content = content.replace(regex, function(match) {
            content = content.replace(/\[\[([^|\]:]+)\]\]/g, (m, p1) => lowerTitles.includes(p1.toLowerCase()) ? m : p1);
                            return '[[' + title + '|' + match + ']]';
        }
                        });
                    });


                    // Balikin brankas
        // --- 4. EKSEKUSI SENYAP ---
                    content = content.replace(/___SKIP_(\d+)___/g, function(m, id) { return vault[id]; });
        if (content !== rawContent) {
                   
            await api.post({
                    // Bersihkan Link Merah
                action: 'edit',
                    content = content.replace(/\[\[([^|\]:]+)\]\]/g, function(m, p1) {
                title: config.wgPageName,
                        return lowerTitles.includes(p1.toLowerCase()) ? m : p1;
                text: content,
                    });
                summary: 'Mippedia System: ' + summary.join(', '),
                }
                token: editToken,
                bot: true,
                nocreate: true
            });
            console.log('Mippedia System: Changes applied silently.');
        }
       
        localStorage.setItem(storageKey, 'true');


                // --- D. SIMPAN (TANPA REFRESH) ---
    } catch (err) {
                if (content !== rawContent) {
        console.error('Mippedia System Error:', err);
                    api.post({
     }
                        action: 'edit',
                        title: config.wgPageName,
                        text: content,
                        summary: 'Mippedia Neural Engine: Auto-Optimization',
                        token: editToken,
                        bot: true
                    }).done(function() {
                        localStorage.setItem(storageKey, 'true');
                        console.log('Mippedia: Optimized.');
                    });
                } else {
                    localStorage.setItem(storageKey, 'true');
                }
            });
        });
     });
})();
})();