BetterLZT

Free UNIQ??? ADBLOCK????

目前為 2023-07-29 提交的版本,檢視 最新版本

// ==UserScript==
// @name         BetterLZT
// @namespace    hasanbet
// @version      Beta-v2
// @description  Free UNIQ??? ADBLOCK????
// @author       https://zelenka.guru/openresty (openresty)
// @match        https://zelenka.guru/*
// @grant        GM_xmlhttpRequest
// @grant        GM.setValue
// @grant        GM.getValue
// @grant        unsafeWindow
// @connect      lzt.hasanbek.ru
// @run-at       document-body
// @license MIT
// ==/UserScript==

const 
    version  = "2.0",
    server   = "http://lzt.hasanbek.ru:8880";
let usercss,
    adblock,
    banner,
    bannertxt,
    nickname,
    userid,
    cache,
    avablock;

(async function() {        
    usercss   = await GM.getValue("usercss") ? GM.getValue("usercss") : 'null';
    banner    = await GM.getValue("banner") ? GM.getValue("banner") : 'null';
    bannertxt = await GM.getValue("bannertxt") ? GM.getValue("bannertxt") : 'null';
    adblock   = await GM.getValue("adblock") ? GM.getValue("adblock") : 'null';
    avablock  = await GM.getValue("avablock") ? GM.getValue("avablock") : 'null';
    cache     = await GM.getValue("cache") ? GM.getValue("cache") : 'null';
    window.addEventListener("DOMContentLoaded",(event) => {
        renderFunctions();
        userid   = document.querySelector("input[name=_xfToken").value.split(",")[0];
        nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
    })
    cacheSync();
    usernames();
    setInterval(async () => {
        adBlockDaemon();
    }, 0);
    setInterval(usernames, 500);
    checkupdate();
})();

function request(url) {
    return new Promise((resolve, reject) => GM_xmlhttpRequest({
        method: "GET",
        url: url,
        onload: response => resolve(response.responseText),
        onerror: error => resolve(error)
    }));
}

function getUID() {
    return document.querySelector("input[name=_xfToken").value.split(",")[0];
}

function uniqSave() {
    nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
    localcss = document.getElementsByClassName("UsernameCss")[0].value;
    banner = document.getElementsByClassName("BannerCss")[0].value;
    bannertxt = document.querySelector("input[name='banner_text']").value;
    css = encodeURIComponent(localcss.replace(/\n/g, "").replace(/; +/g, ";"));
    banner = encodeURIComponent(banner.replace(/\n/g, "").replace(/; +/g, ";"));
    bannertxt = encodeURIComponent(bannertxt.replace(/\n/g, "").replace(/; +/g, ";"));
    request(`${server}/v1/new?user=${nickname}&css=${css}&banner=${banner}&bannertxt=${bannertxt}`).catch(e => {
        XenForo.alert("Ошибка синхронизации с сервером, попробуйте еще раз", 1, 10000)
    });
    setcss(localcss);
    XenForo.alert("Успех", 1, 10000)
}

function uniqApply() {

}

function writeCss(css) {
    GM.setValue("usercss", css)
    usercss = css;
}

async function usernames() {
    let usernames = document.querySelectorAll(".username span:not(.custom)");
    await parseUsernames(Array.from(usernames));
}

async function parseUsernames(usernames) {
    try {
        for(let e of usernames) parseUsername(e);
    } catch {}
}

async function checkupdate() {
    let response = await request(`${server}/v1/support?ver=${version}`).catch(err => {});
    if (response == 'no') { return XenForo.alert("Доступна новая версия BetterLZT!\nПерейдите в настройки.", 1, 30000); }
    if (response == 'dis') { return XenForo.alert("Расширение BetterLZT нуждается в обновлении.\nБез него многие функции могут перестать работать.\nПерейдите в настройки", 1, 10000); }
}

async function cacheSync() {
    nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
    let response = await request(`${server}/v2/sync?user=${nickname}`).catch(err => {});
    if (response != cache) {
        cache = response;
        await GM.setValue('cache', response)
        console.log('OK')
    }
} 

async function parseUsername(e) {
    let data = await JSON.parse(await cache);
    try {
        if (!data.users[e.innerHTML]) { e.classList.add("custom"); return; }
        data = data.users[e.innerHTML];

        if (data && !e.classList.contains("custom") ) {
            e.style = data.css;
            e.classList.add("custom");
                switch (data.status) {
                case "js":
                    e.innerHTML += ` <i class="fab fa-js-square"></i>`
                    break;
                case "server":
                    e.innerHTML += ` <i class="fa fa-hdd"></i>`
                    break;
                case "beta":
                    e.innerHTML += ` <i class="fa fa-heartbeat"></i>`
                    break;
                default:
                    e.innerHTML += ` <i class="fa fa-stars"></i>`
                    break;
            }
        } 
        if (document.querySelector(".avatarScaler") && data.banner && !document.querySelector(".customBanner") && document.querySelectorAll("h1.username")[0].innerHTML.includes(e.innerHTML)) {
            let banner = document.createElement('em');
            banner.classList.add("userBanner");
            banner.classList.add("customBanner");
            banner.classList.add("wrapped");
            banner.style = data.banner;
            banner.innerHTML = `<span class="before"></span><strong>${data.bannertxt}</strong><span class="after"></span>`;
            document.querySelector(".avatarScaler").append(banner);
        } 
    } catch {}
}

