隐藏 Linux.do 特定帖子和用户

隐藏 Linux.do 上指定标签的帖子和无解决方案的帖子,以及指定用户的帖子,并添加置顶按钮

// ==UserScript==
// @name         隐藏 Linux.do 特定帖子和用户
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description  隐藏 Linux.do 上指定标签的帖子和无解决方案的帖子,以及指定用户的帖子,并添加置顶按钮
// @match        https://linux.do/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    let blockedUsers = GM_getValue('blockedUsers', []);
    let blockedTags = GM_getValue('blockedTags', []);
    let hideNoSolution = GM_getValue('hideNoSolution', true);

    GM_registerMenuCommand('配置屏蔽的用户', configureBlockedUsers);
    GM_registerMenuCommand('配置屏蔽的标签', configureBlockedTags);
    GM_registerMenuCommand('切换无解决方案帖子显示', toggleNoSolution);

    function configureBlockedUsers() {
        const users = prompt('请输入要屏蔽的用户名,用"|"分隔:', blockedUsers.join('|'));
        if (users !== null) {
            const trimmedUsers = users.split('|').map(user => user.trim()).filter(user => user.length > 0);
            if (trimmedUsers.length > 0) {
                blockedUsers = trimmedUsers;
                GM_setValue('blockedUsers', blockedUsers);
                alert('屏蔽的用户已更新。请刷新页面以应用更改。');
                hideTopics();
            } else {
                alert('请输入至少一个有效的用户名。');
            }
        }
    }

    function configureBlockedTags() {
        const tags = prompt('请输入要屏蔽的标签,用"|"分隔:', blockedTags.join('|'));
        if (tags !== null) {
            const trimmedTags = tags.split('|').map(tag => tag.trim()).filter(tag => tag.length > 0);
            blockedTags = trimmedTags;
            GM_setValue('blockedTags', blockedTags);
            alert('屏蔽的标签已更新。请刷新页面以应用更改。');
            hideTopics();
        }
    }

    function toggleNoSolution() {
        hideNoSolution = !hideNoSolution;
        GM_setValue('hideNoSolution', hideNoSolution);
        alert(`${hideNoSolution ? '已开启' : '已关闭'}隐藏无解决方案帖子。请刷新页面以应用更改。`);
        hideTopics();
    }

    function hideTopics() {
        const topicItems = document.querySelectorAll('tr.topic-list-item:not([data-processed])');

        topicItems.forEach((topic) => {
            const tags = topic.querySelectorAll('a.discourse-tag');
            const noSolution = topic.querySelector('span[title="此话题尚无解决方案"]');
            const userElement = topic.querySelector('.posters a:first-child');
            const username = userElement ? userElement.getAttribute('data-user-card') : null;

            if (Array.from(tags).some(tag => blockedTags.includes(tag.getAttribute('data-tag-name'))) ||
                (hideNoSolution && noSolution) ||
                (username && blockedUsers.includes(username))) {
                topic.style.visibility = 'hidden';
                topic.style.position = 'absolute';
                topic.style.left = '-9999px';
            }

            topic.setAttribute('data-processed', 'true');
        });
    }

    function addBlockButton() {
        const userCardContainer = document.querySelector('ul.usercard-controls');
        if (userCardContainer) {
            if (!userCardContainer.querySelector('.block-user-button')) {
                const button = document.createElement('button');
                button.textContent = '屏蔽此用户';
                button.className = 'btn btn-icon-text btn-primary block-user-button';
                button.style.marginTop = '10px';
                button.addEventListener('click', () => {
                    const username = document.querySelector('.names__secondary.username').textContent.trim();
                    if (username && !blockedUsers.includes(username)) {
                        blockedUsers.push(username);
                        GM_setValue('blockedUsers', blockedUsers);
                        alert(`${username} 已被屏蔽。`);
                        hideTopics();
                        addBlockButton();
                    }
                });
                userCardContainer.appendChild(button);
            }
        }
    }

    function addUnblockButton() {
        const userCardContainer = document.querySelector('ul.usercard-controls');
        if (userCardContainer) {
            if (!userCardContainer.querySelector('.unblock-user-button')) {
                const button = document.createElement('button');
                button.textContent = '取消屏蔽';
                button.className = 'btn btn-icon-text btn-secondary unblock-user-button';
                button.style.marginTop = '10px';
                button.addEventListener('click', () => {
                    const username = document.querySelector('.names__secondary.username').textContent.trim();
                    if (username && blockedUsers.includes(username)) {
                        blockedUsers = blockedUsers.filter(user => user !== username);
                        GM_setValue('blockedUsers', blockedUsers);
                        alert(`${username} 的屏蔽已被取消。`);
                        hideTopics();
                        addUnblockButton();
                    }
                });
                userCardContainer.appendChild(button);
            }
        }
    }

    function addScrollToTopButton() {
    const button = document.createElement('button');
    button.className = 'btn-scroll-top';
    button.innerHTML = `
        <svg class="fa d-icon d-icon-arrow-up svg-icon" xmlns="http://www.w3.org/2000/svg">
            <use href="#arrow-up"></use>
        </svg>
        <span style="margin-left: 5px;">置顶</span>
    `;
    button.style.position = 'fixed';
    button.style.bottom = '20px';
    button.style.right = '20px';
    button.style.zIndex = '1000';
    button.style.padding = '8px 12px';
    button.style.backgroundColor = 'rgb(209, 240, 255)'; // 设置背景颜色
    button.style.color = '#646464'; // 设置文字颜色
    button.style.border = 'none';
    button.style.borderRadius = '4px';
    button.style.cursor = 'pointer';
    button.style.boxShadow = '0 2px 5px rgba(0,0,0,0.2)';
    button.style.display = 'flex';
    button.style.alignItems = 'center';
    button.style.transition = 'background-color 0.3s';

    button.addEventListener('mouseover', () => {
        button.style.backgroundColor = 'rgb(189, 220, 235)'; // 悬停时的背景颜色
    });
    button.addEventListener('mouseout', () => {
        button.style.backgroundColor = 'rgb(209, 240, 255)';
    });

    button.addEventListener('click', () => {
        window.scrollTo({ top: 0, behavior: 'smooth' });
    });
    document.body.appendChild(button);
}

    hideTopics();
    addScrollToTopButton();

    const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
            if (mutation.addedNodes.length) {
                hideTopics();
                addBlockButton();
                addUnblockButton();
            }
        });
    });

    observer.observe(document.body, { childList: true, subtree: true });

    window.addEventListener('scroll', () => {
        const scrollable = document.documentElement.scrollHeight - window.innerHeight;
        const scrolled = window.scrollY;
        if (scrolled >= scrollable) {
            const loadMoreButton = document.querySelector('.load-more-button');
            if (loadMoreButton) {
                loadMoreButton.click();
            }
        }
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址