Advertisement
Guest User

Untitled

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