Advertisement
nubideus

Untitled

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