Загрузка...

Добавляем дополнительный блок с темами с раздела "Оффтоп" на главную страницу.

Тема в разделе Дополнения создана пользователем Yowori 10 окт 2024. 538 просмотров

Загрузка...
  1. Yowori
    Yowori Автор темы 10 окт 2024 Эльфографика грядёт ~ https://lolz.live/threads/7861550/ 14 808 3 июн 2019
    Данное расширение добавляет дополнительный блок с темами с раздела "Оффтоп" на главную страницу.
    Лично для меня удобнее 2 блока, вместо того чтобы темы с оффтопика мешались с другими темами в общем списке.

    [IMG]
    https://greasyfork.org/ru/scripts/512093-add-offtopic-discussion-list-on-main-page
    или
    JS

    // ==UserScript==
    // @name Add "Offtopic" discussion list on main page.
    // @namespace [URL]http://tampermonkey.net/[/URL]
    // @version 1.1
    // @description Добавляет дополнительный блок с темами из раздела "Оффтоп" на главную страницу, динамически подстраиваясь под текущий домен.
    // @author Yowori
    // @match [URL]https://lolz.live/*[/URL]
    // @match [URL]https://zelenka.guru/*[/URL]
    // @match [URL]https://lolz.guru/*[/URL]
    // @icon [IMG] https://i.imgur.com/xnJeB3f.png[/IMG]
    // @grant none
    // @run-at document-end
    // @license MIT
    // ==/UserScript==

    (function() {
    'use strict';

    const nodeId = 8; // Раздел для отображения

    const hostname = window.location.hostname;
    let baseURL = '';

    if (hostname === 'lolz.live') {
    baseURL = 'https://lolz.live';
    } else if (hostname === 'zelenka.guru') {
    baseURL = 'https://zelenka.guru';
    } else if (hostname === 'lolz.guru') {
    baseURL = 'https://lolz.guru';
    } else {
    console.error('Неизвестный домен:', hostname);
    return;
    }

    function addGlobalStyle(css) {
    const head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    const style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
    }

    addGlobalStyle(`
    .customDiscussionContainer {
    display: flex;
    gap: 20px;
    box-sizing: border-box;
    max-width: 1200px;
    margin: 0 auto;
    flex-wrap: nowrap;
    }

    body.index .discussionList {
    max-width: 520px;
    flex: 0 0 400px;
    }

    .customDiscussionList {
    max-height: 1040px;
    max-width: 400px;
    flex: 0 0 400px;
    height: auto;
    overflow: hidden;
    }

    .customDiscussionList .loading,
    .customDiscussionList .error {
    text-align: center;
    padding: 20px;
    font-size: 16px;
    color: #555;
    }

    .customDiscussionList .ForumViewMoreButton {
    display: none;
    }

    .customDiscussionList .discussionListItems {
    display: flex;
    flex-direction: column;
    gap: 10px;
    }

    @media (max-width: 900px) {
    .customDiscussionContainer {
    flex-direction: column;
    align-items: center;
    }

    body.index .discussionList,
    .customDiscussionList {
    flex: 0 0 90%;
    max-width: 90%;
    }
    }
    `);

    function createNewDiscussionList() {
    let container = document.querySelector('.customDiscussionContainer');
    if (!container) {
    container = document.createElement('div');
    container.className = 'customDiscussionContainer';

    const existingDiscussionList = document.querySelector('body.index .discussionList');
    if (existingDiscussionList) {
    existingDiscussionList.parentNode.insertBefore(container, existingDiscussionList);
    container.appendChild(existingDiscussionList);
    } else {
    const bodyIndex = document.querySelector('body.index');
    if (bodyIndex) {
    bodyIndex.appendChild(container);
    }
    }
    }

    const newDiscussionList = document.createElement('div');
    newDiscussionList.className = 'discussionList customDiscussionList';
    newDiscussionList.innerHTML = `
    <div class="aboveThreadList">
    <form action="${baseURL}/forums/${nodeId}/" method="post" class="DiscussionListOptions">
    <input type="hidden" name="node_id" value="${nodeId}">

    <div class="_universalSearchForm universalSearchForm">
    <input name="title" value="" class="SearchInputQuery _universalSearchInput universalSearchInput textCtrl" placeholder="Поиск тем" autocomplete="off">
    <i class="inputRelativeIcon fas fa-times" style="display: none;"></i>
    </div>

    <input type="hidden" name="_xfToken" value="2312422,1728548767,49aac0543425624fb3896cd9087e7579a503d4c1">
    </form>
    </div>

    <div class="discussionListItems" id="discussionListItems_${nodeId}">
    <div class="loading">Загрузка...</div>
    </div>
    `;

    container.appendChild(newDiscussionList);
    loadDiscussionList(nodeId, newDiscussionList.querySelector(`#discussionListItems_${nodeId}`), true);
    addFilterHandlers(newDiscussionList);

    const updateButton = document.querySelector('.UpdateFeedButton');
    if (updateButton) {
    updateButton.addEventListener('click', () => {
    const mainDiscussionList = document.querySelector('body.index .discussionList .discussionListItems');
    loadDiscussionList(1, mainDiscussionList, false);
    loadDiscussionList(nodeId, newDiscussionList.querySelector(`#discussionListItems_${nodeId}`), true);
    });
    }
    }

    // Функция для загрузки списка обсуждений
    function loadDiscussionList(nodeId, container, limit = false) {
    let method = 'GET';
    let url = `${baseURL}/forums/${nodeId}/`;
    let params = null;

    if (nodeId === 835) {
    method = 'POST';
    url = `${baseURL}/forums/${nodeId}/`;
    params = new URLSearchParams();
    params.append('node_id', `${nodeId}`);
    params.append('title', '');
    params.append('_xfToken', '2312422,1728548767,49aac0543425624fb3896cd9087e7579a503d4c1');
    }

    const xhr = new XMLHttpRequest();
    xhr.open(method, url, true);
    if (method === 'POST') {
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
    if (xhr.status === 200) {
    const parser = new DOMParser();
    const doc = parser.parseFromString(xhr.responseText, 'text/html');
    const discussionItems = doc.querySelector('.discussionListItems');

    if (discussionItems) {
    let itemsHTML = discussionItems.innerHTML;

    if (limit) {
    const tempDiv = document.createElement('div');
    tempDiv.innerHTML = itemsHTML;

    const topics = tempDiv.querySelectorAll('.discussionListItem');

    let limitedHTML = '';
    for (let i = 0; i < Math.min(10, topics.length); i++) {
    limitedHTML += topics[i].outerHTML;
    }

    itemsHTML = limitedHTML;
    }

    container.innerHTML = itemsHTML;

    } else {
    container.innerHTML = '<div class="error">Не удалось загрузить темы.</div>';
    }
    } else {
    container.innerHTML = '<div class="error">Ошибка загрузки.</div>';
    }
    }
    };
    if (method === 'POST' && params) {
    xhr.send(params.toString());
    } else {
    xhr.send();
    }
    }

    function addFilterHandlers(discussionList) {
    const form = discussionList.querySelector('.DiscussionListOptions');
    if (!form) return;

    form.addEventListener('submit', function(e) {
    e.preventDefault();
    const formData = new FormData(form);
    const params = new URLSearchParams();

    for (const pair of formData.entries()) {
    params.append(pair[0], pair[1]);
    }

    const nodeId = formData.get('node_id') || 835;

    loadFilteredDiscussionList(nodeId, params, discussionList.querySelector('.discussionListItems'), true);
    });
    }

    function loadFilteredDiscussionList(nodeId, params, container, limit = false) {
    const xhr = new XMLHttpRequest();
    xhr.open('POST', `${baseURL}/forums/${nodeId}/`, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
    if (xhr.status === 200) {
    const parser = new DOMParser();
    const doc = parser.parseFromString(xhr.responseText, 'text/html');
    const discussionItems = doc.querySelector('.discussionListItems');

    if (discussionItems) {
    let itemsHTML = discussionItems.innerHTML;

    if (limit) {
    const tempDiv = document.createElement('div');
    tempDiv.innerHTML = itemsHTML;

    const topics = tempDiv.querySelectorAll('.discussionListItem');

    let limitedHTML = '';
    for (let i = 0; i < Math.min(10, topics.length); i++) {
    limitedHTML += topics[i].outerHTML;
    }

    itemsHTML = limitedHTML;
    }

    container.innerHTML = itemsHTML;
    } else {
    container.innerHTML = '<div class="error">Не удалось загрузить темы.</div>';
    }
    } else {
    container.innerHTML = '<div class="error">Ошибка загрузки.</div>';
    }
    }
    };
    xhr.send(params.toString());
    }

    function init() {
    createNewDiscussionList();
    }

    window.addEventListener('load', function() {
    init();
    });

    })();
    P.S Я не профессиональный кодер, так что не бейте если считаете это говнокодом ;3
     
    10 окт 2024 Изменено
  2. planetus
    planetus 10 окт 2024 гость лучший разработчик https://lolz.live/threads/7606404/ 277 3 сен 2022
    о, я есть в списке :interesting:
     
    1. Посмотреть предыдущие комментарии (9)
  3. Roninom
    Roninom 10 окт 2024 Купите мне уник пж :roflanPlz: я поменяю ник на @насосалнауник 542 15 мар 2024
    Спасибо, теперь не нужно смотреть другие темы кроме оффтопикв
     
  4. СенкоСан
    СенкоСан 10 окт 2024 Заставлю вас мурчать :senko:
     
    1. Yowori Автор темы
    2. СенкоСан
    3. Yowori Автор темы
  5. Божество
    Божество 10 окт 2024 готовьте трон для короля:smile_beach:
    интересное конечно дизайнерское решение
     
  6. WTF
    WTF 10 окт 2024 Заблокирован(а) 7090 6 июн 2021
    Измени на
    Код

    // @match https://lolz.live/*
    // @match https://zelenka.guru/*
    // @match https://lolz.guru/*
    А то не воркает
     
    10 окт 2024 Изменено
    1. Yowori Автор темы
      WTF, оно и так работает, но добавил на всякий случай, спасибо!)
    2. WTF
      Yowori, до этого почему-то не по показывало. Годное дополнение
      10 окт 2024 Изменено
  7. c0d
    c0d 10 окт 2024 Заблокирован(а) 103 4 янв 2019
    через нейронки допили, что бы его можно было скрывать не выключая расширение
    --- Сообщение объединено с предыдущим 10 окт 2024
    или же просто чекбокс сделай
     
  8. renameduser_6180901
    renameduser_6180901 10 окт 2024 мистер мориарти напиши моим родителям
    ЙООООО ВОТ ЭТО ИМБА СПАСИБО
     
  9. kusyaka
    kusyaka 10 окт 2024 гость визитор visitor v1s1t0r в4з4т0р [] v1s170r Bu3uTOP 12 971 25 апр 2022
    пушка брат спасибо
     
  10. Папаня
    Папаня 10 окт 2024 :roflanebalo: 15 938 27 дек 2020
    ВОт это реально имба, лайк за такое
     
  11. WhatACat
    WhatACat 10 окт 2024 https://lolz.live/account/upgrades покупайте уники, ау, автобай 15 934 16 дек 2023
    Для оффтоперов самое то, но у истинных оффтопик в закладках и стоит вместо главной страницы :smile_beach:
     
  12. Sakura
    Sakura 10 окт 2024 Лень оформлять тему? https://lolz.live/threads/8777875/
    Можно сделать так, чтобы с любым разделом это было возможно
     
    1. Yowori Автор темы
      Sakura, ну кстате как вариант, будет полезно так же для кураторов
  13. Bismuth
    Bismuth 10 окт 2024 8895 22 дек 2019
    А можно как то чтобы не оффтопик был а какой то другой раздел?
     
    1. Yowori Автор темы
      Bismuth, 131 строчка
      loadDiscussionList(8, newDiscussionList.querySelector('#discussionListItems_8'), true);
      вместо 8, номер раздела своего
    2. Sakura
      Yowori, надо это в саму тему пихнуть
  14. Yowori
    Yowori Автор темы 10 окт 2024 Эльфографика грядёт ~ https://lolz.live/threads/7861550/ 14 808 3 июн 2019
    Немношко изменил скрипт.

    - Можно изменить раздел для отображения, указав его ID.
    [IMG][IMG]
    - Запрос GET теперь отправляется в зависимости от вашего основного домена (Из-за того что по умолчанию стояло zelenka,guru, у некоторых не прогружался список тем с раздела, спасибки Bismuth).

    [IMG]
     
    10 окт 2024 Изменено
Top