LZT Small Hides

removes a bunch of nicknames from hide

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         LZT Small Hides
// @namespace    lzt-small-hides
// @version      1.0
// @description  removes a bunch of nicknames from hide
// @author       Toil
// @license      MIT
// @match        https://zelenka.guru/*
// @match        https://lolz.live/*
// @match        https://lolz.guru/*
// @match        https://lzt.market/*
// @match        https://lolz.market/*
// @match        https://zelenka.market/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru
// @supportURL   https://zelenka.guru/toil/
// @grant        GM_addStyle
// ==/UserScript==

(async function() {
  'use strict';

  // * STYLES
  GM_addStyle(`
    .LSHLink {
      color: rgb(148, 148, 148);
      cursor: pointer;
    }
    .LSHLink:hover {
      text-decoration: underline;
    }
  `)

  // * CONSTANTS
  const XF_LANG = XenForo?.visitor?.language_id === 1 ? 'en' : 'ru';
  const timestamp = Math.floor(Date.now() / 1000);
  const myLink = document.querySelector('#AccountMenu > .blockLinksList > li > a')?.href?.replace(window.location.origin + '/', ''); // get link to your profile

  // * I18N
  const i18n = {
    ru: {
      you: ' Вам',
      forYou: ' Вас',
      andMore: ' и еще ',
      users: 'пользователям',
      forUsers: 'пользователей',
      hiddenContent: 'Скрытый контент',
      hiddenContentFor: 'Скрытый контент для'
    },
    en: {
      you: ' You',
      forYou: ' You',
      andMore: ' and more ',
      users: 'users',
      forUsers: 'users',
      hiddenContent: 'Hidden content',
      hiddenContentFor: 'Hidden content for'
    },
    get(phrase) {
      return this[XF_LANG]?.[phrase] ?? phrase;
    },
  }

  // * SCRIPT
  await XenForo.scriptLoader.loadCssAsync(['avatar_user_badge', 'member_card'], `css.php?css=__sentinel__&style=9&dir=LTR&d=${timestamp}`); // force load member card css

  function formatHides(elements) {
    for (let hide of elements) {
      if (hide.children.length >= 2) {
        hide = hide.querySelector('.attribution.type');
      } else {
        hide = hide.querySelector('.hideContainer > .quote')
      }

      const content = hide.innerHTML;
      const contentSplitted = content.split(' <a href=');
      const hideUsersLength = contentSplitted.length - 1;

      let text = contentSplitted[0];
      // fix for named hides
      if (text === 'Hidden content for next users:' || text === 'Скрытый контент для пользователей') {
        text = i18n.get('hiddenContentFor');
      }

      const usersPhrase = text === i18n.get('hiddenContentFor') ? i18n.get('forUsers') : i18n.get('users');
      const youPhrase = text === i18n.get('hiddenContentFor') ? i18n.get('forYou') : i18n.get('you');

      if (hideUsersLength > 3) {
        const YouFilterString = `"${myLink}" class="username"`
        const formattedTextEl = document.createElement('span');
        const otherUsersEl = document.createElement('span');
        otherUsersEl.classList.add('LSHLink');
        otherUsersEl.onclick = async () => openUserListModal(contentSplitted.filter(a => !a.startsWith(YouFilterString)));

        const youInHide = contentSplitted.find(a => a.startsWith(YouFilterString));
        if (youInHide) {
          const formattedYouEl = document.createElement('span');
          formattedYouEl.classList.add('LSHLink');
          formattedYouEl.innerText = youPhrase;
          formattedYouEl.onclick = async () => await openUserModal(myLink);

          otherUsersEl.innerText = `${hideUsersLength - 1} ${usersPhrase}`;

          formattedTextEl.append(formattedYouEl, i18n.get('andMore'));
        } else {
          otherUsersEl.innerText = ` ${hideUsersLength} ${usersPhrase}`;
        }

        formattedTextEl.append(otherUsersEl)
        hide.innerHTML = '';
        hide.append(text, formattedTextEl, '.');
      }
    }
  }

  async function openUserModal(userLink) {
    const userContent = await XenForo.ajax(`/${userLink}?card=1`)
    return XenForo.createOverlay(null, userContent.templateHtml).load();
  }

  async function openUserListModal(users, title = i18n.get('hiddenContent')) {
    const container = document.createElement('div');
    const formattedUsers = users.map(a => a.startsWith('"') ? ' <a href=' + a : a);
    for (const formattedUser of formattedUsers) {
      container.innerHTML += formattedUser;
    }
    return XenForo.alert(container.innerHTML, title)
  }


  function init() {
    const hides = document.querySelectorAll(".bbCodeHide > aside");
    formatHides(hides);
  }

  init();

  const observer = new MutationObserver((mutationsList, observer) => {
    for (const mutation of mutationsList) {
      if (mutation.type === 'childList') {
        mutation.addedNodes.forEach(node => {
          if (node.nodeType === Node.ELEMENT_NODE) {
            const newHides = node.querySelectorAll('.bbCodeHide > aside');
            if (newHides) {
              formatHides(newHides);
            }
          }
        });
      }
    }
  });

  const config = { childList: true, subtree: true };
  observer.observe(document.body, config);

})();