NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Slack Ignore List // @namespace https://gist.github.com/shtrih/be922d9229925bb52617 // @version 1.1 // @description Add blacklists to channels // @author shtrih // @match https://*.slack.com/messages/*/ // @grant none // ==/UserScript== /* jshint -W097 */ 'use strict'; // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver function getActiveChannelId() { var pubChanId = $('.star_channel', '#active_channel_name').attr('data-channel-id'), privChanId = $('.star_group', '#active_channel_name').attr('data-group-id') ; return pubChanId || privChanId; } function getActivePrivateId() { return $('.star_im', '#active_channel_name').attr('data-im-id'); } function getMemberIdMenu() { return $('a.member_preview_link', '#menu_header').attr('data-member-id'); } function getMemberIdMessage(elMessage) { return $('.message_content > a.message_sender', elMessage).attr('data-member-id'); } var Ignorer = (function () { return { set: function (channelId, memberId) { localStorage.setItem(channelId + memberId, 1); }, get: function (channelId, memberId) { return localStorage.getItem(channelId + memberId); }, remove: function (channelId, memberId) { localStorage.removeItem(channelId + memberId); } }; })(); var targetMessages = document.querySelector('#msgs_div'), targetUI = document.querySelector('#client-ui'), menuIgnoreUser = $('<li id="member-ignore" role="menuitem">\ <a><span class="menu_item_label">Ignore user</span></a>\ </li>'), messageHiderHandler = function (divMessage) { var classList = divMessage.classList; if (classList && !classList.contains('unprocessed') && classList.contains('message')) { var channelId = getActiveChannelId(), memberId = getMemberIdMessage(divMessage), isIgnored = Ignorer.get(channelId, memberId) ; if (isIgnored) { classList.add('hidden'); } } }, messageReveal = function (memberId) { $('ts-message.message.hidden', targetMessages).each(function () { if (getMemberIdMessage(this) == memberId) $(this).removeClass('hidden'); }); }, refreshHider = function () { $('ts-message.message:not(.hidden)', targetMessages).each(function () { messageHiderHandler(this); }); }, // Скрывает новые сообщения от юзеров observerMessageHider = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation && mutation.addedNodes instanceof NodeList && mutation.addedNodes.length) { Array.prototype.forEach.call(mutation.addedNodes, messageHiderHandler); } }); }), // Добавляет пункт о блокировке во всплывающее меню юзера observerUserMenu = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation && mutation.addedNodes instanceof NodeList && mutation.addedNodes.length) { Array.prototype.forEach.call(mutation.addedNodes, function(node){ if (node.id == 'menu') { var $node = $(node), channelId = getActiveChannelId() ; // если не меню юзера или меню юзера не в общем чате if ($node.attr('data-qa') || !channelId) return false; $('#menu_items', $node).append(menuIgnoreUser); $('a', menuIgnoreUser).off().on('click', function () { var memberId = getMemberIdMenu(); // console.log('ignore user', memberId); $('#menu').remove(); Ignorer.set(channelId, memberId); refreshHider(); showIgnoredMembers(); return false; }); } }); } }); }), // Обработка списка участников targetSidebar = document.querySelector('#details_tab'), observerSidebar = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation && mutation.addedNodes instanceof NodeList && mutation.addedNodes.length) { Array.prototype.forEach.call(mutation.addedNodes, function (node) { if ($(node).hasClass('monkey_scroll_hider')) { processIgnoredMembers(); observerSidebar.disconnect(); } }); } }); }), ignoreIcon = $('<i/>', { class: 'ts_icon ts_icon_flag', style: 'display: inline-block; font-size: 20px; line-height: 20px; position: absolute; top: -8px; left: -12px; color: red; cursor: pointer;', click: function () { var parent = $(this).parent(), memberId = parent.attr('data-member-presence'), channelId = getActiveChannelId() ; Ignorer.remove(channelId, memberId); messageReveal(memberId); parent.remove(); } }), showIgnoredMembers = function () { $('span[data-member-presence]', '#channel_page_all_members').each(function () { var self = $(this), memberId = self.attr('data-member-presence'), channelId = getActiveChannelId() ; if (Ignorer.get(channelId, memberId)) { self.after( self.clone().attr('title', 'Ignored. Click to cancel ignore.').html( ignoreIcon.clone(true) ) ); } }); }, processIgnoredMembers = function () { var observerMemberList = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation && mutation.addedNodes instanceof NodeList && mutation.addedNodes.length) { Array.prototype.forEach.call(mutation.addedNodes, function (node) { if (node.nodeType !== Node.ELEMENT_NODE) return false; showIgnoredMembers(); }); } }); }); showIgnoredMembers(); observerMemberList.observe($('[data-section-name="members"] .channel_page_member_lists').get(0), { childList: true }); } ; observerMessageHider.observe(targetMessages, { childList: true }); observerUserMenu.observe(targetUI, { childList: true }); observerSidebar.observe(targetSidebar, { childList: true });