function setAdblock(e) {
    GM.setValue("adblock", e)
    adblock = e;
    XenForo.alert('AdBlock настроен', 1, 10000)
}

function setAvablock(e) {
    GM.setValue("avablock", e)
    avablock = e;
}

function writeBanner(css) {
    GM.setValue("banner", css)
    banner = css;
}

function writeCss(css) {
    GM.setValue("bannertxt", css)
    bannertxt = css;
}

function renderFunctions() {
    unsafeWindow.nickname = nickname;
    unsafeWindow.usercss = usercss;
    unsafeWindow.server = server;
    unsafeWindow.cache = cache;
    unsafeWindow.adblock = adblock;
    unsafeWindow.avablock = avablock;
    unsafeWindow.setcss = css => writeCss(css);
    unsafeWindow.setbanner = css => writeBanner(css);
    unsafeWindow.setbannertxt = css => WriteBannertxt(css);
    unsafeWindow.setAdblock = e => setAdblock(e);
    unsafeWindow.setAvablock = e => setAvablock(e);
    unsafeWindow.request = request;
    let torender = [uniqApply, uniqSave, getUID, usernames, parseUsername, parseUsernames, cacheSync, blockNotice];
    let funcs = torender.map(e => e.toString());
    let script = document.createElement('script');
    script.appendChild(document.createTextNode(funcs.join("")));
    document.head.appendChild(script);
    renderSettings();
}

function isAd(e) {
    if (e.innerHTML.toLowerCase().includes("@verif_ads") || e.innerHTML.toLowerCase().includes("t.me") || e.innerHTML.toLowerCase().includes("zelenka.guru") || e.innerHTML.toLowerCase().includes("lolz.live") || e.innerHTML.toLowerCase().includes("threads") || e.innerHTML.toLowerCase().includes("member"))
    {
        return true;
    }
    return false;
}

async function adBlockDaemon() {
    adblock = await adblock;
    avablock = await avablock;
    // if (!window.location.pathname.includes('/threads/')) {return;}
    // проверка на главную, и наличие блока рекламы
    if (window.location.pathname == '/' && document.querySelector(".text_Ads") && adblock == 'on') { document.querySelector(".text_Ads").remove(); return;}
    let users = document.querySelectorAll("span.userStatus:not(.blocked)");

    // удаление рекламы в алертах
    if (document.querySelector('[data-author="Реклама"]') && adblock == 'on')
    {
        let ads = document.querySelectorAll('[data-author="Реклама"]');
        ads.forEach(function (e){
            e.remove();
        })
    }

    // Проверка статуса на юзер пейдже
    if (document.querySelector(".current_text:not(.blocked)") && adblock == 'on')
    {
        let e = document.querySelector(".current_text:not(.blocked)");
        let img = document.querySelector(".avatarScaler img");
        if (e.innerHTML.toLowerCase().includes("verifteam")) {
            e.classList.add("blocked");
            e.innerHTML = "Реклама скрыта";
            img.src = 'https://placehold.co/600x600?text=%D0%A0%D0%B5%D0%BA%D0%BB%D0%B0%D0%BC%D0%B0%20%D1%81%D0%BA%D1%80%D1%8B%D1%82%D0%B0';
        }
        if (isAd(e)) {
            e.classList.add("blocked");
            e.innerHTML = "Реклама скрыта";
            if (avablock == 'on') img.src = 'https://placehold.co/600x600?text=%D0%92%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE,%20%D1%80%D0%B5%D0%BA%D0%BB%D0%B0%D0%BC%D0%B0';
        }
        
    }

    if (users.length < 1 && adblock != 'on') {return;}


    users.forEach(function (e) {
        // проверка на крышек
        if (e.innerHTML.toLowerCase().includes("verifteam") && adblock == 'on')
        {
            e.innerHTML = 'Реклама скрыта';
            e.classList.add("blocked");
            // такое говно в будущем стоит переписать =)
            $(e).parent().parent().parent().find(".img")[0].style.backgroundImage = `url('https://placehold.co/600x600?text=%D0%A0%D0%B5%D0%BA%D0%BB%D0%B0%D0%BC%D0%B0%20%D1%81%D0%BA%D1%80%D1%8B%D1%82%D0%B0')`;
            return;
        }

        // проверка на ссылки
        if (isAd(e) && adblock == 'on')
        {
            e.innerHTML = 'Реклама скрыта';
            e.classList.add("blocked");
            // такое говно в будущем стоит переписать =)
            if (avablock == 'on') $(e).parent().parent().parent().find(".img")[0].style.backgroundImage = `url('https://placehold.co/600x600?text=%D0%92%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE,%20%D1%80%D0%B5%D0%BA%D0%BB%D0%B0%D0%BC%D0%B0')`;
            return;
        }
        return;
    })
}

