Greasy Fork

Greasy Fork is available in English.

CC98 Block

block the user you don't want to see his reply.

当前为 2021-11-18 提交的版本,查看 最新版本

// ==UserScript==
// @name         CC98 Block
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  block the user you don't want to see his reply.
// @author       kumiko
// @match        *://www.cc98.org/topic/*
// @match        *://www.cc98.org/newTopics
// @match        *://www.cc98.org/focus
// @match        *://www.cc98.org/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @license      AGPL-3.0
// @require      http://greasyfork.icu/scripts/2199-waitforkeyelements/code/waitForKeyElements.js?version=6349
// ==/UserScript==

let starttime=new Date();
console.log ("==> Script start.", starttime );


var ban_user_list = new Array();
var ban_topic_list = new Array();

if (localStorage.ban_user_list) {
    ban_user_list = JSON.parse(localStorage.ban_user_list);
}

if (localStorage.ban_topic_list) {
    ban_topic_list = JSON.parse(localStorage.ban_topic_list);
}


// 添加拉黑按钮
function addUserBtn(commentlike, user_message) {
    var b = document.createElement('button');
    b.textContent = '拉黑';
    b.style.cssText = 'width: 25%;height: 25%; text-align: center; vertical-align:bottom; margin-left: 8px';
    b.addEventListener('click', banUser);
    b.user_message = user_message;
    commentlike.appendChild(b);
}

function addTopicBtn(focus_topic) {
    var span = document.createElement('span');
    span.innerText = '屏蔽';
    // b.style.cssText = 'width: 25%;height: 25%; text-align: center; vertical-align:bottom; margin-left: 8px';
    span.addEventListener('click', banTopic);
    span.style.cssText = 'width: 40px';
    span.focus_topic = focus_topic;
    var focus_topic_info = focus_topic.querySelector('.focus-topic-info');
    focus_topic_info.insertBefore(span, focus_topic_info.firstChild);
}


function loadFocus() {
    var focus_topics = document.querySelectorAll('.focus-topic');
    // console.log('[loadFocus]: ', user_messages);
    focus_topics.forEach(
        function(el) {
            //var user_message = el.querySelector('.focus-topic-userName');
            //console.log('[LoadFocus] current topic user name: ', el.textContent);
            if (el) {
                if (removeTopic(el) == false) {
                    addTopicBtn(el);
                }
            }
        }
    );
}

function loadMoreTopic(mutationsList) {
    for (const mutation of mutationsList) {
        var focus_topic = mutation.addedNodes[0];
        // console.log('[loadMoreTopic] user name: ', user_name);
        if (focus_topic) {
            if (removeTopic(focus_topic) == false) {
                addTopicBtn(focus_topic);
            }
        }
    }
}




// 删除当前回复
function removeReply(user_message) {
    var user_name = user_message.text;
    if (ban_user_list.includes(user_name)) {
        try {
            // user_message.offsetParent.remove();
            // user_message.offsetParent.style.visibility = "hidden";
            user_message.offsetParent.style.display = "none";
            console.log ("==> Hidden user's reply ", user_name );
        } catch (e) {}

        return true;
    }
    return false;
}

function banTopic(event) {
    var r = window.confirm('确认屏蔽此贴?');
    if (r) {
        var topic = event.currentTarget.focus_topic.querySelector('.focus-topic-title').getAttribute('href').slice(7,-2);
        if (!ban_topic_list.includes(topic)) {
            ban_topic_list.push(topic);
            localStorage.ban_topic_list = JSON.stringify(ban_topic_list);
        }
        removeTopic(event.currentTarget.focus_topic);
    }
}


function banUser(event) {
    var r = window.confirm('确认拉黑此用户?');
    if (r) {
        var user_name = event.currentTarget.user_message.text;
        if (!ban_user_list.includes(user_name)) {
            ban_user_list.push(user_name);
            localStorage.ban_user_list = JSON.stringify(ban_user_list);
        }

        removeReply(event.currentTarget.user_message);
    }
}



