Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.64 KB | None | 0 0
  1. // ==UserScript==
  2. // @id dota2ruUJ
  3. // @name dota2ru ignore
  4. // @name:ru dota2ru игнорирование дебиков в чятике
  5. // @version 0.2
  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. (function(){
  15.  
  16. var localLog = [];
  17. var taigachat_lastRefreshServer = 0;
  18. var chatElement = null;
  19. var ignoreList = null;
  20.  
  21. //document.addEventListener("hello", function(event) {
  22. //console.log(event.detail);
  23. //});
  24.  
  25. var init = function(){
  26. chatElement = document.querySelector("#taigachat_box ol");
  27.  
  28. ignoreList = restoreIgnoreList();
  29. initIgnoreListView();
  30.  
  31. var _handleListResponse = window.handleListResponse;
  32. window.handleListResponse = function(){
  33. _handleListResponse.apply(window, arguments);
  34. applyIgnore();
  35. };
  36. applyIgnore();
  37.  
  38. //checkRefresh = function(){ /* disable taigachat update */ };
  39. var usernameClickListener = function(event){
  40. if(event.target.className === "username" || event.target.parentNode.className === "username"){
  41. if(event.target.classList.contains("NoOverlay")){
  42. return;
  43. }
  44. waitElement(".memberCard[style*=\"display: block\"]", applyMemberCard);
  45. }
  46. };
  47. document.body.addEventListener("click", usernameClickListener, true);
  48.  
  49. //setInterval(update, 5000);
  50. };
  51.  
  52. var update = function(){
  53. var xrh = new XMLHttpRequest();
  54. xrh.open("POST", "http://dota2.ru/forum/index.php?taigachat/list.json", true);
  55. xrh.onload = function(){
  56. var responseJSON = JSON.parse(xrh.responseText);
  57.  
  58. var messages = parseMessages(responseJSON.templateHtml);
  59. //if(messages.length){
  60. saveLog(messages);
  61. mergeLocalLog(messages);
  62. //console.log(localLog.map(function(m){return m.text + " " + m.deleted}).join("\n"));
  63.  
  64. chatElement.innerHTML = responseJSON.templateHtml;
  65. applyIgnore();
  66. XenForo.activate(document.querySelector("#taigachat_box ol"));
  67. //}
  68. };
  69.  
  70. xrh.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  71. xrh.send(
  72. "sidebar=0&lastrefresh=" + taigachat_lastRefreshServer +
  73. "&_xfRequestUri=/forum/chat/" +
  74. "&_xfNoRedirect=1" +
  75. "&_xfToken=" + XenForo._csrfToken +
  76. "&_xfResponseType=json"
  77. );
  78. };
  79.  
  80. var parseMessages = function(str){
  81. var div = document.createElement("div");
  82. div.innerHTML = str;
  83. var messages = Array.apply(null, div.children).map(function(message){
  84. var result = {
  85. id: 0,
  86. authorName: "",
  87. authorUrl: "",
  88. authorStatus: "",
  89. text: "",
  90. dateTime: 0,
  91. deleted: false,
  92. edited: false
  93. };
  94.  
  95. result.dateTime = message.querySelector("abbr.DateTime").getAttribute("data-time") * 1000;
  96.  
  97. result.id = message.id.slice("taigachat_message_".length - message.id.length);
  98. var userdom = message.querySelector("a[class=\"username\"]");
  99. result.authorUrl = userdom.href;
  100.  
  101. if(userdom.children.length){
  102. result.authorName = userdom.children[0].textContent;
  103. result.authorStatus = userdom.children[0].className;
  104. }else{
  105. result.authorName = userdom.textContent;
  106. result.authorStatus = "normal";
  107. }
  108.  
  109. result.text = message.querySelector(".taigachat_messagetext").innerHTML;
  110. return result;
  111. });
  112. div.innerHTML = "";
  113. div = null;
  114.  
  115. return messages;
  116. };
  117.  
  118. var saveLog = function(messages){
  119. var evt = document.createEvent("CustomEvent");
  120. evt.initCustomEvent("mergeLogRequest", true, true, messages);
  121. document.dispatchEvent(evt);
  122. };
  123.  
  124. var mergeLocalLog = function(messages){
  125. var newMessages = null;
  126. var collisionMessageIndex = localLog.findIndex(function(message){
  127. if(!message.edited){
  128. return message.id === messages[0].id;
  129. }
  130. return false;
  131. });
  132.  
  133. if(collisionMessageIndex >= 0){
  134. var logIndex = collisionMessageIndex;
  135. var messagesIndex = 0;
  136. while(true){
  137. if(logIndex >= localLog.length || messagesIndex >= messages.length){
  138. break;
  139. }
  140. if(localLog[logIndex].edited){
  141. logIndex++;
  142. continue;
  143. }
  144. if(localLog[logIndex].id === messages[messagesIndex].id){
  145. if(localLog[logIndex].text !== messages[messagesIndex].text){
  146. localLog[logIndex].edited = true;
  147. localLog.splice(logIndex, 0, messages[messagesIndex]);
  148. logIndex++;
  149. }
  150. logIndex++;
  151. messagesIndex++;
  152. continue;
  153. }else{
  154. localLog[logIndex].deleted = true;
  155. logIndex++;
  156. continue;
  157. }
  158. }
  159. for(;logIndex < localLog.length; logIndex++){
  160. localLog[logIndex].deleted = true;
  161. }
  162. for(;messagesIndex < messages.length; messagesIndex++){
  163. localLog.push(messages[messagesIndex]);
  164. }
  165. }else{
  166. localLog = localLog.concat(messages);
  167. }
  168. };
  169.  
  170. var waitElement = function(selector, callback, owner){
  171. var result = (owner || document).querySelector(selector);
  172. if(result){
  173. callback(result);
  174. return;
  175. }
  176. requestAnimationFrame(waitElement.bind(null, selector, callback, owner));
  177. };
  178.  
  179.  
  180. var toggleIgnore = function(user){
  181. var userIndex = ignoreList.findIndex(secondUser => secondUser.username === user.username);
  182. if(userIndex >= 0){
  183. ignoreList.splice(userIndex, 1);
  184. return false;
  185. }else{
  186. ignoreList.push({username: user.username, userUrl: user.userUrl});
  187. return true;
  188. }
  189. };
  190.  
  191. var saveIgnoreList = function(list){
  192. localStorage.setItem("chat_ignore_list", ignoreList.map(
  193. user => str2b64(user.username) + "|" + str2b64(user.userUrl)).join(",")
  194. );
  195. };
  196.  
  197. var restoreIgnoreList = function(){
  198. var result = localStorage.getItem("chat_ignore_list");
  199. if(!result){
  200. return [];
  201. };
  202. result = result.split(",").map(data =>
  203. ({
  204. username: b642str(data.split("|")[0]),
  205. userUrl: b642str(data.split("|")[1])
  206. })
  207. );
  208. return result;
  209. };
  210.  
  211. var applyIgnore = function(){
  212. Array.apply(null, chatElement.children).forEach(function(message){
  213. if(ignoreList.find(user => user.username === message.querySelector(".username").textContent)){
  214. message.style.display = "none";
  215. }else if(message.style.display === "none"){
  216. message.style.display = null;
  217. }
  218. });
  219. };
  220.  
  221. var initIgnoreListView = function(){
  222. var parent = document.querySelector("#taigachat_box").parentNode;
  223. var btn = document.createElement("a");
  224. btn.href = "javascript:";
  225. btn.innerHTML = "Список игнорируемых";
  226.  
  227. document.addEventListener("click", function(event){
  228. if(
  229. event.target === list ||
  230. event.target.parentNode === list ||
  231. event.target.parentNode.parentNode === list
  232. ){
  233. return;
  234. }
  235. if(event.target !== btn || !list.style.display){
  236. list.style.display = "none";
  237. for (var i = list.children.length - 1; i >= 0; i--){
  238. list.removeChild(list.children[i]);
  239. };
  240. return;
  241. }
  242. list.style.display = null;
  243. if(ignoreList.length === 0){
  244. var empty = document.createElement("li");
  245. empty.innerHTML = "пусто";
  246. list.appendChild(empty);
  247. }
  248. ignoreList.forEach(function(user){
  249. var nameElement = document.createElement("li");
  250. nameElement.innerHTML = "<a href=\"" + user.userUrl + "\" class=\"username\">" + user.username + "</a> ";
  251. var cross = document.createElement("a");
  252. cross.innerHTML = "X";
  253. cross.href = "javascript:";
  254. nameElement.appendChild(cross);
  255. cross.onclick = function(event){
  256. toggleIgnore(user);
  257. applyIgnore();
  258. saveIgnoreList(ignoreList);
  259. list.removeChild(nameElement);
  260. event.stopPropagation();
  261. };
  262. list.appendChild(nameElement);
  263. });
  264. });
  265.  
  266. var list = document.createElement("ol");
  267. list.style.display = "none";
  268. if(parent.children.length){
  269. parent.insertBefore(list, parent.querySelector("#taigachat_box"));
  270. }else{
  271. parent.appendChild(list);
  272. }
  273. list.parentNode.insertBefore(btn, list);
  274. };
  275.  
  276.  
  277. function str2b64(str){
  278. return window.btoa(unescape(encodeURIComponent(str)));
  279. }
  280.  
  281. function b642str(str){
  282. return decodeURIComponent(escape(window.atob(str)));
  283. }
  284.  
  285.  
  286. var applyMemberCard = function(card){
  287. var username = card.querySelector(".username a").textContent;
  288. var userUrl = document.querySelector(".username a").href;
  289. var hasIgnored = ignoreList.findIndex(user => user.username === username) >= 0;
  290.  
  291. var parent = card.querySelector(".userLinks");
  292.  
  293. var ignoreChatElement = Array.apply(null, parent.children).find(
  294. link => link.href === "javascript:/*ignrbtn*/"
  295. );
  296. if(!ignoreChatElement){
  297. ignoreChatElement = document.createElement("a");
  298.  
  299. ignoreChatElement.href = "javascript:/*ignrbtn*/";
  300. ignoreChatElement.className = "FollowLink";
  301.  
  302. ignoreChatElement.addEventListener("click", function(event){
  303. hasIgnored = toggleIgnore({username: username, userUrl: userUrl});
  304. saveIgnoreList(ignoreList);
  305. applyIgnore();
  306. applyMemberCard(card);
  307. event.stopPropagation();
  308. }, true);
  309. parent.appendChild(ignoreChatElement);
  310. }
  311. ignoreChatElement.textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
  312. };
  313.  
  314. if(location.pathname.indexOf("/members/") >= 0){
  315. waitElement(".profilePage .username", function(_){
  316.  
  317. var username = document.querySelector(".profilePage .username").textContent;
  318. var userUrl = document.querySelector(".profilePage .username").href;
  319. ignoreList = restoreIgnoreList();
  320.  
  321. var hasIgnored = ignoreList.findIndex(user => user.username === username) >= 0;
  322.  
  323. var ignoreElement = document.querySelector(".profilePage .followBlock ul li:nth-child(2)");
  324. var ignoreChatElement = document.createElement("li");
  325. ignoreChatElement.appendChild(document.createElement("a"));
  326. ignoreChatElement.children[0].textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
  327. ignoreChatElement.children[0].href = "javascript:";
  328. ignoreChatElement.children[0].className = "FollowLink";
  329. ignoreElement.parentNode.insertBefore(ignoreChatElement, ignoreElement);
  330. ignoreChatElement.addEventListener("click", function(event){
  331. hasIgnored = toggleIgnore({username: username, userUrl: userUrl});
  332. saveIgnoreList(ignoreList);
  333. ignoreChatElement.children[0].textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
  334. event.stopPropagation();
  335. }, true);
  336. });
  337. }else if(location.pathname.indexOf("/forum/chat/") >= 0 || location.href === "http://dota2.ru/forum/"){
  338. waitElement("#taigachat_box ol", function(){
  339. var waitToket = setInterval(function(){
  340. if(XenForo._csrfToken && handleListResponse){
  341. clearInterval(waitToket);
  342. init();
  343. }
  344. }, 100);
  345. });
  346. }
  347.  
  348. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement