Загрузка...

UI Utility Messages and comments (main page) almost in real time

Thread in Extentions created by ЧерноеСердце Feb 21, 2025. (bumped Feb 22, 2025) 897 views

  1. ЧерноеСердце
    ЧерноеСердце Topic starter Feb 21, 2025 :ok_cool: 18+ сигны кастом lolz.live/threads/7294788 7085 Apr 16, 2021
    расширения которые позволяют упростить вашу жизнь


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

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

    Code
    // ==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

    Code
    // ==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();
    }
    }
    })();
     
  2. Бебруня
    А как на телефоне это сделать :em:
     
  3. CBUHKEP
    CBUHKEP Feb 21, 2025 9024 Jun 22, 2020
    В чем прикол? Сообщения в темах и так обновляются динамически
     
  4. Quazy
    Quazy Feb 21, 2025 https://lolz.live/threads/8981756/ | VDS сервера в Москве 9120 Mar 7, 2023
    я тоже честно не понимаю зачем
     
    1. View previous comments (3)
    2. CBUHKEP
    3. ЧерноеСердце Topic starter
    4. CBUHKEP
      ЧерноеСердце, Есть возможность добавить кликабельную иконку? вкл/выкл
  5. Cheetaha
    Cheetaha Feb 21, 2025 ОТДЕЛ БЕЗОПАСНОСТИ ОФФТОПИКА LOLZ.LIVE 5373 May 22, 2018
    Скорее полезно
     
  6. mrekk
    mrekk Feb 21, 2025 7178 Aug 29, 2021
    так они внутри темы обновляются и так, сделал бы чтобы на главной ленте обновлялись норм было бы
     
    1. View previous comments (6)
    2. ЧерноеСердце Topic starter
      mrekk, протестил?
    3. mrekk
      ЧерноеСердце, единственный минус когда новые посты появляются нельзя раскрыть полностью тему (в том числе и спойлеры)
      [IMG][IMG]
  7. KusuriYakuzen
    коды только на Safari чё-то не очень
     
    1. ЧерноеСердце Topic starter
Loading...
Top