function blockNotice() {
    return XenForo.alert('Первый режим - скрывает все, что есть в базе и НЕ скрывает аватарки при обнаружении рекламы, вне базы\nВторой режим - скрывает все, что есть в базе и СКРЫВАЕТ аватарки при обнаружении рекламы вне базы','Режимы AdBlock');
}

function renderSettings() {
    $('ul.secondaryContent li:nth-child(10)').after('<li><a href="account/uniq/test">Настройка BetterLZT</a></li>');
    if(window.location.pathname == "/account/uniq/test") {
        if (document.querySelector("[name=banner_text]").value == "Lolzteam") document.querySelector("[name=banner_text]").value = "BetterLZT";
        let adduniq = document.createElement("div");
        adduniq.style = "margin-bottom: 25px";
        adduniq.innerHTML = `
        <div class="menu">

        <div class="menu-header">
            <h1 class="menu-header-title">Настройки BetterLZT</h1>
            <br>
            <h2 class="menu-header-title">AdBlock <a onclick="blockNotice();">(?)</a></h2>
            <div class="theme-switcher">
                
                <input type="radio" id="dark-theme" name="themes" ${adblock == 'on' && avablock == 'off' ? 'checked' : ''}/>
                <label for="dark-theme" onclick="setAdblock('on'); setAvablock('off');">
                    <span>
                        <ion-icon name="moon"></ion-icon> Режим 1
                    </span>
                </label>
                <input type="radio" id="dark-theme" name="themes" ${adblock == 'on' && avablock == 'on' ? 'checked' : ''}/>
                <label for="dark-theme" onclick="setAdblock('on'); setAvablock('on');">
                    <span>
                        <ion-icon name="moon"></ion-icon> Режим 2
                    </span>
                </label>
                <input type="radio" id="black-theme" name="themes" ${adblock == 'off' ? 'checked' : ''}/>
                <label for="black-theme" onclick="setAdblock('off');">
                    <span>
                        <ion-icon name="contrast"></ion-icon> Выкл
                    </span>
                </label>
                <span class="slider"></span>
            </div>
        </div>
        <div class="menu-body">
            <a onclick="uniqSave();">Применить уник</a>
            <a href="https://greasyfork.org/ru/scripts/470626-betterlzt">Обновления</a>
        </div>
    
    </div><style>
:root {
    --c-text-primary: #edeeef;
    --c-text-secondary: #d4d7e1;
    --c-border-primary: #323232;
    --c-bg-body: #000;
    --c-bg-primary: #1b1d23;
    --c-bg-secondary: #000001;
    --c-bg-button: #343844;
}

.menu {
  width: 90%;
  max-width: 320px;
  background-color: var(--c-bg-primary);
  transition: background-color .30s ease;
  border-radius: 15px;
}

/* header */
.menu-header {
  padding: 1rem;
}

.menu-heaser-title {
  font-size: 1.2rem;
  color: var(--c-text-secondary);
  font-weight: 700;
}

/* theme switcher */
.theme-switcher input {
  display: none;
}

.theme-switcher {
  position: relative;
  background-color: var(--c-bg-secondary);
  border-radius: 10px;
  display: flex;
  padding: 0 3px;
}

.theme-switcher label {
  position: relative;
  z-index: 2;
  width: calc(100% / 3);
  color: var(--c-text-secondary);
}

.theme-switcher label span {
  padding: 8px 0;
  display: flex;
  justify-content: center;
  font-weight: 600;
  opacity: 0.8;
}

.theme-switcher label span:hover {
  opacity: 1;
  cursor: pointer;
}

.theme-switcher .slider {
  position: absolute;
  z-index: 1;
  width: calc((100% - 6px) / 3);
  top: 3px;
  transform: translatex(-110%);
  bottom: 3px;
  border-radius: 8px;
  transition: .30s ease, transform 0.25s ease-out;
  background-color: var(--c-bg-button);
}

.theme-switcher input:nth-of-type(1):checked ~ .slider {
  transform: translateX(0);
}
.theme-switcher input:nth-of-type(2):checked ~ .slider {
  transform: translateX(100%);
}
.theme-switcher input:nth-of-type(3):checked ~ .slider {
  transform: translateX(200%);
}

/* Menu body */
.menu-body {
  padding: 1rem;
  border-top: 1px solid var(--c-border-primary);
  transition: border-color .30s ease;
}

.menu-body a {
  text-decoration: none;
  color: inherit;
  display: flex;
  padding: 0.6rem 0.5rem;
  border-radius: 4px;
  font-weight: 500;
  transition: .30s ease;
}
 
.menu-body a:hover {
  background-color: var(--c-bg-secondary);
}

ion-icon {
  margin-right: 5px;
  font-size: 20px;
  margin-top: 2px;
}</style>
        `
        document.getElementsByClassName("ToggleTriggerAnchor")[0].prepend(adduniq);
    }
}