Загрузка...

Сообщения и комментарии (главная страница) почти в реальном времени

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

Загрузка...
  1. ЧерноеСердце
    ЧерноеСердце Автор темы 21 фев 2025 Unique Service Verification — https://lolz.live/threads/8076790 5049 16 апр 2021
    расширения которые позволяют упростить вашу жизнь


    вам больше не прийдется обновлять страницу чтобы увидеть непрогруженный контент
    комментариев и сообщений

    разрабатывалось под Safari Userscripts

    Код
    // ==UserScript== // @name Lolz.live Forum Auto Refresh // @namespace http://tampermonkey.net/ // @version 0.1 // @description Автоматическое обновление сообщений и комментариев на форуме lolz.live // @author Your Name // @match https://lolz.live/threads/* // @grant none // ==/UserScript== (function() { 'use strict'; // Конфигурация const REFRESH_INTERVAL = 5000; // Интервал проверки новых сообщений (5 секунд) const MESSAGE_CONTAINER_SELECTOR = 'li.message'; // Селектор сообщений форума lolz.live const MESSAGES_WRAPPER_SELECTOR = '.messageList'; // Контейнер со всеми сообщениями const COMMENTS_LIST_SELECTOR = 'ol.messageSimpleList.messageSimple.CommentPostList'; // Селектор списка комментариев const COMMENT_SELECTOR = 'li[id^="post-comment-"]'; // Селектор комментариев // Функция для получения содержимого сообщений и комментариев async function fetchMessages() { try { const response = await fetch(window.location.href); const text = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(text, 'text/html'); // Получаем новые сообщения const messages = doc.querySelectorAll(MESSAGE_CONTAINER_SELECTOR); const newContent = { messages: [], comments: new Map() // Map для хранения комментариев по ID сообщения }; const currentLastId = document.querySelector(MESSAGE_CONTAINER_SELECTOR + ':last-child')?.getAttribute('id'); // Собираем все новые сообщения после последнего let foundCurrent = !currentLastId; for (const message of messages) { if (foundCurrent) { newContent.messages.push(message.outerHTML); } else if (message.getAttribute('id') === currentLastId) { foundCurrent = true; } // Собираем комментарии для каждого сообщения const messageId = message.getAttribute('id'); if (messageId) { const commentsList = message.querySelector(COMMENTS_LIST_SELECTOR); if (commentsList) { const comments = commentsList.querySelectorAll(COMMENT_SELECTOR); if (comments.length > 0) { newContent.comments.set(messageId, { container: commentsList.outerHTML, comments: Array.from(comments).map(c => c.outerHTML) }); } } } } return newContent; } catch (error) { console.error('Ошибка при получении сообщений:', error); return null; } } // Функция для обновления комментариев к сообщению function updateComments(messageElement, comments) { const messageId = messageElement.getAttribute('id'); if (!messageId || !comments.has(messageId)) return; const commentData = comments.get(messageId); let commentContainer = messageElement.querySelector(COMMENTS_LIST_SELECTOR); // Если контейнера комментариев нет, создаем его if (!commentContainer && commentData.container) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = commentData.container; commentContainer = tempDiv.firstElementChild; const messageContent = messageElement.querySelector('.messageContent'); if (messageContent) { messageContent.appendChild(commentContainer); } } if (commentContainer) { const existingComments = new Set( Array.from(commentContainer.querySelectorAll(COMMENT_SELECTOR)) .map(c => c.getAttribute('id')) ); commentData.comments.forEach(commentHTML => { const tempDiv = document.createElement('div'); tempDiv.innerHTML = commentHTML; const commentElement = tempDiv.firstElementChild; const commentId = commentElement.getAttribute('id'); if (!existingComments.has(commentId)) { commentContainer.appendChild(commentElement); } }); } } // Функция для обновления сообщений и комментариев async function updateMessages() { const newContent = await fetchMessages(); if (!newContent) return; const container = document.querySelector(MESSAGES_WRAPPER_SELECTOR); if (!container) return; // Обновляем существующие комментарии document.querySelectorAll(MESSAGE_CONTAINER_SELECTOR).forEach(message => { updateComments(message, newContent.comments); }); // Добавляем новые сообщения if (newContent.messages.length > 0) { newContent.messages.forEach(messageHTML => { const tempDiv = document.createElement('div'); tempDiv.innerHTML = messageHTML; const messageElement = tempDiv.firstElementChild; container.appendChild(messageElement); // Добавляем комментарии к новому сообщению updateComments(messageElement, newContent.comments); }); // Прокручиваем к новому сообщению, если пользователь находится внизу страницы const isAtBottom = (window.innerHeight + window.scrollY) >= document.documentElement.scrollHeight - 100; if (isAtBottom) { window.scrollTo(0, document.documentElement.scrollHeight); } } } // Запуск периодического обновления function initAutoRefresh() { // Первоначальная проверка updateMessages(); // Установка интервала для периодической проверки setInterval(updateMessages, REFRESH_INTERVAL); // Добавляем индикатор активности скрипта const indicator = document.createElement('div'); indicator.style.cssText = ` position: fixed; bottom: 10px; right: 10px; background: #2ecc71; color: white; padding: 5px 10px; border-radius: 3px; font-size: 12px; z-index: 9999; opacity: 0.8; `; indicator.textContent = 'Авто-обновление активно'; document.body.appendChild(indicator); } // Ждем полной загрузки страницы if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initAutoRefresh); } else { initAutoRefresh(); } })();

    вам больше не прийдется обновлять страницу чтобы увидеть непрогруженный контент
    на главной странице


    разрабатывалось под Safari Userscripts

    Код
    // ==UserScript== // @name Lolz.live Topics Auto Refresh // @namespace http://tampermonkey.net/ // @version 0.1 // @description Автоматическое обновление списка тем на форуме lolz.live // @author Your Name // @match https://lolz.live/* // @grant none // ==/UserScript== (function() { 'use strict'; // Конфигурация const REFRESH_INTERVAL = 5000; // Интервал проверки новых тем (5 секунд) const TOPICS_CONTAINER_SELECTOR = '.latestThreads'; // Контейнер со списком тем const TOPIC_SELECTOR = 'div[id^="thread-"]'; // Селектор отдельной темы // Функция для получения содержимого списка тем async function fetchTopics() { try { const response = await fetch(window.location.href); const text = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(text, 'text/html'); // Получаем новые темы const topics = doc.querySelectorAll(TOPIC_SELECTOR); const newContent = { topics: [] }; const currentFirstId = document.querySelector(TOPIC_SELECTOR)?.getAttribute('id'); // Собираем все новые темы до первой существующей for (const topic of topics) { const topicId = topic.getAttribute('id'); if (topicId === currentFirstId) { break; } newContent.topics.push({ id: topicId, html: topic.outerHTML }); } return newContent; } catch (error) { console.error('Ошибка при получении тем:', error); return null; } } // Функция для обновления списка тем async function updateTopics() { const newContent = await fetchTopics(); if (!newContent || !newContent.topics.length) return; const container = document.querySelector(TOPICS_CONTAINER_SELECTOR); if (!container) return; // Добавляем новые темы в начало списка newContent.topics.reverse().forEach(topic => { const tempDiv = document.createElement('div'); tempDiv.innerHTML = topic.html; const topicElement = tempDiv.firstElementChild; // Добавляем эффект появления topicElement.style.animation = 'fadeIn 0.5s ease-in'; container.insertBefore(topicElement, container.firstChild); }); } // Добавляем стили для анимации const styles = document.createElement('style'); styles.textContent = ` @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } `; document.head.appendChild(styles); // Запуск периодического обновления function initAutoRefresh() { // Первоначальная проверка updateTopics(); // Установка интервала для периодической проверки setInterval(updateTopics, REFRESH_INTERVAL); // Добавляем индикатор активности скрипта const indicator = document.createElement('div'); indicator.style.cssText = ` position: fixed; bottom: 10px; right: 10px; background: #2ecc71; color: white; padding: 5px 10px; border-radius: 3px; font-size: 12px; z-index: 9999; opacity: 0.8; cursor: pointer; `; indicator.textContent = 'Авто-обновление тем активно'; document.body.appendChild(indicator); } // Запускаем скрипт только на страницах со списком тем if (document.querySelector(TOPICS_CONTAINER_SELECTOR)) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initAutoRefresh); } else { initAutoRefresh(); } } })();
     
    21 фев 2025 Изменено
  2. Бебруня
    Бебруня 21 фев 2025 7390 6 янв 2023
    А как на телефоне это сделать :em:
     
  3. CBUHKEP
    CBUHKEP 21 фев 2025 ТГ акки --> https://lzt.market/user/8517464/items 6814 22 июн 2020
    В чем прикол? Сообщения в темах и так обновляются динамически
     
  4. Quazy
    Quazy 21 фев 2025 звезды тг https://lolz.live/threads/8306727/ :+rep: 5219 7 мар 2023
    я тоже честно не понимаю зачем
     
    1. Посмотреть предыдущие комментарии (3)
    2. ЧерноеСердце Автор темы
    3. CBUHKEP
      ЧерноеСердце, Есть возможность добавить кликабельную иконку? вкл/выкл
  5. Cheetaha
    Cheetaha 21 фев 2025 ОТДЕЛ БЕЗОПАСНОСТИ ОФФТОПИКА LOLZ.LIVE 4968 22 май 2018
    Скорее полезно
     
  6. mrekk
    так они внутри темы обновляются и так, сделал бы чтобы на главной ленте обновлялись норм было бы
     
    1. Посмотреть предыдущие комментарии (6)
    2. ЧерноеСердце Автор темы
      mrekk, протестил?
    3. mrekk
      ЧерноеСердце, единственный минус когда новые посты появляются нельзя раскрыть полностью тему (в том числе и спойлеры)
      [IMG][IMG]
  7. LouiseFrancoise
    LouiseFrancoise 21 фев 2025 Оплата с карт разных стран - https://lolz.live/threads/8111385/ 4470 27 июн 2020
    коды только на Safari чё-то не очень
     
    1. ЧерноеСердце Автор темы
Top
JavaScript error: