Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @id dota2ruUJ
- // @name dota2ru ignore
- // @name:ru dota2ru игнорирование дебиков в чятике
- // @version 0.3
- // @namespace .
- // @author nubideus
- // @description ignore
- // @description:ru расширение для дотасру: добавляет игнор в чят. что бы заингнорить, надо зайти в профиль, и рядом с кнопкой "Игнорировать" появляется еще одна "Игнорировать в чати".
- // @include http://dota2.ru/forum/*
- // @run-at document-start
- // ==/UserScript==
- (function(){
- var localLog = [];
- var taigachat_lastRefreshServer = 0;
- var chatElement = null;
- var ignoreList = null;
- var menu = null;
- //document.addEventListener("hello", function(event) {
- //console.log(event.detail);
- //});
- var init = function(){
- chatElement = document.querySelector("#taigachat_box ol");
- ignoreList = restoreIgnoreList();
- initMenu()
- var _handleListResponse = window.handleListResponse;
- window.handleListResponse = function(){
- _handleListResponse.apply(window, arguments);
- applyIgnore();
- };
- applyIgnore();
- //checkRefresh = function(){ /* disable taigachat update */ };
- var usernameClickListener = function(event){
- if(event.target.className === "username" || event.target.parentNode.className === "username"){
- if(event.target.classList.contains("NoOverlay")){
- return;
- }
- waitElement(".memberCard[style*=\"display: block\"]", applyMemberCard);
- }
- };
- document.body.addEventListener("click", usernameClickListener, true);
- //setInterval(update, 5000);
- };
- var initMenu = function(){
- menu = document.createElement("span");
- var enabled = false;
- menu.innerHTML =
- " \
- <div class=\"disabled\" style=\"position: absolute;\"><span style=\"cursor: pointer\">►</span></div> \
- <div class=\"enabled\" style=\"display: none; position: absolute; background: black;\"><span style=\"cursor: pointer\">▼</span> \
- <ul> \
- <li class=\"ignor_item\"> \
- игнор \
- </li> \
- </ul> \
- </div> \
- ";
- /*
- <li class=\"log_item\"> \
- лог \
- </li> \
- <li class=\"settings_item\"> \
- настройки \
- </li> \
- <li class=\"disable_item\"> \
- отключить/включить \
- </li> \
- */
- var parent = chatElement.parentNode.parentNode.parentNode;
- parent.insertBefore(menu, parent.children[0]);
- menu.onclick = function(event){
- enabled = !enabled;
- menu.querySelector(".enabled").style.display = enabled ? "block" : "none";
- menu.querySelector(".disabled").style.display = enabled ? "none" : "block";
- };
- menu.querySelector(".ignor_item").onclick = function(){
- openIgnorList();
- };
- };
- var createWindow = function(){
- var modal = document.createElement("div");
- document.body.appendChild(modal);
- modal.style.position = "fixed";
- modal.style.background = "#222";
- modal.style.width = "200px";
- modal.style.height = "200px";
- modal.style.top = "0";
- modal.style.left = "0";
- modal.style.zIndex = "999999";
- var layer = document.createElement("div");
- document.body.appendChild(layer);
- layer.style.position = "fixed";
- layer.style.top =
- layer.style.bottom =
- layer.style.left =
- layer.style.right = "0";
- layer.style.background = "rgba(0, 0, 0, 0.5)";
- layer.style.zIndex = "99999";
- layer.onclick = function(){
- document.body.removeChild(modal);
- document.body.removeChild(layer);
- };
- return modal;
- };
- var openIgnorList = function(){
- var win = createWindow();
- var list = document.createElement("ol");
- ignoreList.forEach(function(user){
- var nameElement = document.createElement("li");
- nameElement.innerHTML = "<a href=\"" + user.userUrl + "\" class=\"username\">" + user.username + "</a> ";
- var cross = document.createElement("a");
- cross.innerHTML = "X";
- cross.href = "javascript:";
- nameElement.appendChild(cross);
- cross.onclick = function(event){
- toggleIgnore(user);
- applyIgnore();
- saveIgnoreList(ignoreList);
- list.removeChild(nameElement);
- event.stopPropagation();
- };
- list.appendChild(nameElement);
- });
- win.appendChild(list);
- };
- var update = function(){
- var xrh = new XMLHttpRequest();
- xrh.open("POST", "http://dota2.ru/forum/index.php?taigachat/list.json", true);
- xrh.onload = function(){
- var responseJSON = JSON.parse(xrh.responseText);
- var messages = parseMessages(responseJSON.templateHtml);
- //if(messages.length){
- saveLog(messages);
- mergeLocalLog(messages);
- //console.log(localLog.map(function(m){return m.text + " " + m.deleted}).join("\n"));
- chatElement.innerHTML = responseJSON.templateHtml;
- applyIgnore();
- XenForo.activate(document.querySelector("#taigachat_box ol"));
- //}
- };
- xrh.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
- xrh.send(
- "sidebar=0&lastrefresh=" + taigachat_lastRefreshServer +
- "&_xfRequestUri=/forum/chat/" +
- "&_xfNoRedirect=1" +
- "&_xfToken=" + XenForo._csrfToken +
- "&_xfResponseType=json"
- );
- };
- var parseMessages = function(str){
- var div = document.createElement("div");
- div.innerHTML = str;
- var messages = Array.apply(null, div.children).map(function(message){
- var result = {
- id: 0,
- authorName: "",
- authorUrl: "",
- authorStatus: "",
- text: "",
- dateTime: 0,
- deleted: false,
- edited: false
- };
- result.dateTime = message.querySelector("abbr.DateTime").getAttribute("data-time") * 1000;
- result.id = message.id.slice("taigachat_message_".length - message.id.length);
- var userdom = message.querySelector("a[class=\"username\"]");
- result.authorUrl = userdom.href;
- if(userdom.children.length){
- result.authorName = userdom.children[0].textContent;
- result.authorStatus = userdom.children[0].className;
- }else{
- result.authorName = userdom.textContent;
- result.authorStatus = "normal";
- }
- result.text = message.querySelector(".taigachat_messagetext").innerHTML;
- return result;
- });
- div.innerHTML = "";
- div = null;
- return messages;
- };
- var saveLog = function(messages){
- var evt = document.createEvent("CustomEvent");
- evt.initCustomEvent("mergeLogRequest", true, true, messages);
- document.dispatchEvent(evt);
- };
- var mergeLocalLog = function(messages){
- var newMessages = null;
- var collisionMessageIndex = localLog.findIndex(function(message){
- if(!message.edited){
- return message.id === messages[0].id;
- }
- return false;
- });
- if(collisionMessageIndex >= 0){
- var logIndex = collisionMessageIndex;
- var messagesIndex = 0;
- while(true){
- if(logIndex >= localLog.length || messagesIndex >= messages.length){
- break;
- }
- if(localLog[logIndex].edited){
- logIndex++;
- continue;
- }
- if(localLog[logIndex].id === messages[messagesIndex].id){
- if(localLog[logIndex].text !== messages[messagesIndex].text){
- localLog[logIndex].edited = true;
- localLog.splice(logIndex, 0, messages[messagesIndex]);
- logIndex++;
- }
- logIndex++;
- messagesIndex++;
- continue;
- }else{
- localLog[logIndex].deleted = true;
- logIndex++;
- continue;
- }
- }
- for(;logIndex < localLog.length; logIndex++){
- localLog[logIndex].deleted = true;
- }
- for(;messagesIndex < messages.length; messagesIndex++){
- localLog.push(messages[messagesIndex]);
- }
- }else{
- localLog = localLog.concat(messages);
- }
- };
- var waitElement = function(selector, callback, owner){
- var result = (owner || document).querySelector(selector);
- if(result){
- callback(result);
- return;
- }
- requestAnimationFrame(waitElement.bind(null, selector, callback, owner));
- };
- var wait = function(condition, callback){
- if(condition()){
- callback();
- }else{
- requestAnimationFrame(wait.bind(null, condition, callback));
- }
- };
- var toggleIgnore = function(user){
- var userIndex = ignoreList.findIndex(secondUser => secondUser.username === user.username);
- if(userIndex >= 0){
- ignoreList.splice(userIndex, 1);
- return false;
- }else{
- ignoreList.push({username: user.username, userUrl: user.userUrl});
- return true;
- }
- };
- var saveIgnoreList = function(list){
- localStorage.setItem("chat_ignore_list", ignoreList.map(
- user => str2b64(user.username) + "|" + str2b64(user.userUrl)).join(",")
- );
- };
- var restoreIgnoreList = function(){
- var result = localStorage.getItem("chat_ignore_list");
- if(!result){
- return [];
- };
- result = result.split(",").map(data =>
- ({
- username: b642str(data.split("|")[0]),
- userUrl: b642str(data.split("|")[1])
- })
- );
- return result;
- };
- var applyIgnore = function(){
- Array.apply(null, chatElement.children).forEach(function(message){
- if(ignoreList.find(user => user.username === message.querySelector(".username").textContent)){
- message.style.display = "none";
- }else if(message.style.display === "none"){
- message.style.display = null;
- }
- });
- };
- function str2b64(str){
- return window.btoa(unescape(encodeURIComponent(str)));
- }
- function b642str(str){
- return decodeURIComponent(escape(window.atob(str)));
- }
- var applyMemberCard = function(card){
- var username = card.querySelector(".username a").textContent;
- var userUrl = document.querySelector(".username a").href;
- var hasIgnored = ignoreList.findIndex(user => user.username === username) >= 0;
- var parent = card.querySelector(".userLinks");
- var ignoreChatElement = Array.apply(null, parent.children).find(
- link => link.href === "javascript:/*ignrbtn*/"
- );
- if(!ignoreChatElement){
- ignoreChatElement = document.createElement("a");
- ignoreChatElement.href = "javascript:/*ignrbtn*/";
- ignoreChatElement.className = "FollowLink";
- ignoreChatElement.addEventListener("click", function(event){
- hasIgnored = toggleIgnore({username: username, userUrl: userUrl});
- saveIgnoreList(ignoreList);
- applyIgnore();
- applyMemberCard(card);
- event.stopPropagation();
- }, true);
- parent.appendChild(ignoreChatElement);
- }
- ignoreChatElement.textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
- };
- if(location.pathname.indexOf("/members/") >= 0){
- waitElement(".profilePage .username", function(_){
- var username = document.querySelector(".profilePage .username").textContent;
- var userUrl = document.querySelector(".profilePage .username").href;
- ignoreList = restoreIgnoreList();
- var hasIgnored = ignoreList.findIndex(user => user.username === username) >= 0;
- var ignoreElement = document.querySelector(".profilePage .followBlock ul li:nth-child(2)");
- var ignoreChatElement = document.createElement("li");
- ignoreChatElement.appendChild(document.createElement("a"));
- ignoreChatElement.children[0].textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
- ignoreChatElement.children[0].href = "javascript:";
- ignoreChatElement.children[0].className = "FollowLink";
- ignoreElement.parentNode.insertBefore(ignoreChatElement, ignoreElement);
- ignoreChatElement.addEventListener("click", function(event){
- hasIgnored = toggleIgnore({username: username, userUrl: userUrl});
- saveIgnoreList(ignoreList);
- ignoreChatElement.children[0].textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
- event.stopPropagation();
- }, true);
- });
- }else if(location.pathname.indexOf("/forum/chat/") >= 0 || location.href === "http://dota2.ru/forum/"){
- waitElement("#taigachat_box ol", function(){
- wait(() => {return XenForo._csrfToken && handleListResponse}, init);
- });
- }
- })();
Add Comment
Please, Sign In to add comment