Advertisement
Guest User

Untitled

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