daily pastebin goal
39%
SHARE
TWEET

Untitled

a guest Feb 4th, 2016 55 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @id             dota2ruUJ
  3. // @name           dota2ru ignore
  4. // @name:ru        dota2ru игнорирование дебиков в чятике
  5. // @version        0.5
  6. // @namespace      .
  7. // @author         nubideus
  8. // @description    ignore
  9. // @description:ru расширение для дотасру: добавляет игнор в чят. что бы заингнорить, надо зайти в профиль, и рядом с кнопкой "Игнорировать" появляется еще одна "Игнорировать в чати".
  10. // @include        http://dota2.ru/forum/*
  11. // @run-at         document-start
  12. // ==/UserScript==
  13.  
  14.  
  15. document.head.appendChild(document.createElement("script")).innerHTML =
  16. "(" +
  17. (function(){
  18.  
  19. var LOG_MAX_MESSAGES = 5000;
  20. var localLog = [];
  21. var chatElement = null;
  22. var ignoreList = null;
  23. var menu = null;
  24.  
  25. var settings = {
  26.     ignoreEnabled: true,
  27.     newChat: false
  28. };
  29.  
  30. //document.addEventListener("hello", function(event) {
  31.     //console.log(event.detail);
  32. //});
  33.  
  34. var init = function(){
  35.     restoreLog();
  36.     chatElement = document.querySelector("#taigachat_box ol");
  37.  
  38.     ignoreList = restoreIgnoreList();
  39.     initMenu();
  40.  
  41.     if(!settings.newChat){
  42.         var _handleListResponse = window.handleListResponse;
  43.         window.handleListResponse = function(){
  44.             _handleListResponse.apply(window, arguments);
  45.             Array.apply(null, chatElement.childNodes).forEach(item => {
  46.                 reverseScrollOnImageLoaded(item, chatElement.parentNode);
  47.             });
  48.             applyIgnore();
  49.             updateLog(parseMessages(chatElement.innerHTML));
  50.         };
  51.         applyIgnore();
  52.         updateLog(parseMessages(chatElement.innerHTML));
  53.     }else{
  54.         window.refreshShoutbox = window.checkRefresh = function(){
  55.             /* nope */
  56.         };
  57.         chatElement.innerHTML = "";
  58.         window.handleListResponse = function(json){
  59.             handleJSON(json);
  60.             updateLoop();
  61.             window.handleListResponse = function(json){
  62.                 handleJSON(json);
  63.             }
  64.         };
  65.     }
  66.  
  67.    
  68.     var usernameClickListener = function(event){
  69.         if(event.target.className === "username" || event.target.parentNode.className === "username"){
  70.             if(event.target.classList.contains("NoOverlay")){
  71.                 return;
  72.             }
  73.             waitElement(".memberCard[style*=\"display: block\"]", applyMemberCard);
  74.         }
  75.     };
  76.     document.body.addEventListener("click", usernameClickListener, true);
  77.  
  78.  
  79.  
  80.     var scrollNode = chatElement.parentNode;
  81.     var flag = false;
  82.     var scrollListener = function(event){
  83.         var deltaY = event.deltaY || event.detail;
  84.                    
  85.         if(deltaY > 0 && (scrollNode.scrollHeight - scrollNode.scrollTop) + -scrollNode.getBoundingClientRect().height <= 1
  86.             || scrollNode.scrollTop <= 0 && deltaY < 0){
  87.             event.preventDefault();
  88.             event.stopPropagation();
  89.             event.returnValue = false;
  90.             return false;
  91.         }
  92.     };
  93.     document.body.addEventListener("click", function(event){
  94.         var parent = event.target;
  95.         while(parent !== chatElement.parentNode && (parent = parent.parentNode));
  96.  
  97.         if(parent && !flag){
  98.             flag = true;
  99.             scrollNode.addEventListener("mousewheel", scrollListener, false);
  100.             scrollNode.addEventListener("DOMMouseScroll", scrollListener);
  101.         }else{
  102.             flag = false;
  103.             scrollNode.removeEventListener("mousewheel", scrollListener, false);
  104.             scrollNode.removeEventListener("DOMMouseScroll", scrollListener);
  105.         }
  106.     });
  107.  
  108.     //setInterval(update, 5000);
  109. };
  110.  
  111. var initMenu = function(){
  112.     menu = document.createElement("span");
  113.     var enabled = false;
  114.     menu.innerHTML =
  115.     " \
  116.     <div class=\"disabled\" style=\"position: absolute;\"><span style=\"cursor: pointer\">►</span></div> \
  117.     <div class=\"enabled\" style=\"display: none; position: absolute; background: black;\"><span style=\"cursor: pointer\">▼</span> \
  118.         <ul> \
  119.             <li class=\"ignor_item\"> \
  120.                 игнор \
  121.             </li> \
  122.             <li class=\"log_item\"> \
  123.                 лог \
  124.             </li> \
  125.         </ul> \
  126.     </div> \
  127.     ";
  128.    
  129.     var parent = chatElement.parentNode.parentNode.parentNode;
  130.     parent.insertBefore(menu, parent.children[0]);
  131.  
  132.     menu.onclick = function(event){
  133.         enabled = !enabled;
  134.         menu.querySelector(".enabled").style.display = enabled ? "block" : "none";
  135.         menu.querySelector(".disabled").style.display = !enabled ? "block" : "none";
  136.     };
  137.     menu.querySelector(".ignor_item").onclick = function(){
  138.         openIgnorList();
  139.     };
  140.     menu.querySelector(".log_item").onclick = function(){
  141.         openLog();
  142.     };
  143. };
  144.  
  145. var createWindow = function(){
  146.     var modal = document.createElement("div");
  147.     document.body.appendChild(modal);
  148.     modal.style.position = "fixed";
  149.     modal.style.background = "#222";
  150.     modal.style.minWidth = "200px";
  151.     modal.style.maxWidth = "90%";
  152.     modal.style.minHeight = "200px";
  153.     modal.style.maxHeight = "90%";
  154.     modal.style.overflow = "hidden";
  155.     modal.style.top = "0";
  156.     modal.style.left = "0";
  157.     modal.style.zIndex = "999999";
  158.  
  159.     var layer = document.createElement("div");
  160.     document.body.appendChild(layer);
  161.     layer.style.position = "fixed";
  162.     layer.style.top =
  163.     layer.style.bottom =
  164.     layer.style.left =
  165.     layer.style.right = "0";
  166.     layer.style.background = "rgba(0, 0, 0, 0.5)";
  167.     layer.style.zIndex = "99999";
  168.  
  169.     layer.onclick = function(){
  170.         document.body.removeChild(modal);
  171.         document.body.removeChild(layer);
  172.         window.removeEventListener("mousewheel", scrollListener);
  173.         window.addEventListener("DOMMouseScroll", scrollListener);
  174.     };
  175.  
  176.     var scrollListener = function(event){
  177.         var deltaY = event.deltaY || event.detail;
  178.         var parent = event.target;
  179.         while(parent !== modal && (parent = parent.parentNode));
  180.        
  181.         if(!parent
  182.             || deltaY > 0 && (modal.scrollHeight - modal.scrollTop) + -modal.getBoundingClientRect().height <= 1
  183.             || modal.scrollTop <= 0 && deltaY < 0){
  184.             event.preventDefault();
  185.             event.stopPropagation();
  186.             event.returnValue = false;
  187.             return false;
  188.         }
  189.     };
  190.     window.addEventListener("mousewheel", scrollListener, false);
  191.     window.addEventListener("DOMMouseScroll", scrollListener);
  192.  
  193.     modal.close = layer.onclick;
  194.     return modal;
  195. };
  196.  
  197. var openIgnorList = function(){
  198.     var win = createWindow();
  199.  
  200.     var enableSettingBtn = document.createElement("a");
  201.     enableSettingBtn.href = "javascript:/*   глаза закрыты - дебиков не видна   */;";
  202.     enableSettingBtn.innerHTML = settings.ignoreEnabled ? "-_-" : "о_о";
  203.     enableSettingBtn.title = "глаза закрыты - дебиков не видна";
  204.     enableSettingBtn.onclick = function(){
  205.         settings.ignoreEnabled = !settings.ignoreEnabled;
  206.         enableSettingBtn.innerHTML = settings.ignoreEnabled ? "-_-" : "о_о";
  207.         applyIgnore();
  208.     };
  209.     enableSettingBtn.style.fontFamily = "monospace";
  210.  
  211.     win.appendChild(enableSettingBtn);
  212.     win.appendChild(document.createTextNode(" - вкл/выкл"));
  213.  
  214.     var list = document.createElement("ol");
  215.     list.style.marginTop = "20px";
  216.  
  217.     ignoreList.forEach(function(user){
  218.         var nameElement = document.createElement("li");
  219.         nameElement.innerHTML = "<a href=\"" + user.userUrl + "\" class=\"username\">" + user.username + "</a> ";
  220.         var cross = document.createElement("a");
  221.         cross.innerHTML = "X";
  222.         cross.href = "javascript:";
  223.         nameElement.appendChild(cross);
  224.         cross.onclick = function(event){
  225.             toggleIgnore(user);
  226.             applyIgnore();
  227.             saveIgnoreList(ignoreList);
  228.             list.removeChild(nameElement);
  229.             event.stopPropagation();
  230.         };
  231.         list.appendChild(nameElement);
  232.     });
  233.     win.style.overflowY = "scroll";
  234.     win.appendChild(list);
  235. };
  236.  
  237. var reverseScrollOnImageLoaded = function(node, scrollNode){
  238.     var withoutImgBox = null;
  239.  
  240.     Array.apply(null, node.querySelectorAll("img")).forEach(img => {
  241.         if(img.complete){
  242.             return;
  243.         }
  244.         if(!withoutImgBox){
  245.             withoutImgBox = {height: node.getBoundingClientRect().height};
  246.         }
  247.         var correctScrollFn = function(){
  248.             var withImgBox = node.getBoundingClientRect();
  249.             if(withImgBox.height - withoutImgBox.height > 0){
  250.                 scrollNode.scrollTop += withImgBox.height - withoutImgBox.height;
  251.             }
  252.             withoutImgBox.height = withImgBox.height;
  253.         };
  254.  
  255.         wait((() => img.height && img.width), correctScrollFn);
  256.         img.onload = correctScrollFn;
  257.     });
  258. }
  259.  
  260. var openLog = function(){
  261.     var win = createWindow();
  262.  
  263.     var table = document.createElement("table");
  264.  
  265.     var logSplitByDate = localLog.reduce((p, c) => {
  266.         if(p.length === 0){
  267.             p.push([c]);
  268.             return p;
  269.         }
  270.         var current = new Date(p[p.length - 1][0].dateTime);
  271.         var next = new Date(c.dateTime);
  272.         if(current.getDate() === next.getDate() && current.getMonth() === next.getMonth() && current.getYear() === next.getYear()){
  273.             p[p.length - 1].push(c);
  274.         }else{
  275.             p.push([c]);
  276.         }
  277.  
  278.         return p;
  279.     }, []);
  280.     var currentDateIndex = logSplitByDate.length - 1;
  281.  
  282.     var putMessages = function(){
  283.         logSplitByDate[currentDateIndex].forEach(message => {
  284.             var row = table.insertRow();
  285.  
  286.             var dateCell = row.insertCell();
  287.             //dateCell.innerHTML = new Date(message.dateTime).toDateString().slice(4) + " ";
  288.             dateCell.innerHTML = new Date(message.dateTime).toTimeString().slice(0, 8) + " ";
  289.  
  290.             var authorCell = row.insertCell();
  291.             authorCell.innerHTML = "<a href=\"" + message.authorUrl + "\">" + message.authorName + "</a>";
  292.             authorCell.innerHTML += ": ";
  293.  
  294.             var msgCell = row.insertCell();
  295.             msgCell.innerHTML = message.text;
  296.         });
  297.         win.scrollTop = win.scrollHeight - Math.round(win.getBoundingClientRect().height);
  298.  
  299.         Array.apply(null, table.rows).forEach(row => {
  300.             reverseScrollOnImageLoaded(row.cells[2], win);
  301.         });
  302.     };
  303.  
  304.     win.appendChild(table);
  305.     var clear = document.createElement("a");
  306.     clear.innerHTML = "удалить всё";
  307.     clear.href = "javascript:;"
  308.     clear.onclick = function(){
  309.         localLog = [];
  310.         table.innerHTML = "";
  311.         saveLog();
  312.     };
  313.     win.appendChild(clear);
  314.  
  315.     if(logSplitByDate.length > 1){
  316.         var prevDay = document.createElement("a");
  317.         prevDay.href = "javascript:;"
  318.         prevDay.style.position = "absolute";
  319.         prevDay.style.marginLeft = "20px";
  320.  
  321.         var currentDay = document.createElement("span");
  322.         currentDay.style.position = "absolute";
  323.         currentDay.style.marginLeft = "175px";
  324.         currentDay.style.fontWeight = "bold";
  325.         currentDay.style.fontSize = "12pt";
  326.         currentDay.style.marginTop = "-3px";
  327.  
  328.         var nextDay = document.createElement("a");
  329.         nextDay.href = "javascript:;"
  330.         nextDay.style.position = "absolute";
  331.         nextDay.style.marginLeft = "300px";
  332.  
  333.         win.appendChild(prevDay);
  334.         win.appendChild(currentDay);
  335.         win.appendChild(nextDay);
  336.  
  337.         var updateBtns = function(){
  338.             currentDay.innerHTML = (new Date(logSplitByDate[currentDateIndex][0].dateTime)).toDateString().slice(4);
  339.             prevDay.style.display = "none";
  340.             if(currentDateIndex > 0){
  341.                 prevDay.style.display = "";
  342.                 prevDay.innerHTML = "назад(" + (new Date(logSplitByDate[currentDateIndex - 1][0].dateTime)).toDateString().slice(4) + ")";
  343.             }
  344.  
  345.             nextDay.style.display = "none";
  346.             if(currentDateIndex < logSplitByDate.length - 1){
  347.                 nextDay.style.display = "";
  348.                 nextDay.innerHTML = "вперед(" + (new Date(logSplitByDate[currentDateIndex + 1][0].dateTime)).toDateString().slice(4) + ")";
  349.             }
  350.         };
  351.         prevDay.onclick = nextDay.onclick = function(event){
  352.             table.innerHTML = "";
  353.             currentDateIndex += event.target === nextDay ? +1 : -1;
  354.             putMessages();
  355.             updateBtns();
  356.         };
  357.         updateBtns();
  358.     }
  359.  
  360.     win.style.overflowY = "scroll";
  361.  
  362.     var styleEl = document.createElement("style");
  363.     styleEl.innerHTML = "td{border-bottom: 1px solid #333; padding: 0px 5px}\
  364.     /*td:first-child { min-width: 150pt;}*/";
  365.     win.appendChild(styleEl);
  366.  
  367.     putMessages();
  368. };
  369.  
  370. var handleJSON = function(json){
  371.     var messages = parseMessages(json.templateHtml);
  372.  
  373.     var scrollNode = chatElement.parentNode;
  374.     //var fixedScroll = scrollNode.scrollTop + scrollNode.getBoundingClientRect().height - scrollNode.scrollHeight < 1;
  375.     console.log(taigachat_lastRefreshServer)
  376.     if(messages.length){
  377.         mergeLocalLog(messages);
  378.  
  379.         var tempDiv = document.createElement("div");
  380.         tempDiv.innerHTML = json.templateHtml;
  381.         Array.apply(null, tempDiv.childNodes).forEach(msgNode => {
  382.             chatElement.appendChild(msgNode);
  383.         });
  384.  
  385.         if(taigachat_lastRefreshServer){
  386.             for(var i = 0; i < messages.length; i++){
  387.                 chatElement.removeChild(chatElement.childNodes[i]);
  388.             }
  389.         }else{
  390.             //fixedScroll = true;
  391.         }
  392.  
  393.         applyIgnore();
  394.         XenForo.activate(document);//.querySelector("#taigachat_box ol"));
  395.  
  396.         //if(fixedScroll){
  397.             scrollNode.scrollTop = scrollNode.scrollHeight;
  398.         //}
  399.        
  400.         reverseScrollOnImageLoaded(chatElement, scrollNode);
  401.     }
  402.     taigachat_lastRefreshServer = parseInt(json.lastrefresh, 10) || 0;
  403. };
  404.  
  405. var updateLoop = function(){
  406.     var xrh = new XMLHttpRequest();
  407.     xrh.open("POST", "http://dota2.ru/forum/index.php?taigachat/list.json", true);
  408.     xrh.onload = function(){
  409.         //var messagesNum = 50;
  410.         var responseJSON = JSON.parse(xrh.responseText);
  411.  
  412.         handleJSON(responseJSON);
  413.         setTimeout(updateLoop, 5000);
  414.     };
  415.  
  416.     xrh.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  417.     xrh.send(
  418.         "sidebar=0&lastrefresh=" + taigachat_lastRefreshServer +
  419.         "&_xfRequestUri=/forum/chat/" +
  420.         "&_xfNoRedirect=1" +
  421.         "&_xfToken=" + XenForo._csrfToken +
  422.         "&_xfResponseType=json"
  423.     );
  424. };
  425.  
  426. var parseMessages = function(str){
  427.     var div = document.createElement("div");
  428.     div.innerHTML = str;
  429.     var messages = Array.apply(null, div.children).map(function(message){
  430.         var result = {
  431.             id: 0,
  432.             authorName: "",
  433.             authorUrl: "",
  434.             authorStatus: "",
  435.             text: "",
  436.             dateTime: 0,
  437.             deleted: false,
  438.             edited: false
  439.         };
  440.  
  441.         result.dateTime = message.querySelector("abbr.DateTime").getAttribute("data-time") * 1000;
  442.  
  443.         result.id = message.id.slice("taigachat_message_".length - message.id.length);
  444.         var userdom = message.querySelector("a[class=\"username\"]");
  445.         result.authorUrl = userdom.href;
  446.  
  447.         if(userdom.children.length){
  448.             result.authorName = userdom.children[0].textContent;
  449.             result.authorStatus = userdom.children[0].className;
  450.         }else{
  451.             result.authorName = userdom.textContent;
  452.             result.authorStatus = "normal";
  453.         }
  454.        
  455.         result.text = message.querySelector(".taigachat_messagetext").innerHTML;
  456.         return result;
  457.     });
  458.     div.innerHTML = "";
  459.     div = null;
  460.  
  461.     return messages;
  462. };
  463.  
  464. var messageToElement = function(message){
  465.     var element = document.createElement("div");
  466.     element.appendChild(document.createTextNode(message.authorName) + ":");
  467.     element.appendChild(document.createElement("span")).innerHTML = message.text;
  468.     element.messageID = message.id;
  469.     return element;
  470. };
  471.  
  472. var updateLog = function(messages){
  473.     mergeLocalLog(messages);
  474.     saveLog();
  475. };
  476.  
  477. var saveLog = function(){
  478.     if(localLog.length > LOG_MAX_MESSAGES){
  479.         localLog.splice(LOG_MAX_MESSAGES, localLog.length - LOG_MAX_MESSAGES)
  480.     }
  481.     try{
  482.         localStorage.setItem("chat_log", JSON.stringify(localLog));
  483.     }catch(e){
  484.         localLog.splice(0, 100);
  485.         saveLog();
  486.     }
  487.     // var evt = document.createEvent("CustomEvent");
  488.     // evt.initCustomEvent("mergeLogRequest", true, true, messages);
  489.     // document.dispatchEvent(evt);
  490. };
  491.  
  492. var restoreLog = function(){
  493.     var jsonStr = localStorage.getItem("chat_log");
  494.     if(jsonStr){
  495.         localLog = JSON.parse(jsonStr);
  496.     }else{
  497.         localLog = [];
  498.     }
  499. };
  500.  
  501. var mergeLocalLog = function(messages){
  502.     if(!messages.length) return [];
  503.  
  504.     var prev = null;
  505.     localLog = localLog.concat(messages)
  506.     .sort((a, b) => a.id - b.id)
  507.     .filter(el => [!prev || prev.id !== el.id, prev = el][0]);
  508. };
  509.  
  510. var waitElement = function(selector, callback, owner){
  511.     var result = (owner || document).querySelector(selector);
  512.     if(result){
  513.         callback(result);
  514.         return;
  515.     }
  516.     requestAnimationFrame(waitElement.bind(null, selector, callback, owner));
  517. };
  518.    
  519. var wait = function(condition, callback){
  520.     if(condition()){
  521.         callback();
  522.     }else{
  523.         requestAnimationFrame(wait.bind(null, condition, callback));
  524.     }
  525. };
  526.  
  527.  
  528. var toggleIgnore = function(user){
  529.     var userIndex = ignoreList.findIndex(secondUser => secondUser.username === user.username);
  530.     if(userIndex >= 0){
  531.         ignoreList.splice(userIndex, 1);
  532.         return false;
  533.     }else{
  534.         ignoreList.push({username: user.username, userUrl: user.userUrl});
  535.         return true;
  536.     }
  537. };
  538.  
  539. var saveIgnoreList = function(list){
  540.     localStorage.setItem("chat_ignore_list", JSON.stringify(list));
  541. };
  542.  
  543. var restoreIgnoreList = function(){
  544.     var result = localStorage.getItem("chat_ignore_list");
  545.  
  546.     if(!result){
  547.         return [];
  548.     }
  549.     return JSON.parse(result);
  550. };
  551.  
  552. var applyIgnore = function(){
  553.     Array.apply(null, chatElement.children).forEach(function(message){
  554.         if(settings.ignoreEnabled && ignoreList.find(user => user.username === message.querySelector(".username").textContent)){
  555.             message.style.display = "none";
  556.         }else if(message.style.display === "none"){
  557.             message.style.display = null;
  558.         }
  559.     });
  560. };
  561.  
  562.  
  563. function str2b64(str){
  564.     return window.btoa(unescape(encodeURIComponent(str)));
  565. }
  566.  
  567. function b642str(str){
  568.     return decodeURIComponent(escape(window.atob(str)));
  569. }
  570.  
  571. var applyMemberCard = function(card){
  572.     var username = card.querySelector(".username a").textContent;
  573.     var userUrl = document.querySelector(".username a").href;
  574.     var hasIgnored = ignoreList.findIndex(user => user.username === username) >= 0;
  575.  
  576.     var parent = card.querySelector(".userLinks");
  577.  
  578.     var ignoreChatElement = Array.apply(null, parent.children).find(
  579.         link => link.href === "javascript:/*ignrbtn*/"
  580.     );
  581.     if(!ignoreChatElement){
  582.         ignoreChatElement = document.createElement("a");
  583.  
  584.         ignoreChatElement.href = "javascript:/*ignrbtn*/";
  585.         ignoreChatElement.className = "FollowLink";
  586.  
  587.         ignoreChatElement.addEventListener("click", function(event){
  588.             hasIgnored = toggleIgnore({username: username, userUrl: userUrl});
  589.             saveIgnoreList(ignoreList);
  590.             applyIgnore();
  591.             applyMemberCard(card);
  592.             event.stopPropagation();
  593.         }, true);
  594.         parent.appendChild(ignoreChatElement);
  595.     }
  596.     ignoreChatElement.textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
  597. };
  598.  
  599. if(location.pathname.indexOf("/members/") >= 0){
  600.     waitElement(".profilePage .username", function(_){
  601.  
  602.         var username = document.querySelector(".profilePage .username").textContent;
  603.         var userUrl = document.querySelector(".profilePage .username").href;
  604.         ignoreList = restoreIgnoreList();
  605.  
  606.         var hasIgnored = ignoreList.findIndex(user => user.username === username) >= 0;
  607.  
  608.         var ignoreElement = document.querySelector(".profilePage .followBlock ul li:nth-child(2)");
  609.         var ignoreChatElement = document.createElement("li");
  610.         ignoreChatElement.appendChild(document.createElement("a"));
  611.         ignoreChatElement.children[0].textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
  612.         ignoreChatElement.children[0].href = "javascript:";
  613.         ignoreChatElement.children[0].className = "FollowLink";
  614.         ignoreElement.parentNode.insertBefore(ignoreChatElement, ignoreElement);
  615.         ignoreChatElement.addEventListener("click", function(event){
  616.             hasIgnored = toggleIgnore({username: username, userUrl: userUrl});
  617.             saveIgnoreList(ignoreList);
  618.             ignoreChatElement.children[0].textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
  619.             event.stopPropagation();
  620.         }, true);
  621.     });
  622. }else if(location.pathname.indexOf("/forum/chat/") >= 0 || location.href === "http://dota2.ru/forum/"){
  623.     waitElement("#taigachat_box ol", function(){
  624.         wait(() => {return XenForo._csrfToken && handleListResponse}, init);
  625.     });
  626. }
  627.  
  628. }).toString() + ")()";
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top