Mudanças entre as edições de "Widget:Item"

De Wiki Gla
Ir para navegação Ir para pesquisar
m
m
Linha 294: Linha 294:
             var BURST_WINDOW_MS = 15000;
             var BURST_WINDOW_MS = 15000;
             var BURST_MAX = 18;
             var BURST_MAX = 18;
             var UNTRUSTED_MAX = 2;
             var UNTRUSTED_MAX = 3;
            var nativeFetch = window.fetch ? window.fetch.bind(window) : null;
            var nativeXHROpen = XMLHttpRequest.prototype.open;


             function isStaffUser() {
             function isStaffUser() {
Linha 374: Linha 372:
             }
             }


             function checkIntegrity() {
             function whenMwReady() {
                 if (defenseTripped || isStaffUser()) return;
                 return new Promise(function (resolve) {
                if (nativeFetch && window.fetch !== nativeFetch) {
                    if (window.mw && mw.Api) {
                    triggerDefense();
                        resolve();
                    return;
                        return;
                }
                    }
                if (XMLHttpRequest.prototype.open !== nativeXHROpen) {
                    if (window.mw && mw.loader) {
                     triggerDefense();
                        mw.loader.using("mediawiki.api").then(resolve, resolve);
                 }
                        return;
                     }
                    resolve();
                 });
             }
             }
            setInterval(checkIntegrity, 2500);
            /* Console aberto: não desliga tooltip sozinho — só se combinar com abuso */
            (function watchConsoleAccess() {
                if (isStaffUser()) return;
                var bait = {};
                var tripped = false;
                try {
                    Object.defineProperty(bait, "id", {
                        get: function () {
                            if (!tripped && !isStaffUser()) {
                                tripped = true;
                                if (tooltipFetchLog.length >= 8 || untrustedStrikes > 0) {
                                    triggerDefense();
                                }
                            }
                            return "";
                        }
                    });
                } catch (e) { return; }
                setInterval(function () {
                    if (defenseTripped || isStaffUser()) return;
                    try { console.debug(bait); } catch (e2) { /* ignore */ }
                }, 4000);
            })();


             function getApiUrl() {
             function getApiUrl() {
Linha 425: Linha 400:
                 var safeKey = String(key).replace(/\|/g, "").replace(/\}/g, "").replace(/\{/g, "");
                 var safeKey = String(key).replace(/\|/g, "").replace(/\}/g, "").replace(/\{/g, "");
                 var safeLang = String(lang || "pt-br").replace(/\|/g, "");
                 var safeLang = String(lang || "pt-br").replace(/\|/g, "");
                if (/^\d+$/.test(safeKey)) {
                    return "{{#invoke:Item|tooltip|" + safeKey + "|lang=" + safeLang + "}}";
                }
                 return "{{#invoke:Item|tooltip|key=" + safeKey + "|lang=" + safeLang + "}}";
                 return "{{#invoke:Item|tooltip|key=" + safeKey + "|lang=" + safeLang + "}}";
             }
             }


             function fetchParse(wikitext) {
             function fetchParse(wikitext) {
                 if (window.mw && mw.Api) {
                 return whenMwReady().then(function () {
                    return new mw.Api().post({
                    if (window.mw && mw.Api) {
                        action: "parse",
                        return new mw.Api().post({
                        text: wikitext,
                            action: "parse",
                        contentmodel: "wikitext",
                            text: wikitext,
                        disablelimitreport: true
                            contentmodel: "wikitext",
                    }).then(function (data) {
                            disablelimitreport: true
                        return data.parse.text["*"];
                        }).then(function (data) {
                    });
                            return data.parse.text["*"];
                }
                        });
                var body = new URLSearchParams();
                    }
                body.set("action", "parse");
                    var body = new URLSearchParams();
                body.set("format", "json");
                    body.set("action", "parse");
                body.set("text", wikitext);
                    body.set("format", "json");
                body.set("contentmodel", "wikitext");
                    body.set("text", wikitext);
                body.set("disablelimitreport", "1");
                    body.set("contentmodel", "wikitext");
                return fetch(getApiUrl(), {
                    body.set("disablelimitreport", "1");
                    method: "POST",
                    return fetch(getApiUrl(), {
                    credentials: "same-origin",
                        method: "POST",
                    headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" },
                        credentials: "same-origin",
                    body: body.toString()
                        headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" },
                })
                        body: body.toString()
                    .then(function (res) { return res.json(); })
                    })
                    .then(function (data) {
                        .then(function (res) { return res.json(); })
                        if (data.error) throw new Error(data.error.info || "API parse failed");
                        .then(function (data) {
                        return data.parse.text["*"];
                            if (data.error) throw new Error(data.error.info || "API parse failed");
                    });
                            return data.parse.text["*"];
                        });
                });
             }
             }


