LZT Small Hides

removes a bunch of nicknames from hide

// ==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);

})();