Advertisement
Guest User

Twitch.tv emotes in Messenger.com! (v3)

a guest
Oct 5th, 2015
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        Messenger.tv
  3. // @namespace   com.kappa.emotes
  4. // @description Twitch.tv emotes in Messenger.com! (v3)
  5. // @include     https://www.messenger.com
  6. // @include     https://www.messenger.com/*
  7. // @version     1
  8. // @grant       GM_xmlhttpRequest
  9. // ==/UserScript==
  10.  
  11. window.addEventListener("load", LocalMain, false);
  12.  
  13. var emotes = {};
  14. var chatSwitchObs, messageGroupObs, newMessageObs;
  15.  
  16. // Download emote list
  17. GM_xmlhttpRequest({
  18.   method: "GET",
  19.   url: "http://twitchemotes.com",
  20.   onload: function(response) {
  21.     var emoteHTML = response.responseText;
  22.  
  23.     // Manipulate twitchemotes.com page to pull emotes and images
  24.     MakeEmoteList(emoteHTML);
  25.   }
  26. });
  27.  
  28. Object.isEmpty = function(obj) {
  29.   var empty = true, key;
  30.   for (key in obj) {
  31.     if (obj.hasOwnProperty(key)) {
  32.       empty = false;
  33.       break;
  34.     }
  35.   }
  36.   return empty;
  37. };
  38.  
  39. function GetEmoteAsTag(emoteName, valign) {
  40.   var id = emotes[emoteName];
  41.   var imgSrc = "https://static-cdn.jtvnw.net/emoticons/v1/" + id + "/1.0";
  42.  
  43.   // If valign specified, add it in
  44.   var valignStyle = "vertical-align:" + (valign !== undefined ? valign.toString() : "middle") + "px;";
  45.  
  46.   var tag = '<img src="' + imgSrc + '" style="' + valignStyle + '" />';
  47.   //console.log(tag);
  48.   return tag;
  49. }
  50.  
  51. function MakeEmoteList(html) {
  52.   var emoteRe = /emote-name.*/g;
  53.   var emoteHTMLArr = html.match(emoteRe);
  54.  
  55.   // Create key-value dict for every emote
  56.   var emoteID, emoteName;
  57.   var reID = /data-image-id="([\d]+)"/;
  58.   var reName = /data-regex="([\w]+)"/;
  59.  
  60.   for (var i = 0; i < emoteHTMLArr.length; i++) {
  61.     // Get emote ID and name
  62.     emoteID = reID.exec(emoteHTMLArr[i])[1];
  63.     emoteName = reName.exec(emoteHTMLArr[i])[1];
  64.  
  65.     // Add emote info to emote dict
  66.     emotes[emoteName] = emoteID;
  67.   }
  68. }
  69.  
  70. function LocalMain() {
  71.   // Identify chat window
  72.   var threadWindow = document.querySelector("div._4_j4");
  73.  
  74.   // Init observer to run event on chat thread switch
  75.   chatSwitchObs = new MutationObserver( ObserveChat );
  76.   chatSwitchObs.observe(threadWindow, { childList: true });
  77.  
  78.   messageGroupObs = new MutationObserver( obsLatestMessageGroup );
  79.   newMessageObs = new MutationObserver( AddEmotesToLatest );
  80.  
  81.   ObserveChat();
  82.  
  83.   // Add Twitch emote browser to message bar
  84.   CreateEmoteBrowser();
  85. }
  86.  
  87. function ToggleEmoteBrowser() {
  88.   var emoteBrowser = document.querySelector("#emote_browser");
  89.  
  90.   if (emoteBrowser.style.opacity == "0") {
  91.     // Show emote browser
  92.     emoteBrowser.style.display = "block";
  93.     emoteBrowser.style.opacity = "1";
  94.     emoteBrowser.style.transform = "translate3D(-50%, -50%, 0)";
  95.     emoteBrowser.style.pointerEvents = "auto";
  96.   } else {
  97.     // Hide emote browser
  98.     emoteBrowser.style.opacity = "0";
  99.     emoteBrowser.style.transform = "translate3D(-50%, -43%, 0)";
  100.     emoteBrowser.style.pointerEvents = "none";
  101.   }
  102. }
  103.  
  104. function CreateEmoteBrowser() {
  105.   // Emote browser header
  106.   var emoteHeader = document.createElement("DIV");
  107.   emoteHeader.style.backgroundColor = "#6441A5";
  108.   emoteHeader.style.color = "#FFF";
  109.   emoteHeader.style.padding = "4px 0px";
  110.   emoteHeader.style.fontSize = "22px";
  111.   emoteHeader.style.textAlign = "center";
  112.   emoteHeader.innerHTML = "Click an emote to copy it to your clipboard!";
  113.  
  114.   // Emote browser emote area
  115.   var emoteArea = document.createElement("DIV");
  116.   emoteArea.style.padding = "4px";
  117.   // Populate emote area
  118.   for (var key in emotes) {
  119.     if (emotes.hasOwnProperty(key)) {
  120.       // Create clickable emote div
  121.       var emoteImg = document.createElement("DIV");
  122.       emoteImg.setAttribute("title", key);
  123.       // Add onclick event
  124.       emoteImg.setAttribute("data-name", key);
  125.       emoteImg.onclick = function(){
  126.         CopyTextToClipboard(this.getAttribute("data-name") + " ");
  127.         ToggleEmoteBrowser();
  128.       };
  129.       // Style it
  130.       emoteImg.style.cursor = "pointer";
  131.       emoteImg.style.padding = "4px";
  132.       emoteImg.style.display = "inline-block";
  133.       // Add the image
  134.       emoteImg.innerHTML += GetEmoteAsTag(key, -1);
  135.  
  136.       // Append it to the emote area
  137.       emoteArea.appendChild(emoteImg);
  138.     }
  139.   }
  140.  
  141.   // Create the emote browser div
  142.   var emoteBrowser = document.createElement("DIV");
  143.   emoteBrowser.id = "emote_browser";
  144.   emoteBrowser.style.width = "40%";
  145.   //emoteBrowser.style.height = "50%";
  146.   emoteBrowser.style.top = "50%";
  147.   emoteBrowser.style.left = "50%";
  148.   emoteBrowser.style.backgroundColor = "#fff";
  149.   emoteBrowser.style.position = "fixed";
  150.   emoteBrowser.style.borderRadius = "10px";
  151.   emoteBrowser.style.boxShadow = "0px 0px 10px #888888";
  152.   emoteBrowser.style.transform = "translate3D(-50%, -43%, 0)";
  153.   emoteBrowser.style.overflow = "hidden";
  154.   emoteBrowser.style.display = "block";
  155.   emoteBrowser.style.opacity = "0";
  156.   emoteBrowser.style.pointerEvents = "none";
  157.   emoteBrowser.style.transition = "opacity 0.25s, transform 0.25s";
  158.  
  159.   emoteBrowser.appendChild(emoteHeader);
  160.   emoteBrowser.appendChild(emoteArea);
  161.   document.body.appendChild(emoteBrowser);
  162.  
  163.   // Create a button to open the emote browser
  164.   var iconArea = document.querySelector("ul._4rv4");
  165.  
  166.   // Create button to open browser
  167.   var openBrowser = document.createElement("LI");
  168.   openBrowser.setAttribute("title", "Twitch emote browser");
  169.   // Add image
  170.   openBrowser.innerHTML = GetEmoteAsTag("Kappa", 2);
  171.   // Add onclick event
  172.   openBrowser.addEventListener("click", ToggleEmoteBrowser);
  173.   // Style it
  174.   openBrowser.style.cursor = "pointer";
  175.   openBrowser.style.paddingRight = "9px";
  176.  
  177.   // Add to button area
  178.   iconArea.appendChild(openBrowser);
  179. }
  180.  
  181. function ObserveChat() {
  182.   // Observe current chat window
  183.   var chatWindow = document.querySelector("#js_1");
  184.   if (chatWindow !== null) {
  185.     // Initial message group tracking
  186.     obsLatestMessageGroup();
  187.  
  188.     // Track future changes
  189.     messageGroupObs.observe(chatWindow, { childList: true });
  190.   }
  191. }
  192.  
  193. function obsLatestMessageGroup() {
  194.   var msgGroups = document.querySelectorAll("#js_1 > div._1t_p > div._1t_s");
  195.   var latestGroup = msgGroups[msgGroups.length - 1];
  196.  
  197.   // Initial message update
  198.   AddEmotesToAll();
  199.  
  200.   // Track future changes
  201.   newMessageObs.observe(latestGroup, { childList: true });
  202. }
  203.  
  204. function AddEmotes(message) {
  205.   // Split message into words
  206.   var words = message.replace(/\n/g, " ").split(" ");
  207.   var arrLen = words.length;
  208.  
  209.   if (arrLen > 0 && !Object.isEmpty(emotes)) {
  210.     var key, emoteImg;
  211.     // Check each word in message for emote phrase
  212.     for (var i = 0; i < arrLen; i++) {
  213.       key = words[i];
  214.       if (emotes[key] !== undefined) {
  215.         // Replace text with emote
  216.         emoteImg = GetEmoteAsTag(key, -7);
  217.         message = message.replace(key, emoteImg);
  218.       }
  219.     }
  220.   }
  221.   // Return message with emote images added
  222.   return message;
  223. }
  224.  
  225. function AddEmotesToLatest() {
  226.   var messages = document.querySelectorAll("div > span._3oh-");
  227.   var latest = messages[messages.length - 1];
  228.   latest.innerHTML = AddEmotes(latest.innerHTML);
  229. }
  230.  
  231. function AddEmotesToAll() {
  232.   var messages = document.querySelectorAll("div > span._3oh-");
  233.  
  234.   for (var i = 0; i < messages.length; i++) {
  235.     messages[i].innerHTML = AddEmotes(messages[i].innerHTML);
  236.   }
  237. }
  238.  
  239. // EMOTE TEXT COPYING
  240. function CopyTextToClipboard(text) {
  241.   var textArea = document.createElement("textarea");
  242.  
  243.   // Place off-screen
  244.   textArea.style.position = 'fixed';
  245.   textArea.style.top = -100;
  246.   textArea.style.left = -100;
  247.  
  248.   // Add textarea to document and fill with text to copy
  249.   textArea.value = text;
  250.   document.body.appendChild(textArea);
  251.   textArea.select();
  252.  
  253.   try {
  254.     document.execCommand('copy');
  255.   } catch (err) {
  256.     alert("The emote couldn't be copied.");
  257.   }
  258.  
  259.   // Delete textarea
  260.   document.body.removeChild(textArea);
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement