Steam Hide Blacklist Comments

steam隐藏黑名单评测

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Steam Hide Blacklist Comments
// @namespace    
// @version      0.3.1
// @description  steam隐藏黑名单评测
// @license      MIT
// @author       lyzlyslyc
// @match        http*://store.steampowered.com/app/*
// @match        http*://steamcommunity.com/app/*
// @enable       true
// @grant        GM_getValue
// @grant        GM_setValue
// @run-at       document-end
// ==/UserScript==

//是否默认勾选隐藏评测
var checked = true;

//默认的关键字或正则表达式(正则表达式使用/包围,例如/abc/)
var default_blacklist=[
     "我是傻逼",
     "口了",
     "明逼",
     "⣿⣿⣿⣿⣿⣿⣹⡋⠘⠷⣦⣀⣠⡶⠁⠈⠁⠄⣿⣿⣿⣿⣿⣿⣿",
     "需要中文",
     "产品已退款",
     /伞兵/
];

var blacklist=[];

var blocked_comments_list = [];

var isStore = true;

var tMsg = 0;

var isSteamClient = navigator.userAgent.search(/Valve Steam Client/)!=-1;

(function(){
    'use strict';

    //获取关键字
    let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
    blacklist = parseBlacklist(str);

    //steam客户端
    if(isSteamClient){
        window.addEventListener("message",(e)=>{
            try{
                let data = JSON.parse(e.data);
                if(data.steam_blacklist!=null){
                    GM_setValue("steam_blacklist",data.steam_blacklist);
                    console.log(data.steam_blacklist);
                    e.source.postMessage(JSON.stringify({"steam_blacklist_feedback":true}),e.origin);
                    alert("关键词同步成功");
                    window.close();
                }
                else if(data.steam_blacklist_feedback!=null){
                    clearInterval(tMsg);
                }
            }
            catch(ex){
                alert(ex);
                e.source.postMessage(JSON.stringify({"steam_blacklist_feedback":false}),e.origin);
                window.close();
                console.log(ex);
            }
        });
    }

    //设置对话框
    let dlg_settings = document.createElement("div");
    dlg_settings.className = "blacklist_hover";
    dlg_settings.style = "width: 400px; height: 500px; position: fixed; margin-left: auto; left: 0px; right: 0px; margin-right: auto; top: 25%; background: rgb(27, 40, 56); border-radius: 25px; z-index: 999; text-align: center;";
    dlg_settings.innerHTML=
        '<div style="position: relative;top: 2%;font-size: 18px;color: #4a86ad;">关键词列表(按行分隔)</div>'+
        '<textarea type="text" id="blacklist_text" style="width: 90%;height: 80%;position: absolute;left: 4%;top: 8%;resize: none;background: #316282;color: #fffff1;font-family: Arial, Helvetica, sans-serif;border-radius: 3px;padding: 3px;font-size: 16px;" draggable="false"></textarea>'+
        '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;left: 8%;width: 24%;" id="save_blacklist"><span>保存</span></a>'+
        '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;left: 38%;width: 24%;" id="reset_blacklist"><span>默认</span></a>'+
        '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;right: 8%;width: 24%;" id="cancel_blacklist"><span>取消</span></a>';
    document.body.appendChild(dlg_settings);
    document.querySelector(".blacklist_hover").style.display="none";
    //取消按钮
    document.querySelector("#cancel_blacklist").addEventListener("click",()=>{
        document.querySelector(".blacklist_hover").style.display="none";
    });
    //保存按钮
    document.querySelector("#save_blacklist").addEventListener("click",()=>{
        try{
            //更新黑名单
            blacklist = parseBlacklist(document.getElementById("blacklist_text").value);
            //保存黑名单至本地
            GM_setValue("steam_blacklist",document.getElementById("blacklist_text").value);

            //steam客户端
            if(isSteamClient){
                let baseUrl = "";
                if(isStore)baseUrl = "https://steamcommunity.com";
                else baseUrl = "https://store.steampowered.com";
                baseUrl+=location.href.match(/\/app\/\d*/)[0];
                let win = window.open(baseUrl);
                tMsg = setInterval(()=>{
                    if(!win.closed)win.postMessage(JSON.stringify({"steam_blacklist":document.getElementById("blacklist_text").value}),baseUrl);
                    else clearInterval(tMsg);
                },1000);
            }

            //更新隐藏评论
            blocked_comments_list = [];
            if(isStore){
                let count = 0;
                document.querySelectorAll(".review_ctn .review_box").forEach((item)=>{
                    item.showComment();
                    if(checkForBlacklist(item,item))count++;
                });
                document.getElementById("blacklist_comments_count").innerText=`(共${count}条)`;
            }
            else {
                document.querySelectorAll(".apphub_UserReviewCardContent").forEach((item)=>{
                    let parent = item.parentNode;
                    parent.showComment();
                    checkForBlacklist(item,parent);
                });
            }
            hideComments();
            //关闭对话框
            document.querySelector(".blacklist_hover").style.display="none";
        }
        catch(ex){
            alert(ex);
        }
    });
    //重置按钮
    document.querySelector("#reset_blacklist").addEventListener("click",()=>{
        document.getElementById("blacklist_text").value = getBlacklistText(default_blacklist);
    });


    //分页面初始化
    if(location.href.search(/steampowered.com/)!=-1){
        isStore = true;
        let check = document.createElement("input");
        check.type="checkbox";
        check.id="check_hide";
        check.checked = checked;
        check.addEventListener("click", hideComments);

        let count = document.createElement("span");
        count.id="blacklist_comments_count";

        //打开设置对话框按钮
        let a = document.createElement("a");
        a.id="blacklist_settings";
        a.innerText="设置关键词";
        a.addEventListener("click", ()=>{
            //获取关键字
            let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
            blacklist = parseBlacklist(str);
            //显示文本
            document.getElementById("blacklist_text").value=getBlacklistText(blacklist);
            document.querySelector(".blacklist_hover").style.display="block";
        });
        a.href = "javascript:void(0);";

        let span = document.createElement("span");
        span.className="hide_blacklist_comments";
        span.appendChild(check);
        span.append("隐藏黑名单评论");
        span.append(count);
        span.append(a);
        document.querySelector(".user_reviews_summary_bar").appendChild(span);
        initAppView();

        //监控是否更新评论列表
        var observer = new MutationObserver(function (mutations, observer) {
            mutations.forEach(function(mutation) {
                if(mutation.target.style.display!="none")return;
                initAppView();
            });
        });
        //开始监控
        observer.observe(document.querySelector("#Reviews_loading"),{"attributes":true});
    }
    else{
        isStore = false;

        let check = document.createElement("input");
        check.type="checkbox";
        check.id="check_hide";
        check.checked = checked;
        check.addEventListener("click", hideComments);
        check.style = "vertical-align: top;";

        //打开设置对话框按钮
        let a = document.createElement("a");
        a.id="blacklist_settings";
        a.innerText="设置关键词";
        a.addEventListener("click", ()=>{
            //获取关键字
            let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
            blacklist = parseBlacklist(str);
            //显示文本
            document.getElementById("blacklist_text").value=getBlacklistText(blacklist);
            document.querySelector(".blacklist_hover").style.display="block";
        });
        a.href = "javascript:void(0);";
        a.style="color: #67c1f5;";

        let span = document.createElement("span");
        span.className="hide_blacklist_comments";
        span.style = "float: right;color: #ffffff;";
        span.appendChild(check);
        span.append("隐藏黑名单评论");
        span.append(a);

        document.querySelector(".apphub_sectionTabs > div").before(span);
        initCommunityView();
    }
})();

