Загрузка...

[Tm] lolzhide - hiding blocked users on the forum

Thread in Extentions created by ЧерноеСердце Apr 22, 2025. (bumped May 23, 2025) 338 views

  1. ЧерноеСердце
    ЧерноеСердце Topic starter Apr 22, 2025 :ok_cool: 18+ сигны кастом lolz.live/threads/7294788 7085 Apr 16, 2021
    LolzHide
    Полное скрытие заблокированных пользователей на форуме

    Описание

    LolzHide — это мощное расширение для Tampermonkey, которое полностью удаляет весь контент от пользователей, находящихся в вашем черном списке. В отличие от стандартной функции игнорирования, скрипт не просто скрывает сообщения, а физически удаляет их из DOM-структуры страницы.

    Что умеет скрипт:
    • Полностью удаляет сообщения заблокированных пользователей в темах
    • Удаляет все комментарии от заблокированных пользователей
    • Скрывает темы, созданные заблокированными пользователями, из списков
    • Ведёт подробную статистику удаленного контента в консоли браузера
    • Работает с динамически подгружаемым контентом

    Преимущества:
    • Контент полностью исчезает со страницы (не остается пустых блоков)
    • Страницы становятся чище и компактнее
    • Мгновенно работает с новыми заблокированными пользователями
    • Не влияет на производительность форума
    • Не вмешивается в работу форума и не затрагивает рекламу

    Инструкция по установке

    1. Установите расширение Tampermonkeyдля вашего браузера:
    2. Нажмите на значок Tampermonkey в правом верхнем углу браузера и выберите "Создать новый скрипт"
    3. Удалите стандартный код и вставьте код скрипта из блока ниже
    4. Сохраните скрипт, нажав Ctrl+S
    5. Перезагрузите страницу форума

    Демонстрация работы

    После установки и запуска скрипта вы увидите в консоли браузера (F12 → вкладка Console) следующую информацию:

    Code
    [ЧС-Скрипт] Скрипт запущен
    [ЧС-Скрипт] Найдено 20 заблокированных пользователей
    [ЧС-Скрипт] Заблокированные пользователи: 005, Knesset, SalviaQeenzi, gonome, Хомиак, Alex, ArchiveKorol, СкладЧебупиццы, Блядес, AnimeHeHe, MALWARE, кошак, StrangeR, бережнюк, FLUGALAYZ, kusyaka, КрИпКрИпОчЕк, лолзтим, Shiva, пиздатый
    [ЧС-Скрипт] Удалено элементов: 5. Всего: 5
    [ЧС-Скрипт] Удалено по типам: сообщение: 2, комментарий: 2, тема в списке: 1
    [ЧС-Скрипт] Удалено по пользователям: кошак: 3, СкладЧебупиццы: 1, пиздатый: 1
    До и После

    • До: Сообщения от заблокированных пользователей отображаются как свернутые блоки
    • После: Сообщения полностью удаляются из страницы — их как будто никогда не было!

    Код скрипта

    Code
    // ==UserScript==
    // @name Lolzteam - Скрыть заблокированных пользователей
    // @namespace https://lolz.live/
    // @version 1.0
    // @description Полностью скрывает сообщения, комментарии и темы заблокированных пользователей
    // @author ЧерноеСердце
    // @match https://lolz.live/*
    // @match https://zelenka.guru/*
    // @grant none
    // @run-at document-start
    // ==/UserScript==

    (function() {
    'use strict';

    // Настройки
    const config = {
    enableLogs: true, // **** в консоли
    actuallyRemove: true, // true - удалять, false - скрывать
    logPrefix: '[ЧС-Скрипт]', // Префикс для *****
    detailedReport: true // Подробная статистика
    };

    // Кэш
    const cache = {
    ignoredUsers: null,
    lastLogTimes: {},
    removedElements: 0,
    totalRemovedElements: 0,
    processingMutation: false,
    removedDetails: []
    };

    // Логирование
    function log(message, type = 'info') {
    if (!config.enableLogs) return;

    switch(type) {
    case 'info': console.info(`${config.logPrefix} ${message}`); break;
    case 'warn': console.warn(`${config.logPrefix} ${message}`); break;
    case 'error': console.error(`${config.logPrefix} ${message}`); break;
    default: console.log(`${config.logPrefix} ${message}`);
    }
    }

    // Получение списка ЧС
    function getIgnoredUsers() {
    if (cache.ignoredUsers !== null) return cache.ignoredUsers;

    try {
    if (typeof XenForo !== 'undefined' && XenForo._ignoredUsers) {
    const users = Object.keys(XenForo._ignoredUsers);
    if (users.length > 0) {
    log(`Найдено ${users.length} заблокированных пользователей`);

    if (config.detailedReport) {
    const usernames = users.map(userId => {
    return XenForo._ignoredUsers[userId].username;
    }).join(', ');
    log(`Заблокированные пользователи: ${usernames}`);
    }

    cache.ignoredUsers = users;
    return users;
    }
    }
    } catch(e) {
    log(`Ошибка получения ЧС: ${e.message}`, 'error');
    }

    cache.ignoredUsers = [];
    return [];
    }

    // Удаление элемента
    function removeElement(element, reason, username = '') {
    if (!element) return false;

    if (config.detailedReport) {
    cache.removedDetails.push({
    type: reason,
    username: username || 'неизвестно'
    });
    }

    if (config.actuallyRemove) {
    element.remove();
    } else {
    element.style.display = 'none';
    }

    cache.removedElements++;
    cache.totalRemovedElements++;
    return true;
    }

    // Вывод отчета
    function showDetailedReport() {
    if (!config.detailedReport || cache.removedDetails.length === 0) return;

    const typeCount = {};
    const userCount = {};

    cache.removedDetails.forEach(detail => {
    typeCount[detail.type] = (typeCount[detail.type] || 0) + 1;
    userCount[detail.username] = (userCount[detail.username] || 0) + 1;
    });

    const typeReport = Object.entries(typeCount)
    .map(([type, count]) => `${type}: ${count}`)
    .join(', ');

    const userReport = Object.entries(userCount)
    .map(([username, count]) => `${username}: ${count}`)
    .sort((a, b) => b.split(': ')[1] - a.split(': ')[1])
    .join(', ');

    log(`Удалено по типам: ${typeReport}`);
    log(`Удалено по пользователям: ${userReport}`);

    cache.removedDetails = [];
    }

    // Основная функция удаления контента
    function removeBlockedContent() {
    if (cache.processingMutation) return;
    cache.processingMutation = true;

    cache.removedElements = 0;
    cache.removedDetails = [];

    try {
    // Удаление комментариев и сообщений
    document.querySelectorAll('.messageText.ignored, .messageText.baseHtml.SelectQuoteContainer.ignored').forEach(function(element) {
    const commentParent = element.closest('.comment');
    const messageParent = element.closest('.message');

    let username = 'неизвестно';
    try {
    const usernameElement = (commentParent || messageParent).querySelector('.username');
    if (usernameElement) {
    username = usernameElement.textContent.trim();
    }
    } catch(e) {}

    if (commentParent) {
    removeElement(commentParent, 'комментарий', username);
    } else if (messageParent) {
    removeElement(messageParent, 'сообщение', username);
    }
    });

    // Удаление тем с классом ignored
    document.querySelectorAll('.discussionListItem.ignored').forEach(function(item) {
    let username = 'неизвестно';
    try {
    const usernameElement = item.querySelector('.username.threadCreator');
    if (usernameElement) {
    username = usernameElement.textContent.trim();
    }
    } catch(e) {}

    removeElement(item, 'тема в списке', username);
    });

    // Поиск и удаление тем от пользователей в ЧС
    const ignoredUsers = getIgnoredUsers();

    if (ignoredUsers.length > 0) {
    document.querySelectorAll('.discussionListItem').forEach(function(item) {
    const usernameElement = item.querySelector('.username.threadCreator');
    if (usernameElement) {
    const dataHref = usernameElement.getAttribute('data-href') || '';
    const userText = usernameElement.textContent.toLowerCase().trim();

    for (let i = 0; i < ignoredUsers.length; i++) {
    try {
    const userId = ignoredUsers[i];
    if (!XenForo._ignoredUsers[userId]) continue;

    const username = XenForo._ignoredUsers[userId].username;
    const usernameLower = username.toLowerCase();

    if (dataHref.toLowerCase().includes(usernameLower) || userText.includes(usernameLower)) {
    removeElement(item, 'тема пользователя', username);
    break;
    }
    } catch(e) {}
    }
    }
    });
    }

    if (cache.removedElements > 0) {
    log(`Удалено элементов: ${cache.removedElements}. Всего: ${cache.totalRemovedElements}`);

    if (config.detailedReport) {
    showDetailedReport();
    }
    }
    } catch(e) {
    log(`Ошибка: ${e.message}`, 'error');
    } finally {
    cache.processingMutation = false;
    }
    }

    // Определение значимых мутаций
    function shouldProcessMutation(mutations) {
    for (const mutation of mutations) {
    if (mutation.addedNodes.length === 0) continue;

    for (let i = 0; i < mutation.addedNodes.length; i++) {
    const node = mutation.addedNodes[i];

    if (node.nodeType !== Node.ELEMENT_NODE) continue;

    if (node.classList &&
    (node.classList.contains('message') ||
    node.classList.contains('comment') ||
    node.classList.contains('discussionListItem') ||
    node.querySelector('.message, .comment, .discussionListItem'))) {
    return true;
    }

    if (node.querySelectorAll) {
    const childCount = node.querySelectorAll('*').length;
    if (childCount > 5) {
    return true;
    }
    }
    }
    }

    return false;
    }

    // Защита от слишком частых вызовов
    let debounceTimer = null;

    function debouncedRemoveContent() {
    if (debounceTimer) {
    clearTimeout(debounceTimer);
    }
    debounceTimer = setTimeout(removeBlockedContent, 100);
    }

    // Старт при загрузке
    document.addEventListener('DOMContentLoaded', function() {
    log('Скрипт запущен');
    debouncedRemoveContent();

    // MutationObserver для отслеживания изменений
    const observer = new MutationObserver(function(mutations) {
    if (shouldProcessMutation(mutations)) {
    log('Обнаружены изменения');
    debouncedRemoveContent();
    }
    });

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

    // Ранний запуск
    if (document.readyState === 'interactive' || document.readyState === 'complete') {
    debouncedRemoveContent();
    }
    })();

    Настройка скрипта

    Вы можете настроить скрипт под свои потребности, изменив параметры в начале кода:

    Code

    const config = {
    enableLogs: true, // Включить/выключить **** в консоли
    actuallyRemove: true, // true - полностью удалять, false - только скрывать
    logPrefix: '[ЧС-Скрипт]', // Префикс для *****
    detailedReport: true // Подробная статистика по удалениям
    };
    Параметры:
    • enableLogs: если установлено true, скрипт будет выводить информацию в консоль браузера
    • actuallyRemove: если установлено true, элементы будут полностью удаляться; если false — только скрываться через CSS
    • logPrefix: префикс для сообщений в консоли, поможет отличить сообщения скрипта
    • detailedReport: если установлено true, будет выводиться подробная статистика по удаленным элементам

    Дополнительная информация

    • Совместимость: Скрипт работает со всеми современными браузерами и не конфликтует с другими скриптами
    • Производительность: Скрипт оптимизирован и использует дебаунсинг для минимального влияния на производительность
    • Обновление ЧС: Скрипт автоматически подхватывает изменения в вашем черном списке, не требуя перезагрузки
    • Безопасность: Скрипт не отправляет никаких данных на сторонние серверы и работает полностью локально

    Вопрос: Работает ли скрипт с ночной темой?
    Ответ: Да, скрипт полностью совместим со всеми темами форума.

    Вопрос: Куда деваются сообщения после удаления?
    Ответ: Сообщения полностью удаляются из DOM-структуры страницы, как будто их никогда не было.

    Вопрос: Влияет ли скрипт на скорость загрузки страницы?
    Ответ: Влияние минимально благодаря оптимизации и использованию дебаунсинга.

    Вопрос: Нужно ли обновлять скрипт при добавлении новых пользователей в ЧС?
    Ответ: Нет, скрипт автоматически обрабатывает всех пользователей в вашем черном списке.
    Обратная связь

    Если у вас есть вопросы, предложения или вы нашли ошибку — оставляйте комментарии ниже. Буду рад помочь и улучшить скрипт!

    Скрипт регулярно обновляется. Следите за новыми версиями!
     
  2. llimonix
    llimonix Apr 22, 2025 :peace: make testers great again! 23,965 Jan 20, 2020
    :amtap: наконец то я не буду видеть Показать игнорируемый контент
     
    1. a911
      llimonix, зачем в чс людей кидаешь?
  3. awaw
    awaw Apr 27, 2025 лучший парсер тг-чатов lolz.live/threads/8958369/ 8834 Oct 8, 2017
    мне не нужно, но за старание респект. выглядит реально круто
     
  4. gonome
    О, как раз то, о чем я просил! Если я заблокал пользователя - значит, я вообще не хочу его видеть.
     
  5. КинДзаДза
    КинДзаДза May 19, 2025 Не еби мне мозг, он уже выебан. 20,105 Jan 26, 2022
    Полезно, но не стоит забывать своих врагов.
     
Loading...
Top