Advertisement
nubideus

Untitled

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