Загрузка...

We add an additional block with topics from a specific section to the main page.

Thread in Extentions created by Yeulette feather-wing Oct 10, 2024. 1,005 views

  1. Yeulette
    Данный скрипт добавляет дополнительный блок с темами с указанного раздела на главную страницу.
    Скрипт подойдет кураторам, а также людям которые например сидят в оффтопике)
    Доработка и глобализация моего прошлого скрипта - https://zelenka.guru/threads/7715978/.

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

    // ==UserScript==
    // @name Add additional discussion list on main page.
    // @namespace [URL]http://tampermonkey.net/[/URL]
    // @version 1.0
    // @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';

    let savedNodeId = localStorage.getItem('customDiscussionNodeId');
    const defaultNodeId = savedNodeId ? parseInt(savedNodeId) : 8;
    let nodeId = isNaN(defaultNodeId) ? 8 : defaultNodeId;

    const isHidden = localStorage.getItem('customDiscussionIsHidden') === 'true';

    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;
    flex-wrap: nowrap;
    position: relative;
    }

    body.index .discussionList {
    max-width: 520px;
    flex: 0 0 400px;
    transition: max-width 0.3s ease; /* Добавлено плавное изменение */
    }

    .customDiscussionList {
    max-height: 1040px;
    max-width: 400px;
    flex: 0 0 400px;
    height: auto;
    overflow: hidden;
    position: relative;
    transition: max-width 0.3s ease, display 0.3s ease; /* Добавлено плавное изменение */
    }

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

    .customDiscussionList .ForumViewMoreButton {
    display: none;
    }

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

    .toggleButton {
    padding: 5px 10px;
    cursor: pointer;
    background-color: transparent;
    color: white;
    border: none;
    border-radius: 4px;
    font-size: 14px;
    margin-left: 10px;
    margin-top: 10px;
    }

    .showButton {
    display: none;
    cursor: pointer;
    background-color: transparent;
    color: white;
    border: none;
    border-radius: 4px;
    font-size: 14px;
    padding: 5px 10px;
    }

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

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

    function createHideButtons(discussionList) {
    const hideButton = document.createElement('button');
    hideButton.textContent = 'Скрыть';
    hideButton.className = 'toggleButton hideButton';
    hideButton.style.float = 'right';
    hideButton.style.marginTop = '10px';
    hideButton.addEventListener('click', () => {
    hideDiscussionList();
    });

    const nodeIdButton = document.createElement('button');
    nodeIdButton.textContent = 'Раздел';
    nodeIdButton.className = 'toggleButton nodeIdButton';
    nodeIdButton.style.float = 'right';
    nodeIdButton.style.marginTop = '10px';
    nodeIdButton.style.marginRight = '10px';
    nodeIdButton.addEventListener('click', () => {
    const newNodeId = prompt('Введите ID раздела:', nodeId);
    if (newNodeId !== null) {
    const parsedNodeId = parseInt(newNodeId);
    if (!isNaN(parsedNodeId)) {
    nodeId = parsedNodeId;
    localStorage.setItem('customDiscussionNodeId', nodeId);
    const container = discussionList.querySelector('.discussionListItems');
    loadDiscussionList(nodeId, container, true);
    } else {
    alert('Некорректный ID.');
    }
    }
    });

    const aboveThreadList = discussionList.querySelector('.aboveThreadList');
    if (aboveThreadList) {
    aboveThreadList.style.position = 'relative';
    aboveThreadList.appendChild(nodeIdButton);
    aboveThreadList.appendChild(hideButton);
    }
    }

    function createShowButton() {
    const showButton = document.createElement('button');
    showButton.textContent = 'Показать';
    showButton.className = 'showButton';
    showButton.style.position = 'absolute';
    showButton.style.top = '10px';
    showButton.style.right = '10px';
    showButton.addEventListener('click', () => {
    showDiscussionList();
    });

    const mainDiscussionList = document.querySelector('body.index .discussionList');
    if (mainDiscussionList) {
    mainDiscussionList.style.position = 'relative';
    mainDiscussionList.appendChild(showButton);
    }
    }

    function hideDiscussionList() {
    const customList = document.querySelector('.customDiscussionList');
    if (customList) {
    customList.style.display = 'none';
    localStorage.setItem('customDiscussionIsHidden', 'true');
    }

    const mainDiscussionList = document.querySelector('body.index .discussionList');
    if (mainDiscussionList) {
    mainDiscussionList.style.maxWidth = 'none';
    }

    const showButton = document.querySelector('.showButton');
    const hideButton = document.querySelector('.hideButton');
    if (showButton) {
    showButton.style.display = 'block';
    }
    if (hideButton) {
    hideButton.style.display = 'none';
    }
    }

    function showDiscussionList() {
    const customList = document.querySelector('.customDiscussionList');
    if (customList) {
    customList.style.display = 'block';
    localStorage.setItem('customDiscussionIsHidden', 'false');
    }

    const mainDiscussionList = document.querySelector('body.index .discussionList');
    if (mainDiscussionList) {
    mainDiscussionList.style.maxWidth = '520px';
    }

    const showButton = document.querySelector('.showButton');
    const hideButton = document.querySelector('.hideButton');
    if (showButton) {
    showButton.style.display = 'none';
    }
    if (hideButton) {
    hideButton.style.display = 'block';
    }
    }

    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.nextSibling);
    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);
    createHideButtons(newDiscussionList);

    createShowButton();

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

    if (isHidden) {
    hideDiscussionList();
    } else {
    const mainDiscussionList = document.querySelector('body.index .discussionList');
    if (mainDiscussionList) {
    mainDiscussionList.style.maxWidth = '520px';
    }
    }
    }

    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 {
    return;
    }
    } else {
    return;
    }
    }
    };
    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') || nodeId;

    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
     
    This article was useful for you?
    You can thank the author of the topic by transferring funds to your balance
    Thank the author
    1. View previous comments (21)
    2. boss
      avatarYeulette feather-wing , ну бля бывает для просмотра,крутые айди часто прочекивают
    3. WTF
    4. Yeulette feather-wing Topic starter
      avatarWTF, есть такое)
  2. WhatACat
    Для людей с СДВГ самое то, рекомендую :smile_beach:
     
    1. Yeulette feather-wing Topic starter
  3. Bismuth
    Bismuth Oct 10, 2024 10,502 Dec 22, 2019
    Топовый скрипт, юзал ещё на бета тесте
    Ждём когда в чексбокс сделают
     
    1. Yeulette feather-wing Topic starter
    2. Yeulette feather-wing Topic starter
      avatarЛГБТ, есть в скрипте это
      [IMG]
      [IMG]
  4. Tokyo
    [IMG]

    Может я чего то не понимаю? Зачем карусель придумывать
     
    1. Yeulette feather-wing Topic starter
      avatarTokyo, тяжелый люкс
  5. God_likeGL
    God_likeGL Layer 1 Oct 10, 2024 Лучшие сервера: lolz.live/threads/5071761/ :+rep: 35,784 Oct 30, 2018
     
  6. sadness
    лишняя залупня на экране.
    минимализм наше все :2011_like:
     
    1. View previous comments (1)
    2. Yeulette feather-wing Topic starter
      avatarsadness , не устанавливай расширение, в чем проблема?
    3. sadness
      avatarYeulette feather-wing , просто мнение свое высказал.
      для этого вроде и существуют сообщения под темой.
  7. Весть
    Весть Oct 10, 2024 Статус: Отображается рядом с вашим ником в сообщениях. 10,415 Aug 8, 2019
    1. Yeulette feather-wing Topic starter
      avatarВесть , не удобно каждый раз заходит в другой раздел и смотреть темы
  8. Muha_Nelli
    заебись, теперь у меня будет отдельный раздел с любимой порнухой из слив фото
     
  9. c0d
    а кто советовал сделать чекбокс так и не указал)
     
    1. Yeulette feather-wing Topic starter
      avatarc0d , ну я сделал не чекбоксом и это было в прошлой теме
    2. c0d
  10. God_likeGL
    God_likeGL Layer 1 Oct 11, 2024 Лучшие сервера: lolz.live/threads/5071761/ :+rep: 35,784 Oct 30, 2018
     
    1. Yeulette feather-wing Topic starter
      avatarGod_likeGL Layer 1 , для старого стиля скрипт разрабатывался
    2. God_likeGL Layer 1
    3. WTF
  11. БИЛЛИНОГАМИ
    Ого, неплохой скрипт, подойдёт многим юзерам форума.
     
    1. God_likeGL Layer 1
  12. K1ERRY
    K1ERRY Jul 30, 2025 TIME TO DIE 28,057 Nov 19, 2018
    1. K1ERRY
Loading...