Greasy Fork is available in English.

Gamersky User Blacklist

手动实现游民星空用户拉黑

// ==UserScript==
// @name         Gamersky User Blacklist
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  手动实现游民星空用户拉黑
// @author       zib
// @match        *://*.gamersky.com/news/*
// @match        *://*.gamersky.com/tech/*
// @icon         https://www.gamersky.com/favicon.ico
// @grant        GM_setValue
// @grant        GM_getValue
// @license      BSD
// ==/UserScript==

let storageBlacklist = GM_getValue('gamersky_blacklist') ? JSON.parse(GM_getValue('gamersky_blacklist')) : [];

let showPanel = (GM_getValue('show_panel') === undefined || GM_getValue('show_panel') === null) ? 1 : GM_getValue('show_panel');

function addToBlacklist(e) {
    if (e.stopPropagation) e.stopPropagation();

    if (e.preventDefault) e.preventDefault();

    const uid = e.target.parentElement.getAttribute('uid');

    const name = e.target.previousSibling.textContent;

    const ok = confirm(`是否拉黑 uid:${uid} 昵称:${name}?`);

    if (ok) {
        if (storageBlacklist.some((i) => i.uid == uid)) {
            storageBlacklist = storageBlacklist.map((i) => {
                if (i.uid == uid) {
                    return { uid, name };
                } else {
                    return i;
                }
            })
        } else {
            storageBlacklist.push({ uid, name });
        }

        GM_setValue('gamersky_blacklist', JSON.stringify(storageBlacklist));

        deleteAllUnameParentContOrCon(e.target);

        refreshBlacklistManagePanel();
    }

    return false;
}

function deleteUnameParentContOrCon(el) {
    while (1) {
        el = el.parentElement;

        if (!el) {
            break;
        }

        if (el.classList.contains('cmt_cont') || el.classList.contains('cmt_reply_con')) {
            if (!el.classList.contains('disable_comment')) {
                el.classList.add('disable_comment');
            }

            break;
        }
    }
}

function deleteAllUnameParentContOrCon() {
    document.querySelectorAll('.Comment a.uname').forEach((i) => {
        const currentUid = i.getAttribute('uid');

        if (storageBlacklist.some((j) => j.uid == currentUid)) {
            deleteUnameParentContOrCon(i);
        }
    })
}

function appendAddBlacklistBtn() {
    document.querySelectorAll('.Comment a.uname:first-child').forEach((i) => {
        if (i.querySelector('.delete_btn')) {
            return;
        }

        const deleteTag = document.createElement('span');

        deleteTag.className = 'delete_btn';

        deleteTag.innerText = '拉黑';

        deleteTag.addEventListener('click', addToBlacklist);

        i.appendChild(deleteTag)
    });
}

function observer() {
    appendAddBlacklistBtn();

    deleteAllUnameParentContOrCon();


    // document.querySelectorAll('.Comment .cmt_cont').forEach((i) => {
    //     if (i.querySelector('.cmt_con').innerText == hiddenText) {
    //         i.classList.add('disable_comment');

    //         addBlacklist(i.querySelector('.uname').innerText);
    //     } else {
    //         i.querySelectorAll('.cmt_reply .cmt_list .cmt_reply_con').forEach((j) => {
    //             if (blacklist.some((k) => k == j.querySelector('.huifu + .uname')?.innerText)) {
    //                 j.classList.add('disable_comment');
    //             } else if (j.querySelector('.cmt_msg .cmt_txt .content').innerText == hiddenText) {
    //                 j.classList.add('disable_comment');

    //                 addBlacklist(j.querySelector('.uname').innerText);
    //             }
    //         })
    //     }
    // });

    // console.log(`共拉黑${blacklist.length}`);

    // console.log('黑名单:', blacklist);

    // console.log(`共屏蔽${document.querySelectorAll('.disable_comment').length}条评论和回复`);
}

