block hupu

屏蔽虎扑论坛的主题

// ==UserScript==
// @name         block hupu
// @namespace    https://wiyi.org
// @version      0.2
// @description  屏蔽虎扑论坛的主题
// @author       Bigbyto
// @match        https://bbs.hupu.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    if (!shouldEnable()) {return;}

    const blockTopics = [];
    const keywords = getKeywords();
    createSettingUI(keywords);
    // Your code here...
    let allTopics = document.querySelectorAll('.truetit');
    let count = 0;
    const blockInfo = createElement(keywords);
    if (allTopics && allTopics.length > 0) {
        allTopics = Array.from(allTopics);
        allTopics.forEach(topic => process(topic));
        blockInfo.innerText = `屏蔽了 ${count} 个主题`;
    }

    console.log(blockTopics);

    function process(topic) {
        try {
            let title = topic.innerText;
            let keyword = shouldHide(title);
            if (keyword !== null) {
                topic.parentElement.parentElement.style = 'display:none'
                blockTopics.push(topic.parentElement.parentElement);
                console.log('\nremove topic: ' + title, '\nreason: ' + keyword, '\nlink:' + topic.href);
                count += 1;
            }
        } catch(err) {
            console.log(err);
        }
    }

    function shouldHide(text) {
        for (let keyword of keywords) {
            keyword = keyword.toLowerCase();
            if (keyword && text.toLowerCase().includes(keyword)) {
                return keyword;
            }
        }

        return null;
    }

    function createElement(){
        let head = document.querySelector('.bbs_head');
        if (!head) {return null}
        let right = head.querySelector('.right')
        if (!right) {return null}

        const element = document.createElement('div');

        right.insertAdjacentElement('afterbegin',element);
        element.setAttribute('class','block-info-area');

        const span = document.createElement('span');
        span.style = 'padding-right: 10px';
        element.appendChild(span);

        const a = document.createElement('a');
        a.setAttribute('class','open-setting');
        a.innerText = '打开设置';
        a.style = 'color: blue'
        element.appendChild(a);

        a.onclick = () => {
            const e = document.querySelector('.setting-ui');
            e.style.display = 'block';
        }

        return span;
    }

    function createSettingUI() {
        let settingUI = document.createElement('div');
        settingUI.style = 'display:none;position: fixed; top:0; bottom: 0;left:0; right:0;background: rgba(0,0,0,0.3);z-index: 999;'
        settingUI.setAttribute('class','setting-ui');

        let body = document.createElement('div');
        body.style = 'background-color: white;width: 500px;height: 350px;margin: auto;margin-top: 120px;'
        let img = document.createElement('img');
        img.style = 'width: 12px;float: right;padding: 10px;'
        img.src = 'https://image.flaticon.com/icons/png/512/127/127936.png';
        img.onclick = () => { settingUI.style.display = 'none'}

        let field = document.createElement('div');
        field.innerText = "屏蔽关键字(一行一个)";
        field.style = 'margin-left: 20px;padding-top: 30px;font-size: 13px;color: #333;'
        body.appendChild(img);
        body.appendChild(field);

        const area = document.createElement('textarea');
        area.style = 'margin-left: 20px;margin-top: 10px;border-color: #ccc;height: 230px;padding:5px;box-sizing: border-box;'
        area.value = keywords.join('\n');
        body.appendChild(area);

        const buttonDiv = document.createElement('div');
        buttonDiv.style = 'margin-left: 20px;margin-top: 15px;display: inline-block;';

        const btn1 = document.createElement('button');
        btn1.innerText = '保存'
        btn1.style = 'padding: 5px;width: 80px;border-radius: 2px;background-color: rgb(233, 104, 107);color: white;border: none;'
        btn1.onclick = (e) => {
            saveKeywords(area.value);
            location.reload();
        }

        buttonDiv.appendChild(btn1);
        body.append(buttonDiv);
        settingUI.appendChild(body);
        document.body.appendChild(settingUI);
    }

    function getKeywords() {
        const key = `${getNamespace()}_keywords`;
        let keywords = localStorage.getItem(key);
        if (!keywords) { return [] }

        return JSON.parse(keywords);
    }

    function saveKeywords(content) {
        if (!content) {return;}

        const key = `${getNamespace()}_keywords`;
        const arr = content.split('\n');
        localStorage.setItem(key,JSON.stringify(arr));
    }

    function getNamespace() {
        let href = window.location.href;
        const arr = href.split('com/');

        return arr[1].replace(/(-[0-9]*).*/g,'');
    }

    function shouldEnable() {
        let href = window.location.href;
        return !href.includes('.html');
    }
})();