Загрузка...

[TM] LolzHide - Скрытие заблокированных пользователей на форуме

Тема в разделе Дополнения создана пользователем ЧерноеСердце 22 апр 2025. (поднята 23 май 2025) 268 просмотров

Загрузка...
  1. ЧерноеСердце
    ЧерноеСердце Автор темы 22 апр 2025 Лучший курс на TRX,Energy - https://lolz.live/threads/8610296/ 6324 16 апр 2021
    LolzHide
    Полное скрытие заблокированных пользователей на форуме

    Описание

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

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

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

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

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

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

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

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

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

    Код скрипта

    Код
    // ==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();
    }
    })();

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

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

    Код

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

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

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

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

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

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

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

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

    Скрипт регулярно обновляется. Следите за новыми версиями!
     
    22 апр 2025 Изменено
  2. llimonix
    :amtap: наконец то я не буду видеть Показать игнорируемый контент
     
    1. a911
      llimonix, зачем в чс людей кидаешь?
  3. awaw
    awaw 27 апр 2025 продаю ****** lolz.live/threads/8787685/ :peace: 7924 8 окт 2017
    мне не нужно, но за старание респект. выглядит реально круто
     
  4. gonome
    gonome 16 май 2025 Продаю недоступные в РФ игры Steam 1724 9 дек 2018
    О, как раз то, о чем я просил! Если я заблокал пользователя - значит, я вообще не хочу его видеть.
     
    16 май 2025 Изменено
  5. КинДзаДза
    КинДзаДза 19 май 2025 Не еби мне мозг, он уже выебан. 20 112 26 янв 2022
    Полезно, но не стоит забывать своих врагов.
     
Top