В настоящее время возможность прекращения отображения сообщений определенного пользователя в чате не предусмотрена, несмотря на то, что такое вполне легко провернуть в личных сообщениях. Периодически ломая голову почти три месяца, я всё-таки придумала, как это можно осуществить. Но обо всем по порядку.
Как должна работать программа? Если не сильно углубляться в детали, она должна получить на вход какого-то пользователя (или список пользователей), затем пробежаться по всем сообщениям в чате и сравнить, было ли какое-то из них написано этим пользователем. Если условие выполняется, мы просто заменяем содержимое этого сообщения на пустую строку так, что от него ничего не остается. "Можно проверить только верхнее сообщение, это более эффективно", но путем несложных экспериментов оказалось, что чат полностью обновляется после каждого добавленного в него сообщения, и те изменения, что мы вносили ранее, просто сбросятся. Для этого, действительно, лучше всего подходит язык JavaScript. Здесь присутствует что-то от парсинга, но так как нам нужно еще и изменить содержимое страницы, отлично будет написать какой-нибудь скрипт и вставить его себе в консоль в панели разработчика.
И что дальше? Итак, в нашем распоряжении чистый ЖабаСкрипт, Ютса и панель разработчика. Более формально выведенный нами алгоритм выглядит так:
Создаем список с никами пользователей.
Получаем коллекцию сообщений чата по классу.
В цикле проверяем совпадение авторов сообщений с никами в списке. Если совпало — заменяем HTML-код содержимого на пустую строку или добавляем CSS-свойство display: none
Повторяем операции 2-3 бесконечное количество раз.
И если с первыми тремя пунктами всё оказалось довольно просто, то последний меня хорошо озадачил. Простой while(true), бесконечный цикл, прерывает выполнение остальных JS скриптов, созданных когда-то Витасом. Таким образом, если вы введете в консоль while(true), вы сможете только просматривать чат, но писать в него не выйдет. Я долго не понимала, в чем же дело, пыталась найти какие-то подсказки в открытом коде расширения по Ютсе, добавляла в цикл задержку, но всё без толку. Только сегодня ночью до меня дошло: простой while(true) — синхронный код, то есть он выполняется в основном потоке и своим действием не дает выполняться другим интерактивным элементам. Мне же нужно было добавить асинхронности, дабы мой скрипт выполнялся параллельно со всеми процессами на Ютсе. Благо JavaScript позволяет осуществлять и такое. Осознание проблемы — первый шаг к ее решению. Я знала только две фичи из этих приколов многопоточности, это async и await, но после усиленного поиска в Интернете, осознала еще и какие-то промисы. В общем, чтоб проверить свою гипотезу на работоспособность и не сильно париться с новой теорией я просто скопировала какой-то код с форума, посвящённого программированию, и заменила основные моменты на свои функции, которые вывела еще в пунктах 2-3 (возвращаясь к списку задач).
В ходе тестирования скрипта вывела несколько его преимуществ и недостатков. Итак, плюсы: хотя бы работает, неплохо работает. Минусы: из-за задержки не всегда получается сразу убрать сообщение, придется вводить в консоль заново после перезагрузки страницы, работает только на компьютере.
Что получилось? Ниже представлен сам код с комментариями по его работе. Для использования зайдите на сайт Ютсы, нажмите F12, выберете "Консоль" и вставьте код, только не забудьте внести свой список (каждый элемент через запятую в кавычках). Оно выводит какую-то ошибку в консоль, но оно работает. Я правда сама не до конца понимаю, каким образом. Можете сразу закрыть панель разработчика, скрипт продолжит свое действие.
//Func1 — сама функция отслеживания и удаления нежелательных сооб
async function Func1()
{
//список пользователей
list = ['tsuchigumo', '« Aquarius »'];
//func берет на вход нежелательное сообщение (item) и удаляет его содержимое
function func(item) {
// innerHTML позволяет менять содержимое HTML тега
item.innerHTML = ``;
}
// поиск нежелательных сообщений
async function App() {
// получаем коллекцию из всех сообщений чата.
// т.к. они все имеют класс message, можем найти их через класс
messages = document.querySelectorAll('.message');
//перебираем элементы коллеции (сообщения)
messages.forEach(async (item) => {
//находим ник автора сооб item. найти HTML код информации о нем по классу ichat_info_author, а с помощью textContent выделить только текстовую информацию
user = item.querySelector(`.ichat_info_author`).textContent
// проверяем, содержится ли данный ник в списке
if (list.indexOf(user) != -1) {
// вызываем функцию удаления
await func(item);
}
})
}
// а вот и сам бесконечный цикл
while(true) {
await Func2();
App();
}
}
// это я ваще хз че делает
async function Func2() {
return new Promise((res, rej) => {
// задаем задержку в 300 миллисекунд между итерациями проверки чата
setTimeout(() => res(), 300);
})
}
// вызываем функцию отслеживания и удаления нежелательных сооб
Func1();
Как оно работает? Сравните сами.
Если кто-то доведет это детище до ума, буду благодарна, а может и сама это сделаю, просто уже немного спать хочется. Всем бобра и спасибо за внимание!
tsuchigumo (26.03.2023, 02:38) писал: придется вводить в консоль заново после перезагрузки страницы
В принципе, есть различные расширения на браузер, которые позволяют автоматизировать работу подобных скриптов. Один раз закинул этот скрипт, установил в настройках сайты/конкретные страницы сайтов, на которых он будет выполняться – и всё готово. В качестве одного из таких расширений могу посоветовать Tampermonkey, служит мне верой и правдой довольно долгое время:)