GitHub 屏蔽器

屏蔽掉 GitHub 上的一些烦人用户和牛皮癣 Repo

// ==UserScript==
// @name             GitHub 屏蔽器
// @namespace        http://tampermonkey.net/
// @version          0.0.1
// @description      屏蔽掉 GitHub 上的一些烦人用户和牛皮癣 Repo
// @author           Priate
// @grant            GM_setValue
// @grant            GM_getValue
// @grant            GM_registerMenuCommand
// @license          MIT
// @match            https://github.com/search*
// @contributionURL  https://afdian.net/@cyberubbish
// @license          MIT
// @namespace        https://greasyfork.org/users/219866
// ==/UserScript==

(function() {
    'use strict';

    function initSetting() {
        if (!GM_getValue('blacklist')) {
            GM_setValue('blacklist', {
                user: [],
                repo: [],
            })
        }
    }

    function initHook() {
        const originFetch = fetch;
        window.unsafeWindow.fetch = (url, options) => {
            return originFetch(url, options).then(async (response) => {
                setTimeout(function() {
                    render()
                }, 10)
                return response;
            })
        };
    }

    function initMenu() {
        GM_registerMenuCommand('Setting', function() {})
    }
    // 指定类型拉黑
    function block(type, str) {
        if (!['user', 'repo'].includes(type)) return;
        var blacklist = GM_getValue('blacklist')
        if (blacklist[type].indexOf(str) >= 0) return;
        blacklist[type].push(str.trim())
        GM_setValue('blacklist', blacklist)
    }

    function unblock(type, str) {
        if (!['user', 'repo'].includes(type)) return;
        var blacklist = GM_getValue('blacklist')
        blacklist[type] = blacklist[type].filter(item => {
            return item.trim() !== str.trim()
        })
        GM_setValue('blacklist', blacklist)
    }
    // 重新渲染
    function render() {
        if (!document.querySelector('div[data-testid="results-list"]')) return;
        const blacklist = GM_getValue('blacklist')
        const results = document.querySelector('div[data-testid="results-list"]').children;
        for (var index = 0; index < results.length; index++) {
            const father = results[index]
            const content = father.children[0]
            const title = father.querySelector('span.search-match').innerText.trim()
            const user = title.split('/')[0]
            const repo = title.split('/')[1]
            content.removeAttribute('style')
            if (father.querySelector('div.block-title')) father.querySelector('div.block-title').remove();
            // 如果匹配到屏蔽项
            if (blacklist['user'].includes(user) || blacklist['repo'].includes(repo)) {
                const title = content.querySelector('div.search-title').cloneNode(true)
                title.classList.add('block-title')
                title.querySelector('a').removeAttribute('href')
                title.querySelector('a').style = 'cursor : pointer;'
                title.addEventListener('click', function(e) {
                    var content = e.target.parentElement.parentElement.parentElement.querySelector('.blocked-content')
                    content.removeAttribute('style')
                    e.target.remove()
                })
                content.style = 'display : none;'
                content.classList.add('blocked-content')
                if (father.querySelector('div.block-title')) {
                    father.querySelector('div.block-title').remove()
                }
                father.append(title)
            }
        }
        addBlockBtn()
    }

    function addBlockBtn() {
        const blacklist = GM_getValue('blacklist')
        const results = document.querySelector('div[data-testid="results-list"]').children
        for (var index = 0; index < results.length; index++) {
            const ul = results[index].querySelector('ul')
            if (ul.querySelector('li.block-btn')) ul.querySelector('li.block-btn').remove();
            var li = ul.querySelector('li').cloneNode()
            li.classList.add('block-btn')
            if (ul.querySelector('span.block-span')) ul.querySelector('span.block-span').remove();
            var span = ul.querySelector('span[aria-hidden="true"]').cloneNode(true)
            span.classList.add('block-span')
            var text = ul.querySelector('span').cloneNode()
            text.style = "cursor : pointer;"

            const title = results[index].querySelector('span.search-match').innerText.trim()
            const user = title.split('/')[0]
            const repo = title.split('/')[1]
            // 如果匹配到屏蔽项
            if (blacklist['user'].includes(user) || blacklist['repo'].includes(repo)) {
                text.innerText = 'Unblock'
                text.addEventListener('click', function(e) {
                    unblock('user', user)
                    render()
                })
            } else {
                text.innerText = 'Block'
                // 添加屏蔽
                text.addEventListener('click', function(e) {
                    block('user', user)
                    render()
                })
            }
            li.append(text)
            ul.appendChild(span);
            ul.appendChild(li)
        }
    }
    // 初始化 脚本设置
    initSetting()
    // 初始化 fetch hook
    initHook()
    // 渲染
    render()
    // 注册 Menu
    // initMenu()
})();