Youtube comments blocker

Block comments from specified uploader's videos.

// ==UserScript==
// @name         Youtube 评论区屏蔽工具
// @name:en      Youtube comments blocker
// @namespace    ckylin-script-ytb-comments-blocker
// @version      0.1
// @description  屏蔽指定上传者的视频下方评论
// @description:en Block comments from specified uploader's videos.
// @author       CKylinMC
// @match        https://www.youtube.com/watch?v=*
// @grant        unsafeWindow
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_info
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @license      GPL-3.0-only
// ==/UserScript==

(function() {
    'use strict';

    const wait = t => new Promise(r => setTimeout(r,t));
    const waitFor = async q => {
        let trialTimes = 50;
        while(--trialTimes>=0){
            let dom = document.querySelector(q);
            if(dom) return dom;
            await wait(200);
        }
        return null;
    }
    const hasBlocked = async link => (await GM_getValue(link))=="Blocked";
    const addBlock = async link => {
        if(!(await hasBlocked(link))){
            await GM_setValue(link,"Blocked");
        }
    }
    const unBlock = async link => {
        if((await hasBlocked(link))){
            await GM_setValue(link,"0");
        }
    }
    const rmStyle = () => {
        const doms = document.querySelectorAll("style.CK-ytb-blocker");
        if(doms) [...doms].forEach(e=>e.remove());
    }
    const addStyle = s =>{
        const style = document.createElement("style");
        style.classList.add("CK-ytb-blocker");
        style.innerHTML = s;
        document.head.appendChild(style);
    }
    const menuId = {
        lastMenu: null
    }

    function addBlockMenu(link){
        if(menuId.lastMenu) GM_unregisterMenuCommand(menuId.lastMenu);
        menuId.lastMenu = GM_registerMenuCommand("屏蔽此Uploader / Block this Uploader", async () => {
            await addBlock(link);
            tryDetect();
        });
    }

    function addUnBlockMenu(link,ytd_comments){
        if(menuId.lastMenu) GM_unregisterMenuCommand(menuId.lastMenu);
        menuId.lastMenu = GM_registerMenuCommand("取消屏蔽此Uploader / Unblock this Uploader", async () => {
            await unBlock(link);
            const tip = document.querySelector("#CK-ytb-blocktip");
            if(tip) tip.remove();
            rmStyle();
            ytd_comments.style.display = "block";
            addBlockMenu(link);
        });
    }

    async function tryDetect(){
        const ytd_ch_link_q = "#text-container.ytd-channel-name a";
        const ytd_ch_link_dom = await waitFor(ytd_ch_link_q);
        if(!ytd_ch_link_dom) return console.log("[CommentsBlocker] No channel link detected.");
        const ytd_ch_link_href = ytd_ch_link_dom.href;
        if((await hasBlocked(ytd_ch_link_href))){
            //addStyle(`ytd-comments,#comments{display:none!important;}`);
            const ytd_comments = document.querySelector("#comments");
            const blocktip = document.createElement("center");
            addUnBlockMenu(ytd_ch_link_href,ytd_comments);
            blocktip.id = "CK-ytb-blocktip";
            blocktip.innerHTML = "Comments has been blocked.";
            blocktip.style.color = getComputedStyle(ytd_ch_link_dom).color;
            ytd_comments.parentNode.insertBefore(blocktip,ytd_comments);
            ytd_comments.style.display = "none";
        }else{
            addBlockMenu(ytd_ch_link_href);
        }
    }
    tryDetect();
})();