您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Добавляет дополнительный блок с темами из определенного раздела на главную страницу.
// ==UserScript== // @name Add additional discussion list on main page. // @namespace http://tampermonkey.net/ // @version 1.0 // @description Добавляет дополнительный блок с темами из определенного раздела на главную страницу. // @author Yowori // @match https://lolz.live/* // @match https://zelenka.guru/* // @match https://lolz.guru/* // @icon https://i.imgur.com/xnJeB3f.png // @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(); }); })();