Загрузка...

We add an additional block with topics from the "Offtopic" section to the main page.

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

  1. Yeulette
    Данное расширение добавляет дополнительный блок с темами с раздела "Оффтоп" на главную страницу.
    Лично для меня удобнее 2 блока, вместо того чтобы темы с оффтопика мешались с другими темами в общем списке.

    [IMG]
    Chrome -
    Firefox -
    Opera -

    или
    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
     
    This article was useful for you?
    You can thank the author of the topic by transferring funds to your balance
    Thank the author
  2. Дикарь
    о, я есть в списке :interesting:
     
    1. View previous comments (9)
  3. Roninom
    Roninom Oct 10, 2024 Бла бла бла 657 Mar 15, 2024
    Спасибо, теперь не нужно смотреть другие темы кроме оффтопикв
     
  4. СенкоСан
    СенкоСан Oct 10, 2024 Абузоустойчивые Домены - lolz.live/threads/111111 8,304 Feb 11, 2022
     
    1. Yeulette feather-wing Topic starter
    2. СенкоСан
    3. Yeulette feather-wing Topic starter
  5. СакерФоПеин
    СакерФоПеин Oct 10, 2024 готовьте трон для короля:smile_beach:
    интересное конечно дизайнерское решение
     
  6. WTF
    WTF Oct 10, 2024 Статус 7,066 Jun 6, 2021
    Измени на
    Code

    // @match https://lolz.live/*
    // @match https://zelenka.guru/*
    // @match https://lolz.guru/*
    А то не воркает
     
    1. Yeulette feather-wing Topic starter
      avatarWTF, оно и так работает, но добавил на всякий случай, спасибо!)
    2. WTF
      avatarYeulette feather-wing , до этого почему-то не по показывало. Годное дополнение
  7. c0d
    c0d Oct 10, 2024 Твоя мечта -- https://lolz.live/threads/9361063/ 1,242 Jan 4, 2019
    через нейронки допили, что бы его можно было скрывать не выключая расширение
    The post was merged to previous Oct 10, 2024
    или же просто чекбокс сделай
     
    1. Yeulette feather-wing Topic starter
      avatarc0d , о замучу
  8. ЛГБТ
    ЙООООО ВОТ ЭТО ИМБА СПАСИБО
     
  9. kusyaka
    kusyaka Oct 10, 2024 то, что ты шлюха - это общественное мнение 15,575 Apr 25, 2022
    пушка брат спасибо
     
  10. Папаня
    ВОт это реально имба, лайк за такое
     
  11. WhatACat
    Для оффтоперов самое то, но у истинных оффтопик в закладках и стоит вместо главной страницы :smile_beach:
     
  12. Sakura
    Sakura Oct 10, 2024 8 гигабайт флэшкац
    Можно сделать так, чтобы с любым разделом это было возможно
     
    1. Yeulette feather-wing Topic starter
      avatarSakura, ну кстате как вариант, будет полезно так же для кураторов
    2. Bismuth
      avatarSakura, все умное до меня придумали
  13. Bismuth
    Bismuth Oct 10, 2024 10,502 Dec 22, 2019
    А можно как то чтобы не оффтопик был а какой то другой раздел?
     
    1. Yeulette feather-wing Topic starter
      avatarBismuth , 131 строчка
      loadDiscussionList(8, newDiscussionList.querySelector('#discussionListItems_8'), true);
      вместо 8, номер раздела своего
    2. Sakura
  14. Yeulette
    Yeulette feather-wing Topic starter Oct 10, 2024 16,393 Jun 3, 2019
    Немношко изменил скрипт.

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

    [IMG]
     
Loading...