//商店页面
function initAppView(){
    if(document.querySelector("#Reviews_loading").style.display!='none'){
        setTimeout(initAppView,500);
        return;
    }

    //黑名单总数
    let count = 0;
    blocked_comments_list = [];
    document.querySelectorAll(".review_ctn .review_box").forEach((item)=>{
        //右侧小评测
        if(item.classList.contains('short')){
            //添加显示和隐藏函数
            item.hideComment = function(){
                this.querySelector(".shortcol").hidden = true;
                if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "展开评测";
            };
            item.showComment = function(){
                this.querySelector(".shortcol").hidden = false;
                if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "折叠评测";
            };
            item.hasHidden = function(){
                return item.querySelector(".shortcol").hidden;
            }
            //添加按钮
            addFoldButton(item.querySelector(".short_header"),item);
        }
        //左侧大评测
        else if(item.querySelector(".rightcol")!=null){
            //添加显示和隐藏函数
            item.hideComment = function(){
                this.querySelector(".rightcol").hidden = true;
                if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "展开评测";
            };
            item.showComment = function(){
                this.querySelector(".rightcol").hidden = false;
                if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "折叠评测";
            };
            item.hasHidden = function(){
                return item.querySelector(".rightcol").hidden;
            }
            //添加按钮
            addFoldButton(item.querySelector(".num_reviews"),item);
        }
        //检查是否加入黑名单
        if(checkForBlacklist(item,item))count++;
    });

    document.getElementById("blacklist_comments_count").innerText=`(共${count}条)`;
    hideComments();
}