Linha 529: Linha 509:
             }
             }


             function showTooltip(wrapper) {
             function showLegacyTooltip(wrapper) {
                var tip = wrapper.querySelector(".item-tooltip");
                if (!tip) return;
 
                activeWrapper = wrapper;
                activeTip = tip;
                document.body.appendChild(tip);
                positionTooltip(tip, wrapper);
            }
 
            function showLazyTooltip(wrapper) {
                 if (defenseTripped) return;
                 if (defenseTripped) return;
                if (wrapper === activeWrapper && activeTip) return;
                hideTooltip();


                 var key = wrapper.getAttribute("data-item-key");
                 var key = wrapper.getAttribute("data-item-key");
Linha 548: Linha 535:


                     wrapper.classList.remove("item-tooltip-loading");
                     wrapper.classList.remove("item-tooltip-loading");
                     if (!html || !html.trim()) return;
                     if (!html || !html.trim()) {
                        console.warn("[Widget:Item] tooltip vazia para key=" + key);
                        return;
                    }


                     var tmp = document.createElement("div");
                     var tmp = document.createElement("div");
                     tmp.innerHTML = html.trim();
                     tmp.innerHTML = html.trim();
                     var tip = tmp.querySelector(".item-tooltip") || tmp.firstElementChild;
                     var tip = tmp.querySelector(".item-tooltip") || tmp.firstElementChild;
                     if (!tip) return;
                     if (!tip) {
                        console.warn("[Widget:Item] HTML sem .item-tooltip para key=" + key, html.substring(0, 200));
                        return;
                    }


                     activeTip = tip;
                     activeTip = tip;
                     document.body.appendChild(tip);
                     document.body.appendChild(tip);
                     positionTooltip(tip, wrapper);
                     positionTooltip(tip, wrapper);
                 }).catch(function () {
                 }).catch(function (err) {
                    console.warn("[Widget:Item] fetch tooltip falhou key=" + key, err);
                     if (gen === tooltipGen && activeWrapper === wrapper) {
                     if (gen === tooltipGen && activeWrapper === wrapper) {
                         wrapper.classList.remove("item-tooltip-loading");
                         wrapper.classList.remove("item-tooltip-loading");
Linha 564: Linha 558:
                     }
                     }
                 });
                 });
            }
            function showTooltip(wrapper) {
                if (wrapper === activeWrapper && activeTip) return;
                hideTooltip();
                if (wrapper.querySelector(".item-tooltip")) {
                    showLegacyTooltip(wrapper);
                    return;
                }
                if (wrapper.classList.contains("item-has-tooltip") && wrapper.getAttribute("data-item-key")) {
                    showLazyTooltip(wrapper);
                }
             }
             }


Linha 571: Linha 578:
                     return;
                     return;
                 }
                 }
                 var wrapper = e.target.closest ? e.target.closest(".item-wrapper.item-has-tooltip") : null;
                 var wrapper = e.target.closest ? e.target.closest(".item-wrapper") : null;
                 if (wrapper && wrapper !== activeWrapper) {
                 if (!wrapper || wrapper === activeWrapper) return;
                if (wrapper.querySelector(".item-tooltip") ||
                    (wrapper.classList.contains("item-has-tooltip") && wrapper.getAttribute("data-item-key"))) {
                     showTooltip(wrapper);
                     showTooltip(wrapper);
                 }
                 }

Edição das 19h24min de 28 de maio de 2026