Guest User

Untitled

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