Greasy Fork is available in English.

BiliBili 直播颜文字

恢复直播区颜文字功能

// ==UserScript==
// @name         BiliBili 直播颜文字
// @namespace    mscststs
// @version      0.12
// @description  恢复直播区颜文字功能
// @author       mscststs
// @match        *://live.bilibili.com/*
// @icon         https://www.google.com/s2/favicons?domain=bilibili.com
// @require      https://greasyfork.org/scripts/38220-mscststs-tools/code/MSCSTSTS-TOOLS.js?version=713767
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const IconContainerQuery = ".control-panel-icon-row>.icon-left-part";
    let dataVersion = "data-v-39dcacee";
    const emojiList = ["(⌒▽⌒)", "( ̄▽ ̄)", "(=・ω・=)", "(`・ω・´)", "(〜 ̄△ ̄)〜", "(・∀・)", "(°∀°)ノ", "( ̄3 ̄)", "╮( ̄▽ ̄)╭", "_(:3」∠)_", "( ´_ゝ`)", "←_←", "→_→", "(<_<)", "(>_>)", "(;¬_¬)", '("▔□▔)/', "(゚Д゚≡゚д゚)!?", "Σ(゚д゚;)", "Σ(  ̄□ ̄||)", "(´;ω;`)", "(/TДT)/", "(^・ω・^ )", "(。・ω・。)", "(● ̄(エ) ̄●)", "ε=ε=(ノ≧∇≦)ノ", "(´・_・`)", "(-_-#)", "( ̄へ ̄)", "( ̄ε(# ̄) Σ", "ヽ(`Д´)ノ", "(#-_-)┯━┯", "(╯°口°)╯(┴—┴", "←◡←", "( ♥д♥)", "Σ>―(〃°ω°〃)♡→", "⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", "(╬゚д゚)▄︻┻┳═一", "・*・:≡( ε:)", "(汗)", "(苦笑)"];
    const styles = `
.emoji-icon{
    margin: 0 5px;
    font-size: 14px !important;
    transform:scale(1.4);
    vertical-align: middle;
    color: #c8c8c8;
    transition: color cubic-bezier(.22,.58,.12,.98) .4s;
    cursor:default;
    display:inline-block;
    width:20px;
    height:20px;
    user-select:none;
    user-focus:
    outline:none;
}
.emoji-icon:hover, .emoji-icon:focus{
    color:#21a5da !important;
}
#emojiBox{
    transform-origin: 63px bottom;
    width: 280px;
    margin: 0px 0px 0px -140px;
    left: 50%;
    bottom: 100%;
    padding: 10px;
    position: absolute;
    z-index: 699;
    display:flex;
    flex-direction:row;
    justify-content: flex-start;
    flex-flow:row wrap;
}
.emoji-item{
    display:inline-block;
    padding: 4px 4px;
    cursor:pointer;
    user-select:none;
    transition: all 0.25s;
}
.emoji-item:hover{
    color:#21a5da;
}
    `

    let panelVisible = false;

    // 创建 Dom 元素
    function createElement(tag, innerHTML, attrs = {}){
        let ele = document.createElement(tag);
        ele.innerHTML = innerHTML;
        Object.entries(attrs).map(([key,value])=>{
            ele.setAttribute(key,value || "")
        })
        return ele;
    }

    // 创建 Style 标签
    function insertStyle(){
        let styleEle = createElement("style", styles);
        document.head.append(styleEle)
    }

    // 显示面板
    function showPanel(){
        let panel = createElement("div","",{
            class:"border-box dialog-ctnr common-popup-wrap top-center",[dataVersion]:"", id:"emojiBox"
        })
        let parent= document.querySelector("#control-panel-ctnr-box");

        emojiList.forEach(item=>{
            const emojiEle = createElement("span",item,{
                class:"emoji-item"
            })
            emojiEle.addEventListener("click",()=>{
                let ele = document.querySelector("#chat-control-panel-vm > div > div.chat-input-ctnr.p-relative > div > textarea");


                ele.value = ele.value + item;
				let e = new Event('input',{bubbles:true, cancelable: true, composed:true});
				let f = new Event('focus',{bubbles:true, cancelable: true, composed:true});

                ele.dispatchEvent(e);

                ele.focus()
                setTimeout(()=>{
                    ele.dispatchEvent(f);
                },10)
                // 选择表情后关闭面板
                panelVisible =!panelVisible;
                hidePanel();
            })
            panel.append(emojiEle)
        })
        parent.append(panel)

    }
    // 隐藏面板
    function hidePanel(){
        document.querySelector("#emojiBox").remove()

    }

     async function init(){
        let IconContainer = await mscststs.wait(IconContainerQuery);
         // 重设 Data-v 版本
        dataVersion = [...IconContainer.attributes].find(item=>item.name.startsWith("data-v")).name;
         console.log({class:"icon-item icon-font live-skin-main-text emoji-icon", title:"颜文字",[dataVersion]:""})
        // 在 IconConatiner 添加颜文字 Icon
        const emojiIcon = createElement("span",
                                            `☻`,
                                            {class:"icon-item icon-font live-skin-main-text emoji-icon", title:"颜文字",[dataVersion]:"", tabindex:-1}
                                          );
        IconContainer.append(emojiIcon);
        emojiIcon.addEventListener("click",(e)=>{
            panelVisible =!panelVisible;
            if(panelVisible){
                showPanel();
            }else{
                hidePanel();
            }
            e.stopPropagation()
        })
        document.addEventListener("click",()=>{
            if(panelVisible){
                panelVisible =!panelVisible;
                hidePanel();
            }
        })

     };
    // Start
    insertStyle();
    init();
})();