Nicolive Comment Adapter

add information to nicolive comment area

目前為 2020-12-17 提交的版本,檢視 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Nicolive Comment Adapter
// @version      0.3
// @grant        none
// @run-at       document-start
// @match        https://live2.nicovideo.jp/watch/lv*
// @description  add information to nicolive comment area
// @namespace https://greasyfork.org/users/715401
// ==/UserScript==

(function () {
    // Style fix
    var styleNode = document.createElement ('style');
    styleNode.textContent = `
span.___table-cell___3E0rV {
    width: 99% !important;
}

span.___comment-time___1sDyW {
    display: initial;
}

span.___comment-author-name___2RYbs {
  display: initial;
  width: 12em;
  margin-right: 1em;\
  overflow-x: hidden;
}
`

    var styleParent = document.getElementsByTagName ('head')[0] || document.body || document.documentElement;
    styleParent.appendChild(styleNode);

    // comment adapter
    var user_id_hash = {}
    setInterval( function() {
        var noTexts = document.getElementsByClassName("___comment-number___2Qws3")
        var i, len, tNode, orgHTML, re
        for (i = 0, len = noTexts.length|0 ; i < len; i = i+1|0) {
            tNode = noTexts[i]
            var noText = tNode.innerText
            if ( noText && user_id_hash[noText] && user_id_hash[noText] != tNode.nextSibling.innerText) {
                tNode.nextSibling.innerHTML = '<a target="_blank" href="//nicovideo.jp/user/' +
                    user_id_hash[noText] + '">' + user_id_hash[noText] + '</a>';
            }
        }
        var commentTexts = document.getElementsByClassName("___comment-text___2cPL0")
        for (i = 0, len = commentTexts.length|0 ; i < len; i = i+1|0) {
            tNode = commentTexts[i]
            orgHTML = tNode.innerHTML
            re = /(sm\d+)/
            if ( ! orgHTML.includes("<a ") ) {
                var newText1 = orgHTML.replace( re, '<a target="_blank" href="https://nicovideo.jp/watch/$1">$1</a>')
                tNode.innerHTML = newText1
            }
        }
    }, 700)


    // WebSocket interseptor
    var _before_send = function (data, ws) {
//        console.log("Sending message to " + ws.url + " : " + data);
    }
    var _before_message = function (e, ws) {
        if (typeof e.data === "string") {
        }
    }
    var _after_message = function (e, ws) {
        if (typeof e.data === "string") {
//            console.log("Received message from " + ws.url + " : " + e.data);
            try {
                var js = JSON.parse( e.data)
                if (js.chat && js.chat.no) {
                    user_id_hash["" + js.chat.no] = js.chat.user_id
                }
            }
            catch (er) {
                console.log(er.message)
            }
        }
        else {
//            console.log("Received message from " + ws.url + " : [nostring]");
        }
    }

    var _send = window.WebSocket.prototype.send
    window.WebSocket.prototype.send = function() {
        _before_send(arguments[0], this)
        return _send.apply( this, [].slice.call(arguments))
    }

    var _addEventListener = window.WebSocket.prototype.addEventListener
    window.WebSocket.prototype.addEventListener = function() {
        var eventThis = this
        // if eventName is 'message'
        if (arguments[0] === 'message') {
            arguments[1] = (function (userFunc) {
                return function() {
                    _before_message(arguments[0], eventThis)
                    userFunc.apply(eventThis, [].slice.call(arguments))
                    _after_message(arguments[0], eventThis)
                }
            })(arguments[1])
        }
        return _addEventListener.apply(this, [].slice.call(arguments))
    }
    Object.defineProperty(window.WebSocket.prototype, 'onmessage', {
        'set': function () {
            var eventThis = this
            var userFunc = arguments[0]
            var onMessageHandler = function () {
                _before_message(arguments[0], eventThis)
                userFunc.apply(eventThis, [].slice.call(arguments))
                _after_message(arguments[0], eventThis)
            }
            return _addEventListener.apply(this, ['message', onMessageHandler, false])
        }
    })
})()