LolzHide Полное скрытие заблокированных пользователей на форуме Описание LolzHide — это мощное расширение для Tampermonkey, которое полностью удаляет весь контент от пользователей, находящихся в вашем черном списке. В отличие от стандартной функции игнорирования, скрипт не просто скрывает сообщения, а физически удаляет их из DOM-структуры страницы. Что умеет скрипт: Полностью удаляет сообщения заблокированных пользователей в темах Удаляет все комментарии от заблокированных пользователей Скрывает темы, созданные заблокированными пользователями, из списков Ведёт подробную статистику удаленного контента в консоли браузера Работает с динамически подгружаемым контентом Преимущества: Контент полностью исчезает со страницы (не остается пустых блоков) Страницы становятся чище и компактнее Мгновенно работает с новыми заблокированными пользователями Не влияет на производительность форума Не вмешивается в работу форума и не затрагивает рекламу Инструкция по установке Установите расширение Tampermonkeyдля вашего браузера: Chrome Firefox Edge Opera Нажмите на значок Tampermonkey в правом верхнем углу браузера и выберите "Создать новый скрипт" Удалите стандартный код и вставьте код скрипта из блока ниже Сохраните скрипт, нажав Ctrl+S Перезагрузите страницу форума Демонстрация работы После установки и запуска скрипта вы увидите в консоли браузера (F12 → вкладка Console) следующую информацию: [ЧС-Скрипт] Скрипт запущен [ЧС-Скрипт] Найдено 20 заблокированных пользователей [ЧС-Скрипт] Заблокированные пользователи: 005, Knesset, SalviaQeenzi, gonome, Хомиак, Alex, ArchiveKorol, СкладЧебупиццы, Блядес, AnimeHeHe, MALWARE, кошак, StrangeR, бережнюк, FLUGALAYZ, kusyaka, КрИпКрИпОчЕк, лолзтим, Shiva, пиздатый [ЧС-Скрипт] Удалено элементов: 5. Всего: 5 [ЧС-Скрипт] Удалено по типам: сообщение: 2, комментарий: 2, тема в списке: 1 [ЧС-Скрипт] Удалено по пользователям: кошак: 3, СкладЧебупиццы: 1, пиздатый: 1 Code [ЧС-Скрипт] Скрипт запущен [ЧС-Скрипт] Найдено 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(); } })(); 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(); } })(); Настройка скрипта Вы можете настроить скрипт под свои потребности, изменив параметры в начале кода: const config = { enableLogs: true, // Включить/выключить **** в консоли actuallyRemove: true, // true - полностью удалять, false - только скрывать logPrefix: '[ЧС-Скрипт]', // Префикс для ***** detailedReport: true // Подробная статистика по удалениям }; Code const config = { enableLogs: true, // Включить/выключить **** в консоли actuallyRemove: true, // true - полностью удалять, false - только скрывать logPrefix: '[ЧС-Скрипт]', // Префикс для ***** detailedReport: true // Подробная статистика по удалениям }; Параметры: enableLogs: если установлено true, скрипт будет выводить информацию в консоль браузера actuallyRemove: если установлено true, элементы будут полностью удаляться; если false — только скрываться через CSS logPrefix: префикс для сообщений в консоли, поможет отличить сообщения скрипта detailedReport: если установлено true, будет выводиться подробная статистика по удаленным элементам Дополнительная информация Совместимость: Скрипт работает со всеми современными браузерами и не конфликтует с другими скриптами Производительность: Скрипт оптимизирован и использует дебаунсинг для минимального влияния на производительность Обновление ЧС: Скрипт автоматически подхватывает изменения в вашем черном списке, не требуя перезагрузки Безопасность: Скрипт не отправляет никаких данных на сторонние серверы и работает полностью локально Частые вопросы Вопрос: Работает ли скрипт с ночной темой? Ответ: Да, скрипт полностью совместим со всеми темами форума. Вопрос: Куда деваются сообщения после удаления? Ответ: Сообщения полностью удаляются из DOM-структуры страницы, как будто их никогда не было. Вопрос: Влияет ли скрипт на скорость загрузки страницы? Ответ: Влияние минимально благодаря оптимизации и использованию дебаунсинга. Вопрос: Нужно ли обновлять скрипт при добавлении новых пользователей в ЧС? Ответ: Нет, скрипт автоматически обрабатывает всех пользователей в вашем черном списке. Обратная связь Если у вас есть вопросы, предложения или вы нашли ошибку — оставляйте комментарии ниже. Буду рад помочь и улучшить скрипт! Скрипт регулярно обновляется. Следите за новыми версиями!