Greasy Fork is available in English.

LZTConversationsMute

Отключаем уведомления с диалогов

// ==UserScript==
// @name         LZTConversationsMute
// @namespace    Melonium/LZT
// @version      2.0
// @description  Отключаем уведомления с диалогов
// @author       MeloniuM
// @license      MIT
// @match        *://zelenka.guru/*
// @match        *://lzt.market/*
// @match        *://lolz.guru/*
// @match        *://lolz.live/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru
// @grant none
// ==/UserScript==


(function() {
    'use strict';
    var mutedList = localStorage.getItem('conversationsMuted')? localStorage.getItem('conversationsMuted').split(',').map(Number) : [];
    //Стильно, модно, молодёжно
    $("<style>").prop("type", "text/css").html(".conversationItem .avatar .conversationMute{position: absolute; background-color: rgb(39, 39, 39); border-radius: 50%; border: 1px solid rgb(17 17 17); text-align: center; line-height: 16px; top: 3px; left: 34px; height: 16px; width: 16px; display: inline-block; z-index: 1}").appendTo("head");
    const lang = XenForo.visitor.language_id - 1;
    const phrases = {
        'mute': (lang? 'Откл. уведомления': 'Mute alerts'),
        'unmute': (lang? 'Вкл. уведомления': 'Unmute alerts')
        };

    XenForo.conversationMuteButton = function($button) {
        $button.on('click', function(e){
            e.preventDefault();
            let $target = $(e.target);
            let id = $target.data('id');
            let isMuted = muteToggle(id, $('#conversation-' + id + ' .avatar .conversationMute'));
            $target.text(phrases[(isMuted? 'unmute': 'mute')]);
        })
    }
    XenForo.register(".conversationMuteButton", "XenForo.conversationMuteButton");

    function addIcon($target){
        let show = true;
        let id = $target.attr('data-cid');
        if (!mutedList.includes(Number(id))) show = false;
        //выбор иконки
        const i = $(`<i class="fa fa-volume-mute conversationMute"></i>`);
        if (!show) i.hide();

        i.on('click', function(event) {//быстрый размут
            event.preventDefault();
            event.stopPropagation();

            let id = $(event.target).closest('.conversationItem').attr('data-cid');
            let isMuted = muteToggle(id, $(event.target));
            //меняем текст на кнопке в менюшке
            $('.conversationMuteButton[data-id="' + id + '"]').text(phrases[(isMuted? 'unmute': 'mute')]);
        });

        if (!$target.find('.avatar .conversationMute').length) $target.find('.avatar').append(i);
    }

    function muteToggle(id, icon){
        let muted = true;
        mutedList = localStorage.getItem('conversationsMuted')? localStorage.getItem('conversationsMuted').split(',').map(Number) : [];
        if (!mutedList.includes(Number(id))){
            //отключаем уведы
            mutedList.push(Number(id))
            icon.show();
        }else{
            //включаем уведы
            mutedList.splice(mutedList.indexOf(Number(id)),1)
            icon.hide();
            muted = false;
        }
        localStorage.setItem('conversationsMuted', mutedList.join(','));
        return muted;// значение после изменений
    }

    if (window.location.pathname.startsWith('/conversations')){
        $("<style>").prop("type", "text/css").html(".conversationItem .avatar.fa.fa-volume-mute::before {position: absolute; background-color: rgb(39, 39, 39); border-radius: 50%; border: 1px solid rgb(17 17 17); text-align: center; line-height: 16px; top: 3px; left: 34px; height: 16px; width: 16px; display: inline-block; z-index: 1}").appendTo("head");

        //при смене позиции диалога в списке 'XenForoActivate' не вызывается, поэтому используем 'DOMNodeInserted'
        $(document).on('DOMNodeInserted', '.conversationItem:not(:has(.conversationMute))', function(e){
            const $target = $(e.target);
            addIcon($(e.target));
        });

        $(document).bind('PopupMenuShow', function(e){
            let $menu = e.$menu
            let $context = $($menu.context);
            if ($context.is('.RecipientsPopup') || !$context.closest('.membersAndActions').length) return;
            if ($menu.find('.conversationMuteButton').length) return;
            mutedList = localStorage.getItem('conversationsMuted')? localStorage.getItem('conversationsMuted').split(',').map(Number) : [];
            let phrase = phrases[(mutedList.includes(Im.conversationId)? 'unmute': 'mute')];
            $menu.find(".secondaryContent, .blockLinksList").append('<a class="item control conversationMuteButton MenuCloser" data-id="' + Im.conversationId + '">' + phrase + '</a>').xfActivate();
        });

        $('#ConversationListItems').find('.conversationItem:not(:has(.conversationMute))').each(function(index){
            addIcon($(this));
        });
    }else{

        $(window).on('load', function(){
            let s;
            const m = (s = window).Im || (s.Im = {});

            const notification = $('html').data('Im.Notification');
            if (!notification) return;
            notification.displayNotification_old = notification.displayNotification;
            notification.displayNotification = (data) => {
                if (mutedList.includes(data.conversation_id) && !location.pathname.startsWith('/conversations')){
                    notification.handledNotifications.add(data.message.message_id);
                    if (!m.newMessageCache[data.conversationId]) {
                        m.newMessageCache.push(data.conversationId);
                    }
                    var popup = $("#ConversationsMenu.Menu").data("XenForo.PopupMenu");
                    if (popup) popup.reload();//Обновление счетчика сообщений в меню в шапке сайта
                    return;
                }
                return notification.displayNotification_old(data);
            }
        });
    };
    //синхронизация между вкладками
    $(window).bind('storage', function (e) {
        if(e.originalEvent.key !== 'conversationsMuted') return;
        mutedList = e.originalEvent.newValue;

        if (window.location.pathname.startsWith('/conversations')){
            let [newValue, oldValue] = [e.originalEvent.newValue.split(','), e.originalEvent.oldValue.split(',')];
            let del = true;//айди удалился
            let arrA, arrB;
            if (newValue.length > oldValue.length){
                del = false;//добавился новый айди
                //если новое значение больше, фильтровать будем
                arrA = newValue;
                arrB = oldValue;
            }else{
                //если новое значение больше, значит айди удалился
                arrA = oldValue;
                arrB = newValue;
            }
            //получим элементы из массива A, которых нет в массиве B.
            let ids = arrA.filter(x => !arrB.includes(x));
            //в теории их может быть больше 1
            ids.forEach((id) => {
                $('.conversationMuteButton[data-id="' + id + '"]').text(phrases[(!del? 'unmute': 'mute')]);//смена текста на кнопке в меню
                $('#conversation-' + id + ' .avatar .conversationMute')[!del? 'show': 'hide']();//скрытие/показ иконки на аве
            })
        }
    });
})();