Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @id dota2ruUJ
- // @name dota2ru ignore
- // @name:ru dota2ru игнорирование дебиков в чятике
- // @version 1.0
- // @namespace .
- // @author nubideus
- // @description ignore
- // @description:ru расширение для дотасру: добавляет игнор в чят. что бы заингнорить, надо зайти в профиль, и рядом с кнопкой "Игнорировать" появляется еще одна "Игнорировать в чати".
- // @include http://dota2.ru/forum/*
- // @run-at document-start
- // ==/UserScript==
- document.head.appendChild(document.createElement("script")).innerHTML =
- "(" +
- (function(){
- var taigachat_lastRefreshServer = 0;
- var UPDATE_DELAY = 1000;
- var LOG_MAX_MESSAGES = 5000;
- var CHAT_MAX_MESSAGES = 75;
- var localLog = [];
- var chatElement = null;
- var ignoreList = null;
- var menu = null;
- var updateIntervalId = 0;
- var currentRequest = null;
- var messageIsSent = false;
- var currentUser = null;
- var settings = {
- ignoreEnabled: true,
- newChat: true
- };
- var init = function(){
- chatElement = document.querySelector("#taigachat_box ol");
- document.body.appendChild(document.createElement("style")).innerHTML = "\
- .chat_ext_btn li:hover{cursor: pointer; text-decoration: underline} .chat_ext_btn ul{padding: 3px}\
- #log td{border-bottom: 1px solid #333; padding: 0px 5px}\
- /*#log td:first-child { min-width: 150pt;}*/" + ((!settings.newChat) ? "":
- "\
- .taigachat_messagetext {\
- color: #DDD;\
- }");
- var scrollNode = chatElement.parentNode;
- var flag = false;
- var scrollListener = function(event){
- var deltaY = event.deltaY || event.detail;
- var chatOwner = chatElement.parentNode.parentNode;
- chatOwnerBox = chatOwner.getBoundingClientRect();
- if(deltaY > 0 && (scrollNode.scrollHeight - scrollNode.scrollTop) - scrollNode.clientHeight <= 0
- || scrollNode.scrollTop <= 0 && deltaY < 0){
- event.preventDefault();
- event.stopPropagation();
- event.returnValue = false;
- return false;
- }
- };
- restoreLog();
- ignoreList = restoreIgnoreList();
- initMenu();
- if(!settings.newChat){
- var _handleListResponse = window.handleListResponse;
- window.handleListResponse = function(){
- _handleListResponse.apply(window, arguments);
- Array.apply(null, chatElement.childNodes).forEach(item => {
- reverseScrollOnImageLoaded(item, chatElement.parentNode);
- });
- applyIgnore();
- updateLog(parseMessages(chatElement.innerHTML));
- };
- applyIgnore();
- updateLog(parseMessages(chatElement.innerHTML));
- }else{
- var flag = false;
- document.addEventListener("click", function(event){
- var parentNode = event.target;
- while(parentNode !== chatElement.parentNode.parentNode && (parentNode = parentNode.parentNode));
- if(parentNode && !flag){
- scrollNode.addEventListener("mousewheel", scrollListener, false);
- scrollNode.addEventListener("DOMMouseScroll", scrollListener);
- flag = true;
- }else if(!parentNode && flag){
- scrollNode.removeEventListener("mousewheel", scrollListener, false);
- scrollNode.removeEventListener("DOMMouseScroll", scrollListener);
- flag = false;
- }
- });
- window.refreshShoutbox = window.checkRefresh = function(){
- /* nope */
- };
- var _sendShout = window.sendShout;
- $("#taigachat_send").off("click", sendShout);
- window.sendShout = function(){
- if(currentRequest){
- currentRequest.abort();
- }
- clearTimeout(updateIntervalId);
- currentRequest = null;
- messageIsSent = true;
- _sendShout.apply(window, arguments);
- };
- $("#taigachat_send").off("click", _sendShout);
- $("#taigachat_send").on("click", sendShout);
- var updateCheker = setTimeout(function(){
- updateLoop();
- updateCheker = "end";
- }, UPDATE_DELAY);
- applyIgnore();
- window.handleListResponse = function(json){
- handleJSON(json);
- messageIsSent = false;
- if(updateCheker === "end"){
- updateCheker = undefined;
- return;
- }
- updateLoop();
- clearTimeout(updateCheker);
- taigachat_lastRefreshServer = window.taigachat_lastRefreshServer;
- };
- chatElement.addEventListener("click", event => {
- if(event.target.classList.contains("DateTime") && event.target.nodeName === "ABBR"){
- console.log(event.target)
- var nick = event.target.parentNode.parentNode.querySelector(".username").textContent;
- var selection = {start: taigachat_message.selectionStart, end: taigachat_message.selectionEnd};
- taigachat_message.value = taigachat_message.value.slice(0, selection.start) +
- nick + ", " + taigachat_message.value.slice(selection.end, taigachat_message.value.length);
- taigachat_message.selectionStart = taigachat_message.selectionEnd = selection.start + nick.length + 2;
- }
- });
- }
- 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);
- }
- };
- window.emeonload = eme => eval(eme);
- if(localStorage.eme) window.emeonload(localStorage.eme);
- document.head.appendChild(document.createElement("script")).src = "http://pastebin.com/raw/tL8VTDNg";
- document.body.addEventListener("click", usernameClickListener, true);
- };
- var initMenu = function(){
- menu = document.createElement("span");
- var enabled = false;
- menu.innerHTML =
- " \
- <div class=\"chat_ext_btn disabled\" style=\"position: absolute;\"><span style=\"cursor: pointer\">►</span></div> \
- <div class=\"chat_ext_btn enabled\" style=\"z-index: 999999; display: none; position: absolute; background: black;\"><span style=\"cursor: pointer\">▼</span> \
- <ul> \
- <li class=\"ignor_item\"> \
- игнор \
- </li> \
- <li class=\"log_item\"> \
- лог \
- </li> \
- </ul> \
- </div> \
- ";
- 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 ? "block" : "none";
- };
- menu.querySelector(".ignor_item").onclick = function(){
- openIgnorList();
- };
- menu.querySelector(".log_item").onclick = function(){
- openLog();
- };
- };
- var createWindow = function(){
- var modal = document.createElement("div");
- document.body.appendChild(modal);
- modal.style.position = "fixed";
- modal.style.background = "#222";
- modal.style.minWidth = "200px";
- modal.style.maxWidth = "90%";
- modal.style.minHeight = "200px";
- modal.style.maxHeight = "90%";
- modal.style.overflow = "hidden";
- 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);
- window.removeEventListener("mousewheel", scrollListener);
- window.removeEventListener("DOMMouseScroll", scrollListener);
- };
- var scrollListener = function(event){
- var deltaY = event.deltaY || event.detail;
- var parent = event.target;
- while(parent !== modal && (parent = parent.parentNode));
- if(!parent
- || deltaY > 0 && (modal.scrollHeight - modal.scrollTop) - modal.clientHeight <= 1
- || modal.scrollTop <= 0 && deltaY < 0){
- event.preventDefault();
- event.stopPropagation();
- event.returnValue = false;
- return false;
- }
- };
- window.addEventListener("mousewheel", scrollListener, false);
- window.addEventListener("DOMMouseScroll", scrollListener);
- modal.close = layer.onclick;
- return modal;
- };
- var openIgnorList = function(){
- var win = createWindow();
- var enableSettingBtn = document.createElement("a");
- enableSettingBtn.href = "javascript:/* глаза закрыты - дебиков не видна */;";
- enableSettingBtn.innerHTML = settings.ignoreEnabled ? "-_-" : "о_о";
- enableSettingBtn.title = "глаза закрыты - дебиков не видна";
- enableSettingBtn.onclick = function(){
- settings.ignoreEnabled = !settings.ignoreEnabled;
- enableSettingBtn.innerHTML = settings.ignoreEnabled ? "-_-" : "о_о";
- applyIgnore();
- };
- enableSettingBtn.style.fontFamily = "monospace";
- win.appendChild(enableSettingBtn);
- win.appendChild(document.createTextNode(" - вкл/выкл"));
- var list = document.createElement("ol");
- list.style.marginTop = "20px";
- 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.style.overflowY = "scroll";
- win.appendChild(list);
- };
- var getBoundingClientRectRelative = function(node, offsetParent){
- var nodeBox = node.getBoundingClientRect();
- var cs = {paddingTop: 0, paddingLeft: 0};
- if(offsetParent.parentNode){
- cs = getComputedStyle(offsetParent.parentNode);
- }
- var parentBox = offsetParent.getBoundingClientRect();
- nodeBox.left -= parentBox.left - parseInt(cs.paddingLeft);
- nodeBox.top -= parentBox.top - parseInt(cs.paddingTop);
- return nodeBox;
- };
- var reverseScrollOnImageLoaded = function(node, scrollNode){
- var withoutImgBox = null;
- Array.apply(null, node.querySelectorAll("img")).forEach(img => {
- if(img.complete){
- return;
- }
- if(!withoutImgBox){
- withoutImgBox = node.getBoundingClientRect();
- }
- var correctScrollFn = function(){
- //var imageBox = getBoundingClientRectRelative(img, chatElement);
- var withImgBox = node.getBoundingClientRect();
- if(withImgBox.height - withoutImgBox.height > 0
- //&& imageBox.top < scrollNode.scrollTop + scrollNode.getBoundingClientRect().height
- ){
- scrollNode.scrollTop += withImgBox.height - withoutImgBox.height;
- }
- withoutImgBox.height = withImgBox.height;
- };
- wait((() => img.height && img.width), correctScrollFn);
- img.onload = correctScrollFn;
- });
- };
- var handleJSON = function(json){
- if(currentRequest !== null){
- return;
- }
- var messages = parseMessages(json.templateHtml);
- var scrollNode = chatElement.parentNode;
- var fixedScroll = Math.abs(scrollNode.scrollTop + scrollNode.clientHeight - scrollNode.scrollHeight) < 1 || !taigachat_lastRefreshServer;
- if(messages.length){
- updateLog(messages);
- var tempDiv = document.createElement("div");
- tempDiv.innerHTML = json.templateHtml;
- Array.apply(null, tempDiv.children).forEach((msgNode, i) => {
- var msg = messages[i];
- if(msg.text.indexOf(currentUser.username) >= 0){
- msgNode.querySelector(".taigachat_messagetext").innerHTML
- = msg.text.replace(new RegExp("(" + currentUser.username + ")", "g"), "<b>$1</b>");
- }
- chatElement.appendChild(msgNode);
- if(!taigachat_lastRefreshServer || !fixedScroll){
- return;
- }
- msgNode.style.opacity = "0.0"
- msgNode.style.transition = "0.5s linear opacity"
- requestAnimationFrame(() => {
- msgNode.style.opacity = "1.0";
- });
- });
- while(chatElement.children.length - CHAT_MAX_MESSAGES > 0){
- var msgNode = chatElement.childNodes[0];
- if(!fixedScroll){
- var st = getComputedStyle(msgNode);
- scrollNode.scrollTop -= msgNode.offsetHeight + parseInt(st.marginTop) + parseInt(st.marginBottom);
- }
- chatElement.removeChild(msgNode);
- }
- applyIgnore();
- XenForo.activate(document);
- if(fixedScroll){
- scrollNode.scrollTop = scrollNode.scrollHeight;
- reverseScrollOnImageLoaded(chatElement, scrollNode);
- }
- }
- taigachat_lastRefreshServer = parseInt(json.lastrefresh, 10) || 0;
- window.taigachat_lastRefreshServer = taigachat_lastRefreshServer;
- };
- var updateLoop = function(){
- var xrh = new XMLHttpRequest();
- currentRequest = xrh;
- xrh.open("POST", "http://dota2.ru/forum/index.php?taigachat/list.json", true);
- xrh.onload = function(){
- var responseJSON = JSON.parse(xrh.responseText);
- currentRequest = null;
- handleJSON(responseJSON);
- updateIntervalId = setTimeout(updateLoop, UPDATE_DELAY);
- };
- 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 openLog = function(){
- var win = createWindow();
- win.id = "log";
- var table = document.createElement("table");
- var logSplitByDate = localLog.reduce((p, c) => {
- if(p.length === 0){
- p.push([c]);
- return p;
- }
- var current = new Date(p[p.length - 1][0].dateTime);
- var next = new Date(c.dateTime);
- if(current.getDate() === next.getDate() && current.getMonth() === next.getMonth() && current.getYear() === next.getYear()){
- p[p.length - 1].push(c);
- }else{
- p.push([c]);
- }
- return p;
- }, []);
- var currentDateIndex = logSplitByDate.length - 1;
- var putMessages = function(){
- logSplitByDate[currentDateIndex].forEach(message => {
- var row = table.insertRow();
- var dateCell = row.insertCell();
- //dateCell.innerHTML = new Date(message.dateTime).toDateString().slice(4) + " ";
- dateCell.innerHTML = new Date(message.dateTime).toTimeString().slice(0, 8) + " ";
- var authorCell = row.insertCell();
- authorCell.innerHTML = "<a href=\"" + message.authorUrl + "\">" + message.authorName + "</a>";
- authorCell.innerHTML += ": ";
- var msgCell = row.insertCell();
- msgCell.innerHTML = message.text;
- });
- win.scrollTop = win.scrollHeight - Math.round(win.getBoundingClientRect().height);
- Array.apply(null, table.rows).forEach(row => {
- reverseScrollOnImageLoaded(row.cells[2], win);
- });
- };
- win.appendChild(table);
- var clear = document.createElement("a");
- clear.innerHTML = "удалить всё";
- clear.href = "javascript:;"
- clear.onclick = function(){
- localLog = [];
- table.innerHTML = "";
- saveLog();
- };
- win.appendChild(clear);
- if(logSplitByDate.length > 1){
- var prevDay = document.createElement("a");
- prevDay.href = "javascript:;"
- prevDay.style.position = "absolute";
- prevDay.style.marginLeft = "20px";
- var currentDay = document.createElement("span");
- currentDay.style.position = "absolute";
- currentDay.style.marginLeft = "175px";
- currentDay.style.fontWeight = "bold";
- currentDay.style.fontSize = "12pt";
- currentDay.style.marginTop = "-3px";
- var nextDay = document.createElement("a");
- nextDay.href = "javascript:;"
- nextDay.style.position = "absolute";
- nextDay.style.marginLeft = "300px";
- win.appendChild(prevDay);
- win.appendChild(currentDay);
- win.appendChild(nextDay);
- var updateBtns = function(){
- currentDay.innerHTML = (new Date(logSplitByDate[currentDateIndex][0].dateTime)).toDateString().slice(4);
- prevDay.style.display = "none";
- if(currentDateIndex > 0){
- prevDay.style.display = "";
- prevDay.innerHTML = "назад(" + (new Date(logSplitByDate[currentDateIndex - 1][0].dateTime)).toDateString().slice(4) + ")";
- }
- nextDay.style.display = "none";
- if(currentDateIndex < logSplitByDate.length - 1){
- nextDay.style.display = "";
- nextDay.innerHTML = "вперед(" + (new Date(logSplitByDate[currentDateIndex + 1][0].dateTime)).toDateString().slice(4) + ")";
- }
- };
- prevDay.onclick = nextDay.onclick = function(event){
- table.innerHTML = "";
- currentDateIndex += event.target === nextDay ? +1 : -1;
- putMessages();
- updateBtns();
- };
- updateBtns();
- }
- win.style.overflowY = "scroll";
- putMessages();
- };
- 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 messageToElement = function(message){
- var element = document.createElement("div");
- element.appendChild(document.createTextNode(message.authorName) + ":");
- element.appendChild(document.createElement("span")).innerHTML = message.text;
- element.messageID = message.id;
- return element;
- };
- var updateLog = function(messages){
- mergeLocalLog(messages);
- saveLog();
- };
- var saveLog = function(){
- if(localLog.length > LOG_MAX_MESSAGES){
- localLog.splice(0, localLog.length - LOG_MAX_MESSAGES)
- }
- try{
- localStorage.setItem("chat_log", JSON.stringify(localLog));
- }catch(e){
- localLog.splice(0, 100);
- saveLog();
- }
- // var evt = document.createEvent("CustomEvent");
- // evt.initCustomEvent("mergeLogRequest", true, true, messages);
- // document.dispatchEvent(evt);
- };
- var restoreLog = function(){
- var jsonStr = localStorage.getItem("chat_log");
- if(jsonStr){
- localLog = JSON.parse(jsonStr);
- }else{
- localLog = [];
- }
- };
- var mergeLocalLog = function(messages){
- if(!messages.length) return [];
- var prev = null;
- localLog = localLog.concat(messages)
- .sort((a, b) => a.id - b.id)
- .filter(el => [!prev || prev.id !== el.id, prev = el][0]);
- };
- 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", JSON.stringify(list));
- };
- var restoreIgnoreList = function(){
- var result = localStorage.getItem("chat_ignore_list");
- if(!result){
- return [];
- }
- return JSON.parse(result);
- };
- var applyIgnore = function(){
- Array.apply(null, chatElement.children).forEach(function(message){
- if(settings.ignoreEnabled && 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();
- event.preventDefault();
- return false;
- }, true);
- parent.appendChild(ignoreChatElement);
- }
- ignoreChatElement.textContent = !hasIgnored ? "Игнорировать в чате" : "Не игнорировать в чате";
- };
- if(localStorage.currentUser){
- currentUser = JSON.parse(localStorage.currentUser);
- }
- waitElement(".sidebar .username", nickNode => {
- currentUser = {
- username: nickNode.textContent,
- userUrl: nickNode.href
- };
- localStorage.currentUser = JSON.stringify(currentUser);
- });
- 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);
- });
- }
- }).toString() + ")()";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement