您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
"Free Twitch.tv subscriber emotes"
当前为
// ==UserScript== // @name "lolbeta1" // @namespace "spacename" // @description "Free Twitch.tv subscriber emotes" // @include https://www.twitch.tv/* // @include https://twitch.tv/* // @exclde // @version 1 // @noframes // @grant none // ==/UserScript== var emotes = new Map(); var emotesLoaded = false; var lastDataId = 0; var lastDataSender; var htmlEmoteTag0 = "<img class=\"emoticon ttv-emo-"; var htmlEmoteTag1 = "\" src=\""; var htmlEmoteTag2 = "\" srcset=\""; var htmlEmoteTag3 = " 2x\" data-id=\""; var htmlEmoteTag4 = "\" alt=\""; var htmlEmoteTag5 = "\" original-title=\"\">"; window.onload = function() { window.setInterval(run, 500); console.log("Starting script\n"); } function Emote(url, id) { this.url = url; this.id = id; } function run() { if(!emotesLoaded && document.getElementsByClassName("js-emoticon-toggle emoticon-selector-toggle")) { document.getElementsByClassName("js-emoticon-toggle emoticon-selector-toggle")[0]. addEventListener('click', GetEmotes); } else if(!document.getElementsByClassName("js-emoticon-toggle emoticon-selector-toggle")) { return; } if(emotesLoaded) { var messages = document.querySelectorAll("span.message"); var chatLines = document.getElementsByClassName("chat-line"); if(messages === undefined) { console.error("messages elements were not found"); return; } var processMessages = lastDataSender === undefined ? true : false; for(var count=0; count < messages.length; count++) { if(messages[count] === undefined) { console.error("message is undefined. [count: " + count + "] [messages.length: " + messages.length + "]"); return; } if(processMessages) { //ignore deleted and system messages if(messages[count].getElementsByClassName("deleted")[0] || chatLines[count].getAttribute("data-sender") == "jtv") { continue; } lastDataId = chatLines[count].getAttribute("data-id"); lastDataSender = chatLines[count].getAttribute("data-sender"); console.log("lastDataId:"+lastDataId+" lastDataSender:"+lastDataSender); var newInnerHTML = ""; for(var childCount=0; childCount < messages[count].childNodes.length; childCount++) { var node = messages[count].childNodes[childCount]; if(node.nodeName === "#text") { var substr = ""; for(var charCount=0; charCount < node.data.length; charCount++) { if(node.data.charAt(charCount) !== ' ') { substr += node.data.charAt(charCount); } if(node.data.charAt(charCount) === ' ' || node.data.length-1===charCount) { var emote = emotes.get(substr); var space = node.data.charAt(charCount) === ' ' ? " " : ""; if(emote !== undefined) { newInnerHTML += htmlEmoteTag0+emote.id+htmlEmoteTag1+emote.url+ "1.0"+htmlEmoteTag2+emote.url+"2.0"+htmlEmoteTag3+emote.id+ htmlEmoteTag4+substr+htmlEmoteTag5+space; } else { newInnerHTML += substr+space; } substr = ""; } } } else { newInnerHTML += node.outerHTML; } } messages[count].innerHTML = newInnerHTML; } else if(chatLines[count].getAttribute("data-id") == lastDataId && chatLines[count].getAttribute("data-sender") == lastDataSender) { processMessages = true; } } } } function GetEmotes() { if(emotesLoaded) { return; } if(!document.getElementsByClassName("emoticon-grid") || document.getElementsByClassName("emoticon-grid").length === 0) { console.error("emoticon-grid was not found"); window.setTimeout(GetEmotes, 500); return; } console.log("Loading Emotes"); var div = document.getElementsByClassName("emoticon-grid")[0]; var emoticonGroup = div.getElementsByClassName("emoticon tooltip locked"); for(var count=0; count < emoticonGroup.length; count++) { var emoteName = emoticonGroup[count].getAttribute("original-title"); var css = emoticonGroup[count].style.cssText; var emoteUrl = emoticonGroup[count].style.cssText.substring( css.lastIndexOf("(")+1, css.lastIndexOf(")")-4).replace(/"/g, ""); var startingIndex = emoteUrl.indexOf("v1/")+3; var emoteId = emoteUrl.substring(startingIndex, emoteUrl.indexOf("/", startingIndex)); emotes.set(emoteName, new Emote(emoteUrl, emoteId)); var emote = emotes.get(emoteName); console.log(emoteName +" [id: "+emote.id+"] [url: "+ emote.url +"]"); } emotesLoaded = true; }