BetterLZT

Сделай свой жизнь на LolzTeam проще!

  1. // ==UserScript==
  2. // @name BetterLZT
  3. // @namespace hasanbet
  4. // @version v46
  5. // @description Сделай свой жизнь на LolzTeam проще!
  6. // @author https://zelenka.guru/lays (openresty)
  7. // @match https://zelenka.guru/*
  8. // @match https://lolz.live/*
  9. // @match https://lzt.market/*
  10. // @match https://zelenka.market/*
  11. // @match https://lolz.market/*
  12. // @grant GM_xmlhttpRequest
  13. // @grant GM.setValue
  14. // @grant GM.getValue
  15. // @grant unsafeWindow
  16. // @connect lzt.hasanbek.ru
  17. // @connect localhost
  18. // @run-at document-body
  19. // @icon https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru
  20. // @license MIT
  21. // ==/UserScript==
  22. // 5.0.1.1
  23. const
  24. version = "5.0 (beta 1)",
  25. blzt_link_tos = "https://zelenka.guru/threads/5816508/",
  26. blzt_link_trust = "https://zelenka.guru/threads/5821466/",
  27. server = "http://lzt.hasanbek.ru:8880",
  28. adlist_w = ["zelenka.guru/threads/3649746", "http://proxysoxy.com", "zelenka.guru/threads/2770783", "https://t.me/talkthenews", "https://zelenka.guru/threads/5862277/", "zelenka.guru/threads/5802663/", "@UniServBot", "zelenka.guru/threads/5886612", "https://zelenka.guru/threads/5830418/", "zelenka.guru/angeldrainer/", "zelenka.guru/threads/5883557", "zelenka.guru/threads/5720998", "https://zelenka.guru/threads/5488501", "https://zelenka.guru/threads/4871985/", "zelenka.guru/threads/3649746", "zelenka.guru/threads/5402454", "zelenka.guru/threads/2630352", "https://t.me/poseidon_project", "https://zelenka.guru/threads/4826265/", "zelenka.guru/threads/4939541", "zelenka.guru/threads/4073607", "zelenka.guru/threads/5071761/", "https://zelenka.guru/threads/3695705/", "zelenka.guru/members/4177803", "@verif_ads", "verifteam", "SmmPanelUS.com", "lteboost.ru"],
  29. adlist_l = ["threads", "members", "lolz.live", "zelenka.guru", "t.me"],
  30. adlist_white = ["zelenka.guru/threads/5545248/", "https://zelenka.guru/extasystudio/"];
  31. let usercfg,
  32. adblock,
  33. nickname,
  34. userid,
  35. cache,
  36. secure,
  37. hidelike,
  38. secretph,
  39. marketblock,
  40. theme,
  41. avamarket,
  42. avablock,
  43. contestblock,
  44. uniqstatus,
  45. reportbtns;
  46. (async function() {
  47. usercfg = await GM.getValue("usercfg") ? GM.getValue("usercfg") : `{'cfg': {}}`
  48. adblock = await GM.getValue("adblock") ? GM.getValue("adblock") : 'null';
  49. avablock = await GM.getValue("avablock") ? GM.getValue("avablock") : 'null';
  50. cache = await GM.getValue("cache") ? GM.getValue("cache") : 'null';
  51. secure = await GM.getValue("secure") ? GM.getValue("secure") : 'not';
  52. hidelike = await GM.getValue("hidelike") ? GM.getValue("hidelike") : 'null';
  53. marketblock = await GM.getValue("marketblock") ? GM.getValue("marketblock") : 'null';
  54. secretph = await GM.getValue("secretph") ? GM.getValue("secretph") : 'not';
  55. theme = await GM.getValue("theme") ? GM.getValue("theme") : 'null';
  56. avamarket = await GM.getValue("avamarket") ? GM.getValue("avamarket") : 'null';
  57. uniqstatus = await GM.getValue("uniqstatus") ? GM.getValue("uniqstatus") : 'null';
  58. contestblock= await GM.getValue("contestblock") ? GM.getValue("contestblock") : 'null';
  59. reportbtns = await GM.getValue("reportbtns") ? GM.getValue("reportbtns") : 'null';
  60. window.addEventListener("DOMContentLoaded",async (event) => {
  61. profileRender();
  62. usernames();
  63. themeRender();
  64. renderFunctions();
  65. userid = document.querySelector("input[name=_xfToken").value.split(",")[0];
  66. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  67. cacheSync();
  68. marketRender();
  69. threadRender();
  70. checkupdate();
  71. })
  72. setInterval(async () => {
  73. adBlockDaemon();
  74. daemon();
  75. }, 0);
  76. setInterval(usernames, 500);
  77. })();
  78. async function threadRender() {
  79. if (!window.location.pathname.includes('threads')) {return;}
  80. // Быстрый репорт, спасибо Jack'у
  81. const buttons = {
  82. "Флуд / Оффтоп / Спам / Бесполезная тема": {
  83. name: 'Флуд',
  84. },
  85. "Создание темы не в соответствующем разделе": {
  86. name: 'Неверный раздел',
  87. },
  88. "Неправильное оформление темы": {
  89. name: 'Неверное оформление',
  90. },
  91. }
  92. const _xfToken = document.querySelector('input[name="_xfToken"]').value;
  93. async function postData(url = '', formData) {
  94. return await fetch(url, { method: 'POST', body: formData });
  95. }
  96. function addButtonToPosts() {
  97. const blocks = document.querySelectorAll('#messageList > li');
  98. for(let block of blocks) {
  99. if (block.querySelector(".custom-button")) {
  100. continue;
  101. }
  102. for(let key in buttons) {
  103. let name = buttons[key].name;
  104. let message = buttons[key].message;
  105. let span = document.createElement('span');
  106. span.innerText = name;
  107. span.className = "custom-button";
  108. span.setAttribute('style', 'font-weight: bold; padding: 3px 10px; background: #218e5d; border-radius: 50px; margin-right: 5px; cursor: pointer;')
  109. span.onclick = function() {
  110. if(!confirm('Вы действительно хотите отправить жалобу?')) return false;
  111. let formData = new FormData();
  112. formData.append("message", key);
  113. formData.append("is_common_reason", 1);
  114. formData.append("_xfToken", _xfToken);
  115. formData.append("_xfNoRedirect", 1);
  116. formData.append("_xfToken", _xfToken);
  117. formData.append("redirect", window.location.href);
  118. postData('posts/' + block.id.split('-')[1] +'/report', formData);
  119. XenForo.alert('Жалоба отправлена', '', 5000);
  120. }
  121. if(block.querySelector('.publicControls')) block.querySelector('.publicControls').prepend(span);
  122. }
  123. }
  124. }
  125. if (await reportbtns == 'on') {
  126. addButtonToPosts();
  127. const observer = new MutationObserver(function(mutations) {
  128. mutations.forEach(function(mutation) {
  129. if (mutation.type === 'childList') {
  130. addButtonToPosts();
  131. }
  132. });
  133. });
  134. observer.observe(document.getElementById('messageList'), { childList: true });
  135. }
  136. }
  137. async function daemon() {
  138. let nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  139. if (document.querySelector("input[name=secret_answer]:not(.completed)") && await secretph != 'null') {
  140. document.querySelector("input[name=secret_answer]:not(.completed)").value = await secretph;
  141. document.querySelector("input[name=secret_answer]:not(.completed)").classList.add("completed")
  142. }
  143. // Сканирование bb-кодов в треде (они должны быть самыми первыми)
  144. if (document.location.pathname.includes('threads') && document.querySelector("blockquote")) {
  145. if (document.querySelector("blockquote").innerHTML.trim().includes("betterfast")) return;
  146. }
  147. return;
  148. }
  149. async function themeRender() {
  150. let usernickt = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  151. let data = await JSON.parse(await cache);
  152. data = data.users[usernickt];
  153. if (data) {
  154. if (data.profilebg != 'null') {
  155. if (!document.querySelector(".avatarScaler")) {
  156. document.querySelector("body").style = `
  157. background-size: cover;
  158. background-position: center;
  159. background-attachment: fixed;
  160. background-repeat: no-repeat;
  161. background-image: linear-gradient(rgba(54, 54, 54, 0.85), rgba(54, 54, 54, 0.85)), url('${data.profilebg}')`
  162. }
  163. }
  164. }
  165. // акцент профиля
  166. // .messageSimple .secondaryContent .darkBackground .tabs .simpleRedactor .pageNavLinkGroup
  167. if (data && data.maincolor) {
  168. if (!document.querySelector(".avatarScaler")) {
  169. styles = `#header, .messageSimple, .discussionList, .sidebar .sidebarWrapper, .secondaryContent, .darkBackground, .tabs, .simpleRedactor, .pageNavLinkGroup {background: ${data.maincolor};} .page_top {border-bottom: 0;} .counts_module {border-top: 0;}`
  170. let styleSheet = document.createElement("style")
  171. styleSheet.innerText = styles;
  172. document.head.appendChild(styleSheet);
  173. }
  174. }
  175. if(await theme != 'null') {
  176. var link = document.createElement( "link" );
  177. link.href = "https://lzt.hasanbek.ru/better/css/" + await theme + ".css";
  178. link.type = "text/css";
  179. link.rel = "stylesheet";
  180. document.getElementsByTagName( "head" )[0].appendChild( link );
  181. }
  182. }
  183. async function profileRender() {
  184. if (!document.querySelector(".avatarScaler")) return false;
  185. // ид юзера
  186. const id = /market\/user\/(\d+)\/items/.exec(document.querySelector('.userContentLinks .button[href^="market/"]').href)[1];
  187. idhtml = document.createElement("div");
  188. idhtml.innerHTML = `<div class="clear_fix profile_info_row"><div class="label fl_l">ID пользователя:</div><div class="labeled">${id}<span data-phr="ID скопирован в буфер обмена" onclick="Clipboard.copy(${id}, this)" class="copyButton Tooltip" title="" data-cachedtitle="Скопировать ID" tabindex="0"><i class="far fa-clone" aria-hidden="true"></i>
  189. </span></div></div>`;
  190. document.querySelector(".profile_info_row").prepend(idhtml)
  191. // фон профиля
  192. let usernickt = document.querySelector("h1.username span").innerHTML.replace(/ <i.*?>.*?<\/i>/ig,'');
  193. let data = await JSON.parse(await cache);
  194. data = data.users[usernickt];
  195. if (data && data.profilebg) {
  196. document.querySelector("body").style = `
  197. background-size: cover;
  198. background-position: center;
  199. background-attachment: fixed;
  200. background-repeat: no-repeat;
  201. background-image: linear-gradient(rgba(54, 54, 54, 0.85), rgba(54, 54, 54, 0.85)), url('${data.profilebg}')`;
  202. }
  203. // акцент профиля
  204. // .messageSimple .secondaryContent .darkBackground .tabs .simpleRedactor .pageNavLinkGroup
  205. if (data && data.maincolor) {
  206. styles = `#header, .messageSimple, .discussionList, .sidebar .sidebarWrapper, .secondaryContent, .darkBackground, .tabs, .simpleRedactor, .pageNavLinkGroup {background: ${data.maincolor};} .page_top {border-bottom: 0;} .counts_module {border-top: 0;}`
  207. let styleSheet = document.createElement("style")
  208. styleSheet.innerText = styles;
  209. document.head.appendChild(styleSheet);
  210. }
  211. // Скрытие лайков
  212. if (await hidelike=='on') document.querySelectorAll(".page_counter")[1].remove();
  213. // TrustFactor
  214. trustFactor();
  215. }
  216. async function trustFactor() {
  217. let usertrust = 0;
  218. let user_symps = parseInt(document.querySelector(".page_counter .count").innerHTML.replace(' ', '')),
  219. user_nick = document.querySelector("h1.username span").innerHTML.replace(/ <i.*?>.*?<\/i>/ig,''),
  220. user_role = document.querySelector("h1.username span").classList,
  221. user_insurance = parseInt(document.querySelector('h3.amount').innerHTML.replaceAll(' ','').replace('₽',''));
  222. const depositLevels = [
  223. { level: 10000, trustVal: 10 },
  224. { level: 20000, trustVal: 5 },
  225. { level: 50000, trustVal: 5 },
  226. { level: 100000, trustVal: 10 },
  227. { level: 200000, trustVal: 5 },
  228. { level: 300000, trustVal: 5 },
  229. { level: 500000, trustVal: 15 },
  230. { level: 700000, trustVal: 20 }
  231. ];
  232. const sympsLevels = [
  233. { level: 500, trustVal: 10 },
  234. { level: 1000, trustVal: 15 },
  235. { level: 1700, trustVal: 10 },
  236. { level: 3500, trustVal: 5 },
  237. { level: 5000, trustVal: 10 },
  238. { level: 7000, trustVal: 15 },
  239. { level: 10000, trustVal: 10 },
  240. { level: 20000, trustVal: 10 },
  241. { level: 30000, trustVal: 15 },
  242. { level: 40000, trustVal: 5 },
  243. { level: 50000, trustVal: 5 }
  244. ];
  245. const roleLevels = [
  246. { level: 3, trustVal: 85 },
  247. { level: 4, trustVal: 25 },
  248. { level: 30, trustVal: 35 },
  249. { level: 365, trustVal: 15 },
  250. { level: 353, trustVal: 40 },
  251. { level: 12, trustVal: 35 },
  252. { level: 349, trustVal: 20 },
  253. { level: 350, trustVal: 40 },
  254. { level: 354, trustVal: 35 },
  255. { level: 7, trustVal: 30 },
  256. { level: 26, trustVal: 1 }
  257. ];
  258. for (const level of depositLevels) {
  259. if (user_insurance > level.level) {
  260. usertrust += level.trustVal;
  261. }else break;
  262. }
  263. for (const level of sympsLevels) {
  264. if (user_symps > level.level) {
  265. usertrust += level.trustVal;
  266. }else break;
  267. }
  268. for (const level of roleLevels) {
  269. if (user_role.contains("banned")) {usertrust = 0; break;}
  270. if (user_role.contains("style"+level.level)) {
  271. usertrust += level.trustVal;
  272. }else break;
  273. }
  274. if(usertrust > 100) usertrust = 100;
  275. // переписать
  276. if (usertrust > 15 && usertrust < 35)
  277. {
  278. blzt_trust_text = 'Плохой (1/4)';
  279. blzt_trust_color = 'redc';
  280. }
  281. else if (usertrust >= 35 && usertrust < 65)
  282. {
  283. blzt_trust_text = 'Нормальный (2/4)';
  284. blzt_trust_color = 'mainc';
  285. }
  286. else if (usertrust >= 65 && usertrust < 84)
  287. {
  288. blzt_trust_text = 'Отличный (3/4)';
  289. blzt_trust_color = 'mainc';
  290. }
  291. else if (usertrust >= 84)
  292. {
  293. blzt_trust_text = 'Наивысший(4/4)';
  294. blzt_trust_color = 'mainc';
  295. }
  296. else {
  297. blzt_trust_text = 'Ужасный (0/4)';
  298. blzt_trust_color = 'redc';
  299. }
  300. let blzt_trust = document.querySelector(".insuranceDeposit");
  301. let blzt_trust_render = `
  302. <br>
  303. <div class="section insuranceDeposit">
  304. <div class="secondaryContent">
  305. <h3>
  306. <a href="${blzt_link_trust}" class="OverlayTrigger username" style="max-width: 200px; word-wrap: break-word;">
  307. Уровень доверия к ${user_nick}
  308. </a>
  309. </h3>
  310. <h3 style="margin-bottom: 0px; font-size: 18px !important;" class="amount ${blzt_trust_color}" title="${usertrust}">
  311. ${blzt_trust_text}
  312. </h3>
  313. <div style="margin-top: 15px; display: flex; gap: 5px;">
  314. <a class="button leftButton primary" onclick="goodTrust(${usertrust})">👍</a>
  315. <a class="button rightButton primary" onclick="badTrust(${usertrust})">👎</a>
  316. </div>
  317. </div>
  318. </div>`;
  319. let blzt_trust_block = document.createElement("div");
  320. blzt_trust_block.innerHTML = blzt_trust_render;
  321. blzt_trust.append(blzt_trust_block);
  322. console.log(`[BetterLZT] Фактор доверия ${user_nick} = ${usertrust} (${blzt_trust_text})`)
  323. }
  324. function badTrust(trust) {
  325. let html = `
  326. <p>Почему вы считаете, что рейтинг завышен? Выберите один из вариантов (Кликните)</p>
  327. <div>
  328. <a class="container" style="color: rgb(34,142,93);" onclick="commitVote('scam', ${trust}, '-4points')">
  329. Пользователь занимался/занимается скамом, и это доказано
  330. </a>
  331. <a class="container" style="color: rgb(34,142,93);" onclick="commitVote('toxic', ${trust}, '-4points')">
  332. Этот пользователь оскорбил меня/другого человека без оснований
  333. </a>
  334. <a class="container" style="color: rgb(34,142,93);" onclick="commitVote('reporter', ${trust}, '-4points')">
  335. Этот пользователь занимается "Абузом жалоб"
  336. </a>
  337. </div>
  338. <p>Спасибо за Ваш вклад в BetterLZT</p>
  339. `;
  340. XenForo.alert(html, "BetterLZT > Фактор доверия");
  341. }
  342. function goodTrust(trust) {
  343. let html = `
  344. <p>Почему вы считаете, что рейтинг занижен? Выберите один из вариантов (Кликните)</p>
  345. <div>
  346. <a class="container" style="color: rgb(34,142,93);" onclick="commitVote('goodseller', ${trust}, '+3points')">
  347. Пользователь занимается торговлей на маркете/форуме и имеет более 90% положительных отзывов
  348. </a>
  349. <a class="container" style="color: rgb(34,142,93);" onclick="commitVote('helper', ${trust}, '+3points')">
  350. Этот пользователь помог мне (финансово/морально/физически)
  351. </a>
  352. <a class="container" style="color: rgb(34,142,93);" onclick="commitVote('inovator', ${trust}, '+3points')">
  353. Этот пользователь принес форуму что-то новое (Предложил функционал, как пример)
  354. </a>
  355. </div>
  356. <p>Спасибо за Ваш вклад в BetterLZT</p>
  357. `;
  358. XenForo.alert(html, "BetterLZT > Фактор доверия");
  359. }
  360. async function commitVote(reason, trust, type) {
  361. if (!reason) return XenForo.alert("Укажите комментарий!", 1, 10000);
  362. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  363. let blzt_puser_likes = parseInt(document.querySelector(".page_counter .count").innerHTML.replace(' ', ''));
  364. let blzt_puser_nick = document.querySelector("h1.username span"),
  365. blzt_puser_nick_val = blzt_puser_nick.innerHTML.replace(/ <i.*?>.*?<\/i>/ig,'').replace(/<img.*?>/g,''),
  366. blzt_puser_role = blzt_puser_nick.classList,
  367. blzt_puser_deposit = parseInt(document.querySelector('h3.amount').innerHTML.replaceAll(' ','').replace('₽',''));
  368. if (nickname == blzt_puser_nick_val) {
  369. return XenForo.alert("Остановись! Саморепорт карается баном в системе фактора доверия!", 1, 10000)
  370. }
  371. let response = await request(`${server}/v6/report?user=${nickname}&originuser=${blzt_puser_nick_val}&originurl=${window.location.pathname}&originaction=${type}&origintrust=${trust}&origindeposit=${blzt_puser_deposit}&originlikes=${blzt_puser_likes}&comment=${reason}`)
  372. if (response == "200") {
  373. return XenForo.alert("Успех!", 1, 10000)
  374. }
  375. else if (response == "403") {
  376. return XenForo.alert("Доступ к функционалу ограничен. Свяжитесь с разработчиком", 1, 10000)
  377. }
  378. else {
  379. return XenForo.alert("Ошибка", 1, 10000)
  380. }
  381. }
  382. function request(url) {
  383. return new Promise((resolve, reject) => GM_xmlhttpRequest({
  384. method: "GET",
  385. url: url,
  386. onload: response => resolve(response.responseText),
  387. onerror: error => resolve(error)
  388. }));
  389. }
  390. function getUID() {
  391. return document.querySelector("input[name=_xfToken").value.split(",")[0];
  392. }
  393. async function uniqDel() {
  394. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  395. if (secure == 'null') {
  396. await setSecure(`${document.querySelector("input[name=_xfToken").value.split(",")[0]+document.querySelector("input[name=_xfToken").value.split(",")[1]}`);
  397. }
  398. let req = await request(`${server}/se/del?user=${nickname}&css=${css}&banner=${banner}&bannertxt=${bannertxt}&svgcss=${svgcss}&svg=${svg}`).catch(e => {
  399. XenForo.alert("Ошибка синхронизации с сервером, попробуйте еще раз", 1, 10000)
  400. });
  401. if (await req != '200' && req != '401') {
  402. XenForo.alert("Ошибка синхронизации с сервером, свяжитесь с разработчиком t.me/hasantigiev or zelenka.guru/lays", 1, 10000)
  403. }
  404. if (await req == '401') {
  405. XenForo.alert("Для вашего профиля не найдены ключи авторизации. Cвяжитесь с разработчиком t.me/hasantigiev or zelenka.guru/lays", 1, 10000)
  406. }
  407. if (await req == '200') {
  408. XenForo.alert("Успех", 1, 10000);
  409. cacheSync();
  410. location.reload();
  411. }
  412. }
  413. async function uniqChange() {
  414. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  415. if (secure == 'null') {
  416. await setSecure(`${document.querySelector("input[name=_xfToken").value.split(",")[0]+document.querySelector("input[name=_xfToken").value.split(",")[1]}`);
  417. }
  418. let req = await request(`${server}/v6/change?user=${nickname}`).catch(e => {
  419. XenForo.alert("Ошибка синхронизации с сервером, попробуйте еще раз", 1, 10000)
  420. });
  421. if (await req != '200' && req != '401') {
  422. XenForo.alert("Ошибка синхронизации с сервером, свяжитесь с разработчиком t.me/hasantigiev or zelenka.guru/lays", 1, 10000)
  423. }
  424. if (await req == '401') {
  425. XenForo.alert("Для вашего профиля не найдены ключи авторизации. Cвяжитесь с разработчиком t.me/hasantigiev or zelenka.guru/lays", 1, 10000)
  426. }
  427. if (await req == '200') {
  428. XenForo.alert("Уник выключен", 1, 10000);
  429. cacheSync();
  430. }
  431. if (await req == '201') {
  432. XenForo.alert("Уник включен", 1, 10000);
  433. cacheSync();
  434. }
  435. }
  436. async function uniqSave() {
  437. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  438. localcss = document.getElementsByClassName("UsernameCss")[0].value;
  439. banner = document.getElementsByClassName("BannerCss")[0].value;
  440. svgcss = document.getElementsByClassName("BannerCss")[0].value;
  441. bannertxt = document.querySelector("input[name='banner_text']").value;
  442. svg = document.querySelector("textarea[name=banner_icon]").value;
  443. css = encodeURIComponent(localcss.replace(/\n/g, "").replace(/; +/g, ";"));
  444. banner = encodeURIComponent(banner.replace(/\n/g, "").replace(/; +/g, ";"));
  445. bannertxt = encodeURIComponent(bannertxt.replace(/\n/g, "").replace(/; +/g, ";"));
  446. svgcss = encodeURIComponent(svgcss.replace(/\n/g, "").replace(/; +/g, ";"));
  447. svg = encodeURIComponent(svg)
  448. if (secure == 'null') {
  449. await setSecure(`${document.querySelector("input[name=_xfToken").value.split(",")[0]+document.querySelector("input[name=_xfToken").value.split(",")[1]}`);
  450. }
  451. let req = await request(`${server}/v5/new?user=${nickname}&css=${css}&banner=${banner}&bannertxt=${bannertxt}&svgcss=${svgcss}&svg=${svg}`).catch(e => {
  452. XenForo.alert("Ошибка синхронизации с сервером, попробуйте еще раз", 1, 10000)
  453. });
  454. if (await req != '200' && req != '401') {
  455. XenForo.alert("Ошибка синхронизации с сервером, свяжитесь с разработчиком t.me/hasantigiev or zelenka.guru/lays", 1, 10000)
  456. }
  457. if (await req == '401') {
  458. XenForo.alert("Для вашего профиля не найдены ключи авторизации. Cвяжитесь с разработчиком t.me/hasantigiev or zelenka.guru/lays", 1, 10000)
  459. }
  460. if (await req == '200') {
  461. XenForo.alert("Уник отправлен на проверку. Обычно это занимает 5-10 минут.", 1, 10000);
  462. cacheSync();
  463. }
  464. document.querySelector("input[type=submit]").click();
  465. }
  466. async function usernames() {
  467. let usernames = document.querySelectorAll(".username span:not(.custom)");
  468. try {
  469. for(let e of usernames) parseUsername(e);
  470. } catch {}
  471. }
  472. async function checkupdate() {
  473. try {
  474. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  475. let response = await request(`${server}/v6/support?ver=${version}&user=${nickname}`).catch(err => {});
  476. if (response == 'no' || response == 'dis') {
  477. let waterm = document.createElement('a')
  478. waterm.style = "position:fixed;bottom:5px;right:5px;opacity:0.5;z-index:99;color:white;font-size: 25px;";
  479. waterm.innerHTML = "Для обновления BetterLZT кликните сюда";
  480. waterm.href = "https://gf.qytechs.cn/ru/scripts/470626-betterlzt"
  481. return document.body.append(waterm);
  482. }
  483. if (response == 'newbeta') {
  484. let waterm = document.createElement('h1')
  485. waterm.style = "position:fixed;bottom:5px;right:5px;opacity:0.5;z-index:99;color:white;font-size: 25px;";
  486. waterm.innerHTML = "Вы получили доступ к Beta-версии BetterLZT (t.me/hasantigiev)";
  487. return document.body.append(waterm);
  488. }
  489. } catch (error) {
  490. console.error("[BetterLZT] Failed to check update: "+error)
  491. }
  492. }
  493. async function cacheSync() {
  494. try {
  495. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  496. let response = await request(`${server}/v2/sync?user=${nickname}`).catch(err => {});
  497. if (response != cache && response != '') {
  498. cache = response;
  499. await setCache(response);
  500. console.log('OK')
  501. }
  502. } catch (error) {
  503. console.error("[BetterLZT] Sync error: "+error)
  504. }
  505. }
  506. async function setCache(e) {
  507. return await GM.setValue('cache', e);
  508. }
  509. async function setSecure(e) {
  510. return await GM.setValue('secure', e);
  511. }
  512. async function parseUsername(e) {
  513. let data = await JSON.parse(await cache);
  514. try {
  515. if (!data.users[e.innerHTML]) { e.classList.add("custom"); return; }
  516. data = data.users[e.innerHTML];
  517. if (data && !e.classList.contains("custom")) {
  518. if (data.css && data.uniq == "on" && await uniqstatus == 'on') {
  519. e.style = data.css;
  520. }
  521. e.classList.add("custom");
  522. if (data.status && await uniqstatus == 'on' && data.uniq == "on") {
  523. switch (data.status) {
  524. case "js":
  525. e.innerHTML += ` <i title="BetterLZT User" class="fab fa-js-square" style="-webkit-text-fill-color: gold;"></i>`
  526. break;
  527. case "python":
  528. e.innerHTML += ` <i class="fab fa-python" style="-webkit-text-fill-color: gold;"></i>`
  529. break;
  530. case "server":
  531. e.innerHTML += ` <i title="BetterLZT User" class="fa fa-hdd"></i>`
  532. break;
  533. case "bug":
  534. e.innerHTML += ` <i title="BetterLZT User" class="fa fa-bug"></i>`
  535. break;
  536. case "code":
  537. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-code"></i>`
  538. break;
  539. case "verified":
  540. e.innerHTML += ` <i title="BetterLZT User" class="far fa-badge-check"></i>`
  541. break;
  542. case "gold":
  543. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-spinner-third fa-spin" style="--fa-primary-color: #fe6906; --fa-secondary-color: #1a6eff; background: none; -webkit-text-fill-color: gold;"></i>`
  544. break;
  545. case "silver":
  546. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-spinner fa-spin" style="--fa-primary-color: #c0c0c0; --fa-secondary-color: #1a72ff; background: none; -webkit-text-fill-color: #c0c0c0;"></i>`
  547. break;
  548. case "beta":
  549. e.innerHTML += ` <i title="BetterLZT User" class="fa fa-heartbeat"></i>`
  550. break;
  551. case "cookie":
  552. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-cookie" style="-webkit-text-fill-color: #228e5d;"></i>`
  553. break;
  554. case "admin":
  555. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-wrench" style="-webkit-text-fill-color: rgb(150,68,72);"></i> `
  556. break;
  557. case "moderate":
  558. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-bolt" style="-webkit-text-fill-color: #12470D;"></i> `
  559. break;
  560. case "smoderate":
  561. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-bolt" style="-webkit-text-fill-color: rgb(46,162,74);"></i> `
  562. break;
  563. case "arbitr":
  564. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-gavel" style="-webkit-text-fill-color: rgb(255,154,252);"></i> `
  565. break;
  566. case "editor":
  567. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-pen" style="-webkit-text-fill-color: rgb(0,135,255);"></i> `
  568. break;
  569. case "designer":
  570. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-drafting-compass" style="-webkit-text-fill-color: #5c45ff;"></i>`
  571. break;
  572. case "designer2":
  573. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-drafting-compass" style="background: url('https://i.gifer.com/7HHu.gif');-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>`
  574. break;
  575. case "walking":
  576. e.innerHTML += ` <i title="BetterLZT User" class="fas fa-walking"></i>`
  577. break;
  578. case "usd":
  579. e.innerHTML += `<i title="BetterLZT User" class="fas fa-badge-dollar" style="background: url('https://i.gifer.com/7HHu.gif');-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>`
  580. break;
  581. case "custom":
  582. e.innerHTML += ` ${data.statusCode}`
  583. break;
  584. case "bmoder":
  585. e.innerHTML += `<i class="far fa-user-cog" title="BetterLZT Moderator" style="-webkit-text-fill-color: #810404;"></i>`;
  586. break
  587. case "sueta":
  588. e.innerHTML += `<img src="https://nztcdn.com/files/310336b3-c10e-4ad1-8fdf-0bbe73835ca1.webp" height="13px" style="margin-left: 2px; margin-right: 1px;">`;
  589. break
  590. default:
  591. e.innerHTML += ` <i title="BetterLZT User" class="fa fa-stars"></i>`
  592. break;
  593. }
  594. }
  595. }
  596. if (e.parentElement.parentElement.parentElement.parentElement.parentElement.querySelector('.avatarHolder') && data.uniq == "on" && data.svgcss && await uniqstatus == 'on') {
  597. let svg = document.createElement('div');
  598. e.parentElement.parentElement.parentElement.parentElement.parentElement.querySelector(".avatarHolder:not(.custom)")
  599. svg.classList.add("avatarUserBadges");
  600. svg.innerHTML = `
  601. <span style="${data.svgcss}" class="avatarUserBadge Tooltip ${!data.svg ? 'uniq_default' : ''}" title="${data.bannertxt}" tabindex="0" data-cachedtitle="${data.bannertxt}">
  602. <div class="customUniqIcon"> ${data.svg ? data.svg : ''} </div>
  603. </span>`;
  604. e.parentElement.parentElement.parentElement.parentElement.parentElement.querySelector(".avatarHolder").prepend(svg)
  605. }
  606. if (e.parentElement.parentElement.parentElement.parentElement.querySelector(".avatarHolder") && data.uniq == "on" && data.svgcss && await uniqstatus == 'on') {
  607. let svg = document.createElement('div');
  608. e.parentElement.parentElement.parentElement.parentElement.querySelector(".avatarHolder:not(.custom)").classList.add("custom")
  609. svg.classList.add("avatarUserBadges");
  610. svg.innerHTML = `
  611. <span style="${data.svgcss}" class="avatarUserBadge Tooltip ${!data.svg ? 'uniq_default' : ''}" title="${data.bannertxt}" tabindex="0" data-cachedtitle="${data.bannertxt}">
  612. <div class="customUniqIcon"> ${data.svg ? data.svg : ''} </div>
  613. </span>`;
  614. e.parentElement.parentElement.parentElement.parentElement.querySelector(".avatarHolder").prepend(svg)
  615. }
  616. if (await uniqstatus == 'on' && data.uniq == "on") {
  617. if (document.querySelector(".avatarScaler") && data.banner && !document.querySelector(".customBanner") && document.querySelectorAll("h1.username")[0].innerHTML.includes(e.innerHTML)) {
  618. let banner = document.createElement('em');
  619. banner.classList.add("userBanner");
  620. banner.classList.add("customBanner");
  621. banner.classList.add("wrapped");
  622. banner.style = data.banner;
  623. banner.innerHTML = `<span class="before"></span><strong>${data.bannertxt}</strong><span class="after"></span>`;
  624. document.querySelector(".avatarScaler").append(banner);
  625. }
  626. }
  627. } catch {}
  628. }
  629. function setAdblock(e) {
  630. GM.setValue("adblock", e)
  631. adblock = e;
  632. XenForo.alert('AdBlock настроен', 1, 10000)
  633. }
  634. function setLike(e) {
  635. GM.setValue("hidelike", e)
  636. hidelike = e;
  637. XenForo.alert('BetterLZT> Успех!', 1, 10000)
  638. }
  639. function setAva(e) {
  640. GM.setValue("avamarket", e)
  641. avamarket = e;
  642. XenForo.alert('BetterLZT> Успех!', 1, 10000)
  643. }
  644. function setUniq(e) {
  645. GM.setValue("uniqstatus", e)
  646. uniqstatus = e;
  647. XenForo.alert('BetterLZT> Успех!', 1, 10000)
  648. }
  649. function setContest(e) {
  650. GM.setValue("contestblock", e)
  651. contestblock = e;
  652. XenForo.alert('BetterLZT> Успех!', 1, 10000)
  653. }
  654. function setReport(e) {
  655. GM.setValue("reportbtns", e)
  656. reportbtns = e;
  657. XenForo.alert('BetterLZT> Успех!', 1, 10000)
  658. }
  659. function setSecretph(e) {
  660. GM.setValue("secretph", e)
  661. hidelike = e;
  662. XenForo.alert('BetterLZT> Успех!', 1, 10000);
  663. }
  664. function setMarketblock(e) {
  665. GM.setValue("marketblock", e)
  666. marketblock = e;
  667. XenForo.alert('BetterLZT> Успех!', 1, 10000)
  668. }
  669. function setTheme(e) {
  670. GM.setValue("theme", e)
  671. marketblock = e;
  672. XenForo.alert('BetterLZT> Успех!', 1, 10000)
  673. }
  674. function renderFunctions() {
  675. unsafeWindow.nickname = nickname;
  676. unsafeWindow.server = server;
  677. unsafeWindow.cache = cache;
  678. unsafeWindow.version = version;
  679. unsafeWindow.adblock = adblock;
  680. unsafeWindow.hidelike = hidelike;
  681. unsafeWindow.marketblock = marketblock;
  682. unsafeWindow.avamarket = avamarket;
  683. unsafeWindow.secure = secure;
  684. unsafeWindow.theme = theme;
  685. unsafeWindow.uniqstatus = uniqstatus
  686. unsafeWindow.reportbtns = reportbtns
  687. unsafeWindow.setAdblock = e => setAdblock(e);
  688. unsafeWindow.setMarketblock = e => setMarketblock(e);
  689. unsafeWindow.setCache = e => setCache(e);
  690. unsafeWindow.setSecure = e => setSecure(e);
  691. unsafeWindow.setSecretph = e => setSecretph(e);
  692. unsafeWindow.setLike = e => setLike(e);
  693. unsafeWindow.setTheme = e => setTheme(e);
  694. unsafeWindow.setAva = e => setAva(e);
  695. unsafeWindow.setUniq = e => setUniq(e);
  696. unsafeWindow.setContest = e => setContest(e);
  697. unsafeWindow.setReport = e => setReport(e);
  698. unsafeWindow.setGpt = e => setGpt(e);
  699. unsafeWindow.request = request;
  700. let torender = [uniqSave, uniqChange, secretSecurity, goodTrust, badTrust, trustFactor, commitVote, SecretSet, ColorSet, BgSet, dialogWindow, cacheSync, EmojiSet, getUID, usernames, parseUsername, cacheSync, BannerStyle, NickStyle];
  701. let funcs = torender.map(e => e.toString());
  702. let script = document.createElement('script');
  703. script.appendChild(document.createTextNode(funcs.join("")));
  704. document.head.appendChild(script);
  705. renderSettings();
  706. }
  707. function isAd(e) {
  708. if (adlist_w.some(o => e.innerHTML.toLowerCase().includes(o)) && !adlist_white.some(o => e.innerHTML.toLowerCase().includes(o))) {
  709. return true;
  710. }
  711. return false;
  712. }
  713. function isLink(e) {
  714. if (adlist_l.some(o => e.innerHTML.toLowerCase().includes(o)) && !adlist_white.some(o => e.innerHTML.toLowerCase().includes(o))) {
  715. return true;
  716. }
  717. return false;
  718. }
  719. async function adBlockDaemon() {
  720. if (await contestblock == 'on' && document.querySelector(".messageText.SelectQuoteContainer.ugc") && document.querySelector(".moneyContestWithValue")) {
  721. document.querySelector(".messageText.SelectQuoteContainer.ugc").remove()
  722. }
  723. adblock = await adblock;
  724. avablock = await avablock;
  725. if (window.location.pathname == '/' && document.querySelector(".text_Ads") && adblock == 'on') { document.querySelector(".text_Ads").remove(); return;}
  726. let users = document.querySelectorAll("span.userStatus:not(.blocked)");
  727. // удаление рекламы в алертах
  728. if (document.querySelector('[data-author="Реклама"]') && adblock == 'on')
  729. {
  730. let ads = document.querySelectorAll('[data-author="Реклама"]');
  731. ads.forEach(function (e){
  732. e.remove();
  733. })
  734. }
  735. // проверка на рекламу в минипрофиле
  736. if (document.querySelector(".userTitleBlurb h4") && adblock == 'on')
  737. {
  738. let e = document.querySelector(".userTitleBlurb h4");
  739. let img = document.querySelector(".avatarBox span.img");
  740. if (isAd(e)) {
  741. e.classList.add("blocked");
  742. e.innerHTML = "Реклама скрыта";
  743. img.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')`;
  744. }
  745. }
  746. if (document.querySelector(".userTitleBlurb h4") && adblock == 'on')
  747. {
  748. let e = document.querySelector(".userTitleBlurb h4");
  749. let img = document.querySelector(".avatarBox span.img");
  750. if (isLink(e)) {
  751. e.classList.add("blocked");
  752. e.innerHTML = "Реклама скрыта";
  753. }
  754. }
  755. // Проверка статуса на юзер пейдже
  756. if (document.querySelector(".current_text:not(.blocked)") && adblock == 'on')
  757. {
  758. let e = document.querySelector(".current_text:not(.blocked)");
  759. let img = document.querySelector(".avatarScaler img");
  760. if (isAd(e)) {
  761. e.classList.add("blocked");
  762. e.innerHTML = "Реклама скрыта";
  763. 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';
  764. }
  765. if (isLink(e)) {
  766. e.classList.add("blocked");
  767. e.innerHTML = "Реклама скрыта";
  768. }
  769. }
  770. if (users.length < 1 && adblock != 'on') {return;}
  771. users.forEach(function (e) {
  772. // проверка на рекламу
  773. if (isAd(e) && adblock == 'on')
  774. {
  775. e.innerHTML = 'Реклама скрыта';
  776. e.classList.add("blocked");
  777. // такое говно в будущем стоит переписать =)
  778. $(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')`;
  779. return;
  780. }
  781. if (isLink(e) && adblock == 'on')
  782. {
  783. e.innerHTML = 'Реклама скрыта';
  784. e.classList.add("blocked");
  785. return;
  786. }
  787. return;
  788. })
  789. }
  790. function BannerStyle(type) {
  791. switch (type) {
  792. case '1':
  793. document.getElementsByClassName("BannerCss")[0].value = `border-radius: 6px;background: url('https://media1.giphy.com/media/JtBZm3Getg3dqxK0zP/giphy.gif') center center;text-shadow: 0px 0px 3px #7a00ff, 0px 1px 0px #7a00ff, 1px 2px 0px red, 1px 3px 0px green;color: white`;
  794. document.getElementsByClassName("UserBannerStyle")[0].style = `border-radius: 6px;background: url('https://media1.giphy.com/media/JtBZm3Getg3dqxK0zP/giphy.gif') center center;text-shadow: 0px 0px 3px #7a00ff, 0px 1px 0px #7a00ff, 1px 2px 0px red, 1px 3px 0px green;color: white`;
  795. break;
  796. case '2':
  797. document.getElementsByClassName("BannerCss")[0].value = `border-radius: 6px;background: url('https://media1.giphy.com/media/3o7522WIg2FkHbCHvO/giphy.gif') center center;text-shadow: 0px 0px 3px #7a00ff, 0px 1px 0px gray, 1px 2px 0px lime, 1px 3px 0px blue;color: white`;
  798. document.getElementsByClassName("UserBannerStyle")[0].style = `border-radius: 6px;background: url('https://media1.giphy.com/media/3o7522WIg2FkHbCHvO/giphy.gif') center center;text-shadow: 0px 0px 3px #7a00ff, 0px 1px 0px gray, 1px 2px 0px lime, 1px 3px 0px blue;color: white`;
  799. default:
  800. break;
  801. }
  802. }
  803. function NickStyle(type) {
  804. switch (type) {
  805. case '1':
  806. document.getElementsByClassName("UsernameCss")[0].value = `background: url('https://media3.giphy.com/media/h5XENtRSEjj8tELOXW/giphy.gif');text-shadow: 0 0 5px #ff00f7;-webkit-background-clip: text;-webkit-text-fill-color: transparent`;
  807. document.getElementsByClassName("UsernameStyle")[0].style = `background: url('https://media3.giphy.com/media/h5XENtRSEjj8tELOXW/giphy.gif');text-shadow: 0 0 5px #ff00f7;-webkit-background-clip: text;-webkit-text-fill-color: transparent`;
  808. break;
  809. case '2':
  810. document.getElementsByClassName("UsernameCss")[0].value = `background: url('https://media4.giphy.com/media/dwaeIbBnF6HBu/giphy.gif');text-shadow: 0 0 5px #ff00f7;-webkit-background-clip: text;-webkit-text-fill-color: transparent`;
  811. document.getElementsByClassName("UsernameStyle")[0].style = `background: url('https://media4.giphy.com/media/dwaeIbBnF6HBu/giphy.gif');text-shadow: 0 0 5px #ff00f7;-webkit-background-clip: text;-webkit-text-fill-color: transparent`;
  812. default:
  813. break;
  814. }
  815. }
  816. async function renderSettings() {
  817. // Проверка на нахождение в профиле и наличие кнопки редактирования профиля
  818. if (document.querySelector(".secondaryContent a.button.block[href='account/personal-details']")) {
  819. let profileeditbtn = document.createElement('a')
  820. profileeditbtn.classList.add('block');
  821. profileeditbtn.classList.add('button');
  822. profileeditbtn.onclick = function () {
  823. dialogWindow();
  824. };
  825. profileeditbtn.innerHTML = 'Настроить BetterLZT';
  826. document.querySelector(".topblock .secondaryContent").append(profileeditbtn)
  827. }
  828. if(window.location.pathname == "/account/uniq/test" && await uniqstatus == 'on') {
  829. if (document.querySelector("[name=banner_text]").value == "Lolzteam") document.querySelector("[name=banner_text]").value = "BetterLZT";
  830. let adduniq = document.createElement("div");
  831. adduniq.style = "margin-bottom: 25px";
  832. adduniq.innerHTML = `
  833. <div class="menu">
  834. <div class="menu-header">
  835. <h1 class="menu-header-title">Настройки бесплатного "Уника"</h1>
  836. </div>
  837. <div class="menu-body">
  838. <a onclick="uniqSave();">Применить уник</a>
  839. <a onclick="uniqChange();" style="color: red;">Вкл/Выкл бесплатный уник</a>
  840. </div>
  841. </div><style>
  842. @keyframes pulse {
  843. 0% {
  844. transform: scale(0.95);
  845. box-shadow: 0 0 0 0 white;
  846. border-radius: 100%;
  847. opacity: 0.5;
  848. }
  849. 70% {
  850. transform: scale(1);
  851. box-shadow: 0 0 0 10px white;
  852. border-radius: 100%;
  853. opacity: 0.5;
  854. }
  855. 100% {
  856. transform: scale(0.95);
  857. box-shadow: 0 0 0 0 white;
  858. border-radius: 100%;
  859. opacity: 0.5;
  860. }
  861. }
  862. :root {
  863. --c-text-primary: #edeeef;
  864. --c-text-secondary: #d4d7e1;
  865. --c-border-primary: #323232;
  866. --c-bg-body: #000;
  867. --c-bg-primary: #1b1d23;
  868. --c-bg-secondary: #000001;
  869. --c-bg-button: #343844;
  870. }
  871. .menu {
  872. width: 90%;
  873. max-width: 320px;
  874. background-color: var(--c-bg-primary);
  875. transition: background-color .30s ease;
  876. border-radius: 15px;
  877. }
  878. /* header */
  879. .menu-header {
  880. padding: 1rem;
  881. }
  882. .menu-heaser-title {
  883. font-size: 1.2rem;
  884. color: var(--c-text-secondary);
  885. font-weight: 700;
  886. }
  887. /* theme switcher */
  888. .theme-switcher input {
  889. display: none;
  890. }
  891. .theme-switcher {
  892. position: relative;
  893. background-color: var(--c-bg-secondary);
  894. border-radius: 10px;
  895. display: flex;
  896. padding: 0 3px;
  897. }
  898. .theme-switcher label {
  899. position: relative;
  900. z-index: 2;
  901. width: calc(100% / 3);
  902. color: var(--c-text-secondary);
  903. }
  904. .theme-switcher label span {
  905. padding: 8px 0;
  906. display: flex;
  907. justify-content: center;
  908. font-weight: 600;
  909. opacity: 0.8;
  910. }
  911. .theme-switcher label span:hover {
  912. opacity: 1;
  913. cursor: pointer;
  914. }
  915. .theme-switcher .slider {
  916. position: absolute;
  917. z-index: 1;
  918. width: calc((100% - 6px) / 3);
  919. top: 3px;
  920. transform: translatex(-110%);
  921. bottom: 3px;
  922. border-radius: 8px;
  923. transition: .30s ease, transform 0.25s ease-out;
  924. background-color: var(--c-bg-button);
  925. }
  926. .theme-switcher input:nth-of-type(1):checked ~ .slider {
  927. transform: translateX(0);
  928. }
  929. .theme-switcher input:nth-of-type(2):checked ~ .slider {
  930. transform: translateX(100%);
  931. }
  932. .theme-switcher input:nth-of-type(3):checked ~ .slider {
  933. transform: translateX(200%);
  934. }
  935. /* Menu body */
  936. .menu-body {
  937. padding: 1rem;
  938. border-top: 1px solid var(--c-border-primary);
  939. transition: border-color .30s ease;
  940. }
  941. .menu-body a {
  942. text-decoration: none;
  943. color: inherit;
  944. display: flex;
  945. padding: 0.6rem 0.5rem;
  946. border-radius: 4px;
  947. font-weight: 500;
  948. transition: .30s ease;
  949. }
  950. .menu-body a:hover {
  951. background-color: var(--c-bg-secondary);
  952. }
  953. ion-icon {
  954. margin-right: 5px;
  955. font-size: 20px;
  956. margin-top: 2px;
  957. }</style>
  958. `
  959. document.getElementsByClassName("ToggleTriggerAnchor")[0].prepend(adduniq);
  960. }else if(window.location.pathname == "/account/uniq/test" && await uniqstatus != 'on'){
  961. let adduniq = document.createElement("div");
  962. adduniq.style = "margin-bottom: 25px";
  963. adduniq.innerHTML = `
  964. <div style="background: rgb(54, 54, 54);
  965. margin: 5px 15px;
  966. padding: 10px 15px; border-radius: 10px;">
  967. ⚠️ у вас отключены уники от BetterLZT. Для сохранения бесплатного уника активируйте функцию в настройках
  968. </div>
  969. `
  970. document.querySelector("#UniqPanels").prepend(adduniq)
  971. }
  972. }
  973. async function dialogWindow() {
  974. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim().replace(/<[^>]*>/g, ' ').replace(/\s{2,}/g, ' ').trim().replace(" Premium", "").trim();
  975. let data = await JSON.parse(await cache);
  976. data = data.users[nickname];
  977. if (!data) {
  978. data = {
  979. "premium": false
  980. }
  981. }
  982. adblockt = false;
  983. marketblockt = false;
  984. hideliket = false;
  985. hideava = false;
  986. uniqstatust = false;
  987. uniqstatust = false;
  988. contestblockt = false;
  989. reportbtnst = false;
  990. if (await reportbtns == 'on') {
  991. reportbtnst = true;
  992. }
  993. if (await adblock == 'on') {
  994. adblockt = true;
  995. }
  996. if (await marketblock == 'on') {
  997. marketblockt = true;
  998. }
  999. if (await hidelike == 'on') {
  1000. hideliket = true;
  1001. }
  1002. if (await avamarket == 'on') {
  1003. hideava = true;
  1004. }
  1005. if (await uniqstatus == 'on') {
  1006. uniqstatust = true;
  1007. }
  1008. if (await contestblock == 'on') {
  1009. contestblockt = true;
  1010. }
  1011. let htmlall = `
  1012. <details style="">
  1013. <summary>Основные<br><span>Реклама, секретный вопрос</span></summary>
  1014. <div>
  1015. <div class='btns-l'><input onclick="setUniq('${uniqstatust ? 'off' : 'on'}');" type="checkbox" id="scales" name="scales" ${uniqstatust ? 'checked' : ''} /> Включить уники от BetterLZT</div> <div class='btns-l'><input onclick="setAdblock('${adblockt ? 'off' : 'on'}');" type="checkbox" id="scales" name="scales" ${adblockt ? 'checked' : ''} /> Блокировщик рекламы</div>
  1016. <div class='btns-l'><input onclick="setMarketblock('${marketblockt ? 'off' : 'on'}');" type="checkbox" id="scales" name="scales" ${marketblockt ? 'checked' : ''} /> Скрывать продавцов в ЧС</div> <div class='btns-l'><input onclick="setLike('${hideliket ? 'off' : 'on'}');" type="checkbox" id="scales" name="scales" ${hideliket ? 'checked' : ''} /> Скрывать счетчик лайков в профиле</div>
  1017. <div class='btns-l'><input onclick="setAva('${hideava ? 'off' : 'on'}');" type="checkbox" id="scales" name="scales" ${hideava ? 'checked' : ''} /> Скрывать аватарки на маркете</div> <div class='btns-l'><input onclick="setContest('${contestblockt ? 'off' : 'on'}');" type="checkbox" id="scales" name="scales" ${contestblockt ? 'checked' : ''} /> Скрывать контент в розыгрышах</div>
  1018. <div class='btns-l'><input onclick="setReport('${reportbtnst ? 'off' : 'on'}');" type="checkbox" id="scales" name="scales" ${reportbtnst ? 'checked' : ''} /> Показывать кнопки для быстрой подачи жалоб</div>
  1019. <hr style="border: solid 1px #363636;">
  1020. <p class="main-text" onclick="secretSecurity()">Автоматический ввод секретной фразы: (кликабельно)</p>
  1021. <input id="secretph" class="input" placeholder="Введите вашу секретную фразу"> <a onclick="SecretSet()" class="button leftButton primary">Сохранить</a>
  1022. </div>
  1023. </details>
  1024. <details style="">
  1025. <summary>Выбор иконки у ника<br><span>Для выбора просто кликните на понравившуюся иконку</span></summary>
  1026. <div style="margin-top: -30px">
  1027. <p><b>Бесплатные:</b></p>
  1028. <button onclick="EmojiSet('walking')"><i class="fas fa-walking"></i></button><button onclick="EmojiSet('code')"><i class="fas fa-code"></i></button> <button onclick="EmojiSet('silver')"><i class="fas fa-spinner fa-spin"></i></button>
  1029. ${data.premium ? '<p><b>Premium эмодзи</b></p>' : '<p><b>Доступные с Premium:</b></p>' }
  1030. <button ${data.premium ? 'onclick="EmojiSet(`sueta`)"' : ''}"><img src="https://nztcdn.com/files/310336b3-c10e-4ad1-8fdf-0bbe73835ca1.webp" height="18px"></button><button ${data.premium ? 'onclick="EmojiSet(`cookie`)"' : ''}"><i class="fas fa-cookie" style="color: #228e5d;"></i></button><button ${data.premium ? 'onclick="EmojiSet(`gold`)"' : ''}><i title="BetterLZT User" class="fas fa-spinner-third fa-spin" style="--fa-primary-color: #fe6906; --fa-secondary-color: #1a6eff; background: none; -webkit-text-fill-color: gold;"></i></button><button ${data.premium ? 'onclick="EmojiSet(`js`)"' : ''}"><i class="fab fa-js-square" style="-webkit-text-fill-color: gold;"></i></button><button ${data.premium ? 'onclick="EmojiSet(`python`)"' : ''}"><i class="fab fa-python" style="-webkit-text-fill-color: gold;"></i></button><button ${data.premium ? 'onclick="EmojiSet(`verified`)"' : ''}"><i class="fas fa-badge-check"></i></button>
  1031. <button ${data.premium ? 'onclick="EmojiSet(`admin`)"' : ''}"><i class="fas fa-wrench" style="color: rgb(150,68,72);"></i></button><button ${data.premium ? 'onclick="EmojiSet(`moderate`)"' : ''}"><i class="fas fa-bolt" style="color: #12470D"></i></button><button ${data.premium ? 'onclick="EmojiSet(`smoderate`)"' : ''}"><i class="fas fa-bolt" style="color: rgb(46,162,74);"></i></button><button ${data.premium ? 'onclick="EmojiSet(`arbitr`)"' : ''}"><i class="fas fa-gavel" style="color: rgb(255,154,252);"></i></button><button ${data.premium ? 'onclick="EmojiSet(`editor`)"' : ''}"><i class="fas fa-pen" style="color: rgb(0,135,255);"></i></button><button ${data.premium ? 'onclick="EmojiSet(`designer`)"' : ''}"><i class="fas fa-drafting-compass" style="color: #5c45ff;"></i></button><button ${data.premium ? 'onclick="EmojiSet(`designer2`)"' : ''}"><i class="fas fa-drafting-compass" style="background: url('https://i.gifer.com/7HHu.gif');-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i></button><button ${data.premium ? 'onclick="EmojiSet(`usd`)"' : ''}"><i class="fas fa-badge-dollar" style="background: url('https://i.gifer.com/7HHu.gif');-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i></button>
  1032. ${data.premium ? '<a class="button leftButton primary" target="_blank" href="https://hasantigiev.t.me">Установить свою</a> ' : ''} <a class="button leftButton" onclick="EmojiSet('default')">Установить стандартное</a>
  1033. </div>
  1034. </details>
  1035. <details style="">
  1036. <summary>Кастомизация<br></summary>
  1037. <div style="margin-top: -25px">
  1038. <h3 style="display: inline; margin-bottom: 5px;">Фон</h3>
  1039. <span>Данный фон Вы будете видеть на всех страницах форума и маркета.
  1040. Так же, он будет виден посетителям Вашего форума (при использовании расширения)</span>
  1041. <input class="input" id="bgurl" placeholder="Ссылка на картинку"> <a onclick="BgSet()" class="button leftButton primary OverlayTrigger">Сохранить</a>
  1042. <hr style="border: solid 1px #363636;">
  1043. <h3 style="display: inline; margin-bottom: 5px;">Своя тема (Нужен Premium)</h3>
  1044. <span>Данную тему Вы будете видеть на всех страницах форума и маркета.
  1045. Так же, она будет видна посетителям Вашего форума (при использовании расширения)</span>
  1046. <input class="input" id="colorbg" placeholder="цвет в формате rgba()"> <a onclick="ColorSet()" class="button leftButton primary OverlayTrigger">Сохранить</a>
  1047. </div>
  1048. </details>
  1049. <details style="">
  1050. <summary>Готовые темы<br></summary>
  1051. <div style="margin-top: -25px">
  1052. <a class="button leftButton" onclick="setTheme('1')">Amoled</a> <a class="button leftButton" onclick="setTheme('2')">BetterLZT</a> <a class="button leftButton" onclick="setTheme('3')">Lime</a> <a class="button leftButton" onclick="setTheme('4')">LZT Purple</a> <a class="button leftButton" onclick="setTheme('5')">Lzt Sakura</a>
  1053. <a class="button leftButton primary" onclick="setTheme('null')">Отключить</a>
  1054. </div>
  1055. </details>
  1056. <details style="">
  1057. <summary>Новости и обновления<br></summary>
  1058. <div style="margin-top: -25px">
  1059. <iframe src="https://lzt.hasanbek.ru/better/exui/hub.php?user=${nickname}&version=${version}" frameborder="0" width="100%" height="500px"></iframe>
  1060. </div>
  1061. </details>
  1062. <details style="">
  1063. <summary>Цены на премиум<br></summary>
  1064. <div style="margin-top: -45px">
  1065. <iframe src="https://lzt.hasanbek.ru/better/exui/prem.php?user=${nickname}" frameborder="0" width="100%"></iframe>
  1066. <i>Хочешь поддержать автора? Приобрети премиум =)</i>
  1067. <a class="button leftButton primary" target="_blank" href="https://hasantigiev.t.me">Приобрести Premium</a>
  1068. </div>
  1069. </details>
  1070. `
  1071. let html_prem = `
  1072. <iframe src="https://lzt.hasanbek.ru/better/ver.php?user=${nickname}&version=${version}" frameborder="0" width="100%" style="margin-top: -25px;" height="70px"></iframe>
  1073. ${htmlall}
  1074. <div style="display: flex;
  1075. width: 598px;
  1076. justify-content: space-between;
  1077. align-items: flex-start;">
  1078. Version ${version}
  1079. <iframe src="https://lzt.hasanbek.ru/better/exui/premium.php?user=${nickname}" frameborder="0" width="360px" style="" height="50px"></iframe>
  1080. </div>
  1081. <a class="button leftButton primary" target="_blank" href="https://hasantigiev.t.me">Приобрести Premium</a> <a class="button leftButton" href="account/uniq/test">Настроить уник</a> <a class="button leftButton" href="https://gf.qytechs.cn/ru/scripts/470626-betterlzt">Обновить расширение</a>
  1082. <style>
  1083. .main-text {
  1084. font-size: 13px;
  1085. font-style: normal;
  1086. font-weight: 600;
  1087. line-height: normal;
  1088. display: inline;
  1089. }
  1090. .btns-l {
  1091. margin-bottom: 10px;
  1092. margin-right: 10px;
  1093. border-radius: 6px;
  1094. display: inline-block;
  1095. padding: 7px 15px;
  1096. background: #363636;
  1097. justify-content: center;
  1098. align-items: center;
  1099. gap: 12px;
  1100. font-size: 13px;
  1101. font-style: normal;
  1102. font-weight: 600;
  1103. }
  1104. details {
  1105. width: 100%;
  1106. background: #272727;
  1107. border: solid 3px #363636;
  1108. box-shadow: 0 0.1rem 1rem -0.5rem rgba(0, 0, 0, .4);
  1109. border-radius: 8px;
  1110. overflow: hidden;
  1111. margin-top: -25px;
  1112. }
  1113. summary {
  1114. padding: 12px 16px;
  1115. display: block;
  1116. background: #363636;
  1117. position: relative;
  1118. cursor: pointer;
  1119. color: #D6D6D6;
  1120. font-family: Open Sans;
  1121. font-size: 14px;
  1122. font-style: normal;
  1123. font-weight: 600;
  1124. line-height: normal;
  1125. }
  1126. summary span {
  1127. color: #949494;
  1128. font-size: 13px;
  1129. }
  1130. details span {
  1131. color: #949494;
  1132. font-size: 13px;
  1133. }
  1134. summary:after {
  1135. font-family: "Font Awesome 5 Pro";
  1136. color: rgb(148,148,148);
  1137. content: '\\f077';
  1138. position: absolute;
  1139. left: 97%;
  1140. top: 50%;
  1141. transform: translate(-50%, -50%) rotate(180deg);
  1142. transform-origin: 0.2rem 50%;
  1143. transition: 0.25s transform ease;
  1144. }
  1145. details[open] > summary:after {
  1146. transform: translate(-50%, -50%) rotate(360deg);
  1147. }
  1148. details[open] > div {
  1149. padding: 0px 20px;
  1150. margin-top: -25px;
  1151. }
  1152. details .leftButton {
  1153. margin-right: 10px;
  1154. }
  1155. details button {
  1156. width: 45px;
  1157. height: 45px;
  1158. padding: 5px;
  1159. justify-content: center;
  1160. align-items: center;
  1161. color: rgb(34,142,93);
  1162. border-radius: 6px;
  1163. background: #363636;
  1164. border: none;
  1165. font-size: 25px;
  1166. margin-bottom: 10px;
  1167. margin-right: 10px;
  1168. }
  1169. details button.active {
  1170. border: 1.6px solid #07C682;
  1171. background: linear-gradient(180deg, rgba(7, 198, 130, 0.12) 0%, rgba(7, 198, 130, 0.00) 100%), #363636;
  1172. }
  1173. details input.input{
  1174. width: 77%;
  1175. padding: 6px;
  1176. border-radius: 6px;
  1177. height: 20px;
  1178. background: #303030;
  1179. color: white;
  1180. border: 1px solid rgb(54, 54, 54);
  1181. }
  1182. details input[type=checkbox] {
  1183. width: auto;
  1184. }
  1185. details input[type=checkbox]:after {
  1186. border-radius: 4px;
  1187. }
  1188. </style>
  1189. `;
  1190. return XenForo.alert(
  1191. `${html_prem}`, 'BetterLZT (native) v.'+version
  1192. )
  1193. }
  1194. async function EmojiSet(emoji) {
  1195. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  1196. request(`${server}/v5/emoji?user=${nickname}&emoji=${emoji}`).catch(e => {
  1197. XenForo.alert("Ошибка синхронизации с сервером, попробуйте еще раз", 1, 10000)
  1198. });
  1199. cacheSync();
  1200. location.reload();
  1201. }
  1202. async function BgSet() {
  1203. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  1204. bg = document.querySelector("#bgurl").value
  1205. request(`${server}/v5/bg?user=${nickname}&bg=${bg}`).catch(e => {
  1206. XenForo.alert("Ошибка синхронизации с сервером, попробуйте еще раз", 1, 10000)
  1207. });
  1208. cacheSync();
  1209. location.reload();
  1210. }
  1211. async function SecretSet() {
  1212. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  1213. secretph = document.querySelector("#secretph").value;
  1214. setSecretph(secretph);
  1215. }
  1216. async function ColorSet() {
  1217. nickname = document.querySelector(".accountUsername.username").firstElementChild.innerText.trim();
  1218. bg = document.querySelector("#colorbg").value
  1219. request(`${server}/v5/color?user=${nickname}&color=${bg}`).catch(e => {
  1220. XenForo.alert("Ошибка синхронизации с сервером, попробуйте еще раз", 1, 10000)
  1221. });
  1222. cacheSync();
  1223. location.reload();
  1224. }
  1225. async function marketRender() {
  1226. if (document.location.host != "lzt.market") {return false;}
  1227. if(window.location.href.includes('goods/add')) {
  1228. if(document.querySelector(".bbCodeSpoilerContainer")){
  1229. document.querySelector(".bbCodeSpoilerContainer button").click()
  1230. }
  1231. }
  1232. if (await marketblock == 'on') {
  1233. alerts = document.querySelectorAll(".itemIgnored");
  1234. alerts.forEach(function (e){
  1235. e.remove();
  1236. })
  1237. }
  1238. if(document.querySelector(".sidebarUserAvatar") && await avamarket == 'on') {
  1239. document.querySelector(".sidebarUserAvatar").remove();
  1240. }
  1241. }
  1242. function secretSecurity() {
  1243. return XenForo.alert(`Сторонние расширения имеют доступ к пользовательским настройкам BetterLZT. и могут использовать это в корыстных целях
  1244. Если вы используете сторонние расширение от малоизвестных авторов - рекомендуем не пользоваться данной функцией ИЛИ
  1245. удалить сторонние расширения.
  1246. Имеются вопросы по сторонним расширениям? Свяжитесь со мной - t.me/hasantigiev`, "Безопасность превыше всего!")
  1247. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址