Advertisement
Guest User

Untitled

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