function initCommunityView(){
    var observer = new MutationObserver(function (mutations, observer) {
        mutations.forEach(function(mutation) {
            if(mutation.type!="childList")return;
            mutation.addedNodes.forEach((node)=>{
                if(!(/page\d+/).test(node.id))return;
                if(node.id=="page1")return;
                checkNewPage(node);
                hideComments();
            })
        });
    });
    //开始监控
    observer.observe(document.querySelector("#AppHubCards"),{"childList":true});
    checkNewPage(document.getElementById("page1"));
    hideComments();
}

//点击隐藏按钮
function hideComments(){
    if(document.getElementById("check_hide").checked){
        blocked_comments_list.forEach((item)=>{
            item.hideComment();
        });
    }
    else{
         blocked_comments_list.forEach((item)=>{
            item.showComment();
        });
    }
}

//添加折叠按钮
function addFoldButton(neighborDiv, targetDiv){
    if(neighborDiv==null||targetDiv==null)return;
    if(targetDiv.querySelector(".hide_comment")!=null)return;
    let a = document.createElement("a");
    a.style = "float: right;color: #66c0f4;";
    a.href = "javascript:void(0);";
    a.className = "hide_comment";
    a.addEventListener("click",()=>{
        if(targetDiv.hasHidden()){
            targetDiv.showComment();
        }
        else{
            targetDiv.hideComment();
        }
    })
    if(targetDiv.hasHidden())a.innerText="展开评测";
    else a.innerText="折叠评测";
    neighborDiv.after(a);
    return a;
}

function checkNewPage(page){
    //新页面,寻找所有测评文字块
    if(page==null)return;
    page.querySelectorAll(".apphub_UserReviewCardContent").forEach((item)=>{
        let commentString = item.querySelector(".apphub_CardTextContent").innerHTML.replace(/\t/g,"").replace(/\n/g,"").replace(/(<div[^>]*>[^<>]*<\/div>)|(<[^<]*>)/g,"");
        commentString = commentString.replace(/[^\u4e00-\u9fa5_a-zA-Z0-9]*/g,"");
        item.commentLength = commentString.length;
        //测评父节点
        let parent = item.parentNode;
        //隐藏消息div
        if(parent.querySelector(".hidden_message")==null){
                let div = document.createElement("div");
            div.className = "hidden_message";
            div.style = "text-align: center;color: yellow;font-size: 20px;transform: translateY(-200%);";
            div.innerText = `测评已隐藏,共${item.commentLength}字`;
            div.hidden = true;
            parent.querySelector(".UserReviewCardContent_Footer").prepend(div);
        }
        parent.hideComment = function(){
            this.querySelector(".apphub_UserReviewCardContent").hidden = true;
            this.querySelector(".hidden_message").hidden = false;
        };
        parent.showComment = function(){
            this.querySelector(".apphub_UserReviewCardContent").hidden = false;
            this.querySelector(".hidden_message").hidden = true;
        }
        //检查是否加入黑名单
        checkForBlacklist(item,parent);
    });
}

//黑名单列表转换为字符串
function getBlacklistText(blacklist){
    let str="";
    blacklist.forEach((item)=>{str+=item.toString()+"\n";})
    return str;
}
//字符串转换为黑名单列表
function parseBlacklist(blacklistString){
    let str_list = blacklistString.split("\n");
    let obj_list = [];
    str_list.forEach((item)=>{
        item = item.trim();
        if(item=="")return;
        if(/^\/.*\/$/.test(item)){
            obj_list.push(new RegExp(item.replace(/^\/(.*)\/$/,"$1")));
        }
        else obj_list.push(item);
    });
    return obj_list;
}
//检查是否加入黑名单
function checkForBlacklist(checkItem,pushItem){
    for(let i=0;i<blacklist.length;i++){
        if(checkItem.innerHTML.search(blacklist[i])!=-1){
            blocked_comments_list.push(pushItem);
            return true;
        }
    }
    return false;
}