- // ==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();
- });
-
- })();