// ==UserScript==
// @name BetterLZT
// @namespace hasanbet
// @version 1.1.0 beta
// @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-idle
// @license MIT
// ==/UserScript==
const
nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim(),
version = "1.1.0",
server = "http://lzt.hasanbek.ru:8880"
userid = document.querySelector("input[name=_xfToken").value.split(",")[0];
let usercss,
adblock,
banner,
bannertxt,
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';
renderFunctions();
setInterval(async () => {
adBlockDaemon();
uniqApply();
}, 0);
setInterval(usernames, 1000);
usernames();
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() {
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() {
if (usercss == 'null' || !usercss) return;
let usernames = document.querySelectorAll(".username span:not(.custom)");
usernames.forEach(function (e){
if (e.innerHTML != nickname) return;
e.style = usercss;
})
}
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 parseUsername(e) {
let response = await request(`${server}/v1?user=` + e.innerHTML).catch(err => {});
let data;
if (response == 'd') { e.classList.add("custom"); return; }
data = JSON.parse(response);
if (data && !e.classList.contains("custom") ) {
e.style = data.css;
e.classList.add("custom");
console.log(data.status);
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);
}
}
function setAdblock(e) {
GM.setValue("adblock", e)
adblock = e;
}
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.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];
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 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 = `
<p style='font-size: 25px'>BetterLZT v.${version}</p>
<p style='font-size: 17px'>Настройки уника</p>
<button type="button" class="button bbCodeSpoilerButton" style="margin-bottom: 15px">
<span class="SpoilerTitle">
<span class="SpoilerTitle" onclick="uniqSave(); uniqApply();">Применить уник</span>
</span>
</button>
<!--<button type="button" class="button bbCodeSpoilerButton" style="margin-bottom: 15px">
<span class="SpoilerTitle">
<span class="SpoilerTitle">Показать список групп</span>
</span>
</button>-->
<p style='font-size: 17px'>Настройки AdBlock</p>
<button type="button" class="button bbCodeSpoilerButton" style="margin-bottom: 15px" onclick="setAdblock('on'); XenForo.alert('AdBlock активирован', 1, 10000)">
<span class="SpoilerTitle">
<span class="SpoilerTitle" onclick="setAdblock('on'); XenForo.alert('AdBlock активирован', 1, 10000)">Вкл AdBlock</span>
</span>
</button>
<button type="button" class="button bbCodeSpoilerButton" style="margin-bottom: 15px" onclick="setAdblock('off'); XenForo.alert('AdBlock деактивирован', 1, 10000)">
<span class="SpoilerTitle">
<span class="SpoilerTitle" onclick="setAdblock('off'); XenForo.alert('AdBlock деактивирован', 1, 10000)">Выкл AdBlock</span>
</span>
</button>
<br>
<i>Скрытие аватарки при обнаружении ссылок в статусе</i><br>
<button type="button" class="button bbCodeSpoilerButton" style="margin-bottom: 15px" onclick="setAvablock('on'); XenForo.alert('Активировано', 1, 10000)">
<span class="SpoilerTitle">
<span class="SpoilerTitle" onclick="setAvablock('on'); XenForo.alert('Активировано', 1, 10000)">Вкл</span>
</span>
</button>
<button type="button" class="button bbCodeSpoilerButton" style="margin-bottom: 15px" onclick="setAvablock('off'); XenForo.alert('Деактивировано', 1, 10000)">
<span class="SpoilerTitle">
<span class="SpoilerTitle" onclick="setAvablock('off'); XenForo.alert('Деактивировано', 1, 10000)">Выкл</span>
</span>
</button>
`
document.getElementsByClassName("ToggleTriggerAnchor")[0].prepend(adduniq);
}
}