function loadReply() {
    console.log('Begin Search Reply');
    var replys = document.querySelectorAll('.reply');
    replys.forEach(
        function(el) {
            var user_message = el.querySelector('.userMessage-userName');
            if (user_message) {
                var commentlike = el.querySelector('#commentlike');
                if (removeReply(user_message) == false) {
                    addUserBtn(commentlike, user_message);
                }
            }
        }
    );
}


function loadHot() {
    console.log('Begin Search Hot Reply');
    var replys = document.querySelectorAll('[id^=hot]');

    replys.forEach(
        function(el) {
            var user_message = el.querySelector('.userMessage-userName');
            if (user_message) {
                var commentlike = el.querySelector('#commentlike');
                if (removeReply(user_message) == false) {
                    addUserBtn(commentlike, user_message);
                }
            }
        }
    );
}


function removeTopic(focus_topic) {
    var user_name = focus_topic.querySelector('.focus-topic-userName').textContent;
    var topic_href = focus_topic.querySelector('.focus-topic-title').getAttribute('href').slice(7, -2);
    if (ban_user_list.includes(user_name) || ban_topic_list.includes(topic_href)) {
        try {
            focus_topic.style.display = "none";
            console.log ("==> Rmove user's topic ", user_name, topic_href );
        } catch(e) {}
        return true;
    } else {
        if (focus_topic.style.display == "none") {
            focus_topic.style.display = "";
        }
        return false;
    }
}

function removeTopicByUser(user_message) {
    var user_name = user_message.textContent;
    if (ban_user_list.includes(user_name)) {
        try {
            user_message.parentElement.parentElement.style.display = "none";
            console.log ("==> Rmove user's topic ", user_name );
        } catch(e) {}
        return true;
    } else {
        if (user_message.parentElement.parentElement.style.display == "none") {
            user_message.parentElement.parentElement.style.display = "";
        }
        return false;
    }
}

// sleep time expects milliseconds
function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}


function callback(mutationsList, observer) {
    // console.log(mutationsList);
    if (mutationsList[0].type === 'attributes') {
        observer.disconnect();
        observer.observe(
            document.querySelector('.focus-topic-title'),
            {attributes: true}
        );
        console.log('[callback from mutationObserverL] Focus hover changes, mutationObserverF oberserver changes.');
        loadFocus();
    } else if (mutationsList[0].type === 'childList') {
        if (mutationsList[0].removedNodes.length > 0) {
            console.log('[callback from mutationObserverF] Current Focus-topic number changes according to focus hover changes');
            return;
        } else {
            console.log('[callback from mutationObserverF] Current Focus-topic number changes');
            loadMoreTopic(mutationsList);
        }
    }
}

var mutationObserverL = new MutationObserver(callback);
var mutationObserverF = new MutationObserver(callback);

function focusHoverMO() {
    console.log('Run function focusHoverMO');
    mutationObserverL.disconnect();
    var intv = setInterval(function() {
        var topic_title = document.querySelector('.focus-topic-title');
        if (topic_title == null) {
            return false;
        }
        //when element is found, clear the interval.
        clearInterval(intv);
        mutationObserverL.observe(
            topic_title,
            {attributes: true}
        )
    }, 10);
    // mutationObserverL.observe(
    //     document.querySelector('.focus-topic-title'),
    //     {attributes: true}
    // )
}

function focusTopicAreaMO() {
    loadFocus();
    console.log('Run function focusTopicAreaMO');
    mutationObserverF.disconnect();
    mutationObserverF.observe(
        document.querySelector('.focus-topic-topicArea'),
        {childList: true}
    )
}

waitForKeyElements("#1", loadReply);
waitForKeyElements("#hot_0", loadHot);
// waitForKeyElements(".focus-topic-topicArea", loadFocus);
waitForKeyElements(".focus-board-area", focusHoverMO);
waitForKeyElements(".focus-topic-topicArea", focusTopicAreaMO);




let endtime=new Date();
console.log ("==> Script end.", endtime );
console.log("script load in", endtime.getTime()-starttime.getTime(), "ms");