虎牙弹幕屏蔽及热度排序

弹幕屏蔽关键词(在原屏蔽按钮后面),直播页面按热度排序。

// ==UserScript==
// @name         虎牙弹幕屏蔽及热度排序
// @namespace    http://tampermonkey.net/
// @version      1.33
// @description  弹幕屏蔽关键词(在原屏蔽按钮后面),直播页面按热度排序。
// @author       Hugo16
// @match        *://www.huya.com/*
// @grant        GM_addStyle
// @run-at       document-end
// @require      http://code.jquery.com/jquery-1.7.2.min.js
// @namespace    https://greasyfork.org/users/238424
// ==/UserScript==

(function () {
    'use strict';

    // 添加屏蔽界面
    var blockWordsWrap = $('<div class="block-mask-wrap"><div id="block-mask"></div><div id="blockWrap"><div id="bWtop"><input id="blockWord"/><button id="blockBtn">屏蔽</button></div><div id="wordsWrap"><ul></ul></div></div></div>');
    $("body").append(blockWordsWrap);
    blockWordsWrap.hide();
    var blockShowBtn = $("<i class='room-chat-tool room-chat-tool-blockWords' id='J_roomChatIconBlockWords1' title='免登录屏蔽'></i>");
    findElement("J_roomChatIconBlockWords",function(){
        $("#J_roomChatIconBlockWords").after(blockShowBtn);
        blockShowBtn.on("click",function(){
            blockWordsWrap.show();
        })
        $("#block-mask").on("click",function(){
            blockWordsWrap.hide();
        })
    })

    // 读取屏蔽词
    var blockWords = readBlockWords();
    // 添加屏蔽词
    $("#blockBtn").on("click",function(){
        var word = $("#blockWord").val().toLocaleUpperCase();
        if(word!=""){
            blockWords.push(word);
            $("#wordsWrap ul").append("<li><span class='keyWords'>"+word+"</span><span class='cancelBtn'>取消屏蔽<span></li>");
        }
        writeBlockWords(blockWords);
    });
    // 删除屏蔽词
    $("#wordsWrap ul").on("click","li span.cancelBtn",function(event){
        var target = $(event.target);
        var word = target.prev().text();
        target.parent().remove();
        blockWords = $.grep(blockWords, function(value) {
            return value != word;
        });
        writeBlockWords(blockWords);
    })


    // 检测新弹幕
    window.onload = function(){
        $("#danmudiv").bind("DOMNodeInserted", function(){
            var item = $(this).children("div:last");
            var text = item.children("span").text();
            if(compareStr(text,blockWords)){
                item.children("span").html("")
            }
        });
    }

    // 热度排序
    sort();
})();

// 寻找元素
function findElement(name,func){
    if(document.getElementById(name)|| document.getElementsByClassName(name)){
        func();
    }
    else{
        setTimeout(function(){findDanmuDiv(func)},500);
    }
}

// 比较屏蔽词
function compareStr(str,strArr){
    for(var i=0;i<strArr.length;i++){
        if(str.toLocaleUpperCase().indexOf(strArr[i])>=0){
            console.log(strArr[i] + ":" + str);
            return true;
        }
    }
    return false;
}

// 读取屏蔽词
function readBlockWords(){
    var words = [];
    // 读取屏蔽词
    if(localStorage.getItem("huyaBlock")!=null&&localStorage.getItem("huyaBlock")!=""){
        words = localStorage.getItem("huyaBlock").split(',')
    }
    for(var i=0;i<words.length;i++){
        $("#wordsWrap ul").append("<li><span class='keyWords'>"+words[i]+"</span><span class='cancelBtn'>取消屏蔽<span></li>");
    }
    return words;
}

// 写入屏蔽词
function writeBlockWords(blockWords){
    var words = blockWords.join(",");
    window.localStorage.setItem('huyaBlock',words)
}

// 热度排序
function sort() {

    setTimeout(() => {
        let fHot = document.getElementsByClassName("js-num");
        if(!fHot[0]){
            fHot = $(".subscribe-live-item .num");
            if(!fHot[0]){
            return;
        }
        }
        if (fHot[0].innerHTML != "") {
            let lists = document.getElementById("js-live-list");
            if (!lists) {
                lists = document.getElementsByClassName("live-list")[0];
                if (!lists) {
                    return;
                }
            }

            let arr = new Array();

            let list = lists.children;
            for (let i = 0; i < list.length; i++) {
                let hot;
                if($(list[i]).find(".js-num").length!=0){
                    hot = list[i].getElementsByClassName("js-num")[0].innerText;
                }
                else if($(list[i]).find(".num").length!=0){
                    try{
                        hot = list[i].getElementsByClassName("num total")[0].innerText;
                    }
                    catch{
                        hot = "0";
                    }
                }
                else{
                    return;
                }
                hot = hot.replace(/,/g,'');
                console.log(hot)
                if (hot.indexOf("万") != -1) {
                    hot = hot.replace(/万/, "") * 1 * 10000;
                }
                else if (hot.indexOf("亿") != -1) {
                    hot = hot.replace(/亿/, "") * 1 * 100000000;
                }
                arr.push([list[i], hot])
            }

            arr.sort(function (a, b) {
                return b[1] - a[1];
            })

            lists.innerHTML = "";
            for (let j = 0; j < arr.length; j++) {
                $(arr[j][0]).find('.pic').attr("src",$(arr[j][0]).find('.pic').attr("data-original"));
                lists.appendChild(arr[j][0]);
            }

        }
        else {
            sort();
        }

    }, 10);

}

var content = document.getElementsByClassName('js-responded-list')[0];


GM_addStyle(".block-mask-wrap { width: 100%; height: 100%;top:0;position:absolute;z-index:99999}"
            + "#block-mask { width: 100%; height: 100%; background: #000; opacity: .5;}"
            + "#blockWrap { width: 500px; height: 500px;top:50%;left:50%;margin:-250px 0 0 -250px; background: white;opacity:1; position: absolute; bottom: 0; border-top: 1px solid #80808042; padding: 10px;border-radius:3px; }"
            + "#bWtop { display: flex;height:30px;margin-bottom:3px}"
            + "#blockWord { width: 70%; margin-right: 3%;}"
            + "#blockBtn { width: 20%}"
            + "#wordsWrap { overflow: auto;height:calc(100% - 33px)}"
            + "#wordsWrap>ul>li { display: flex;height:35px;align-items: center;padding-left:3px;color:#808080b5;}"
            + "#wordsWrap>ul>li:nth-child(Odd) { background:#8080804f;}"
            + "#wordsWrap>ul>li:hover { background:#f49f0fb3;color:white;}"
            + "#wordsWrap>ul>li>span:nth-child(1) { width: 354px; margin-right: 15px;}"
            + "#wordsWrap>ul>li>span:nth-child(2) { width:20%;text-align:center;cursor:pointer}");