function appendManagePanel() {
    const panel = document.createElement('div');

    panel.classList.add('manage_panel');

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

    panelBody.classList.add('manage_panel_body');

    panel.appendChild(panelBody);

    panel.addEventListener('click', (e) => {
        if (e.target.classList.contains('blacklist_item')) {
            const uid = e.target.getAttribute('uid');

            const name = e.target.innerText;

            const ok = confirm(`是否取消拉黑 uid:${uid} 昵称:${name}?取消拉黑后会在下一次刷新生效。`);

            if (ok) {
                storageBlacklist = storageBlacklist.filter(i => i.uid != uid);

                GM_setValue('gamersky_blacklist', JSON.stringify(storageBlacklist));

                refreshBlacklistManagePanel();
            }
        }
    })

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

    panelSwitch.innerText = '收起';

    panelSwitch.classList.add('manage_panel_switch');

    panelSwitch.addEventListener('click', () => {
        panel.classList.add('hide');

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

        expand.innerText = '展开';

        expand.classList.add('manage_panel_show');

        expand.addEventListener('click', () => {
            panel.classList.remove('hide');

            expand.remove();

            GM_setValue('show_panel', 1);
        })

        document.body.appendChild(expand);

        GM_setValue('show_panel', 0);
    });

    if (showPanel == 0) {
        panel.classList.add('hide');

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

        expand.innerText = '展开';

        expand.classList.add('manage_panel_show');

        expand.addEventListener('click', () => {
            panel.classList.remove('hide');

            expand.remove();

            GM_setValue('show_panel', 1);
        })

        document.body.appendChild(expand);
    }

    panel.append(panelSwitch);

    document.body.appendChild(panel);

    refreshBlacklistManagePanel();
}

function refreshBlacklistManagePanel() {
    const blacklist = document.querySelector('.manage_panel .blacklist');

    if (blacklist) {
        blacklist.remove();
    }

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

    newBlacklist.classList.add('blacklist');

    storageBlacklist.forEach((u) => {
        const blacklistItem = document.createElement('div');

        blacklistItem.innerText = u.name;

        blacklistItem.setAttribute('uid', u.uid);

        blacklistItem.classList.add('blacklist_item')

        newBlacklist.appendChild(blacklistItem);
    });

    const panelBody = document.querySelector('.manage_panel .manage_panel_body');

    panelBody.appendChild(newBlacklist);
}

(function () {
    'use strict';

    try {
        const styleTag = document.createElement('style');

        styleTag.innerText = `
            .disable_comment.disable_comment.disable_comment.disable_comment.disable_comment.disable_comment {
                display: none!important;
            }
            .delete_btn {
                position: absolute;
                left: 0;
                top: -20px;
                background-color: #f5222d;
                color: #fff;
                padding: 0px 5px;
                display: none;
                border-radius: 4px;

            }
            .Comment a.uname:hover .delete_btn {
                display: inline-block;
            }
            .manage_panel {
                padding: 20px 10px 20px 20px;
                box-sizing: border-box;
                z-index: 10000;
                background-color: #fff;
                width: 200px;
                height: 300px;
                position: fixed;
                right: 0;
                top: calc(50% - 150px);
                border-top-left-radius: 20px; 
                border-bottom-left-radius: 20px; 
            }
            .manage_panel .manage_panel_switch {
                background-color: #fff;
                position: absolute;
                height: 20px;
                width: 100%;
                bottom: 0;
                left: 0;
                text-align: center;
                color: #333;
                cursor: pointer;
            }
            .manage_panel .manage_panel_body {
                height: 100%;
                overflow: auto;
            }
            .manage_panel .blacklist {
                padding-top: -3px;
            }
            .manage_panel .blacklist .blacklist_item {
                padding: 4px 4px;
                cursor: pointer;
                margin-top: 3px;
                color: #333;
            }
            .manage_panel .blacklist .blacklist_item:hover {
                background-color: #f0f0f0
            }
            .manage_panel.hide {
                display: none;
            }
            .manage_panel_show {
                border-top-left-radius: 10px;
                border-bottom-left-radius: 10px;
                width: 20px;
                height: 33px;
                background-color: #fff;
                z-index: 10000;
                position: fixed;
                right: 0;
                top: calc(50% - 20px);
                cursor: pointer;
                color: #333;
                text-align: right;
                padding: 5px 5px 5px 0px;
            }
        `;

        document.head.append(styleTag);

        appendManagePanel();

        const mbConfig = {
            childList: true,
            subtree: true
        };

        const mb = new MutationObserver(observer);

        let tryCounts = 0;

        const timer = setInterval(() => {
            tryCounts++;

            const comments = document.querySelector('.Comment .cmt-content .cmt_list_cont');

            if (comments) {
                mb.observe(comments, mbConfig);

                clearInterval(timer);
            } else if (tryCounts > 100) {
                console.log('脚本启动失败');

                clearInterval(timer);
            }
        }, 100);

    } catch (e) {
        alert('出错了,请关闭脚本');

        throw e;
    }
})();