LZTThreadTypingUniq

Уник в статусе печатания в темах

// ==UserScript==
// @name         LZTThreadTypingUniq
// @namespace    MeloniuM/LZT
// @version      1.2
// @description  Уник в статусе печатания в темах
// @author       MeloniuM
// @license      MIT
// @match        https://lolz.live/threads/*
// @match        https://zelenka.guru/threads/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zelenka.guru
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    //строка для вырезания ников из фраз
    let str = (XenForo.phrases.users_are_typing + ' ' + XenForo.phrases.count_more + ' ' + XenForo.phrases.user_is_typing).replaceAll(/{{(user[12]?|count)}}/g, ' ').replace(/\s+/g, ' ').trim();
    //удаляем дубликаты
    str = [...new Set(str.split(" "))];
    //массив уников
    let prioritizedACUsers;
    function getPrioritizedACUsers(){
        if (prioritizedACUsers) return prioritizedACUsers;

        prioritizedACUsers = $('textarea.LolzteamEditorSimple').data('options').prioritizedACUsers.reduce((acc, cur) => {
            if (cur.username == "Mellorium") return acc;
            acc[cur.username] = {
                avatar: cur.avatar,
                username: cur.usernameHtml,
                user: cur.username
            };
            return acc;
    }, {});
        return prioritizedACUsers;
    }

    let findProcess = [];

    const config = {
        subtree: true,
        childList: true
    };

    const callback = function (mutationsList, observer) {
        for (let mutation of mutationsList) {
            if (mutation.type !== "childList") return;

            $.each(mutation.addedNodes, function(index, node) {
                if ($(node).is('span.username') || $(node.parentElement).is('span.username')) return;

                //текст тайпинга
                let typing = node.textContent;
                //получаем ники
                let users = typing.trim().split(' ').filter(x => !str.includes(x));
                if (!users.length) return;
                let pUsers = getPrioritizedACUsers();
                $.each(users, function(index, user) {
                    if (pUsers[user]){
                        typing = typing.replace(user, pUsers[user].username);
                        return;
                    }
                    //чтобы дважды не запрашивало
                    if (findProcess.includes(user)) return;
                    findProcess.push(user);
                    XenForo.ajax('/members/find', {q: user}, resp => {
                        if (!XenForo.hasResponseError(resp)) {
                            let result = resp.results[user];
                            console.log(prioritizedACUsers)
                            prioritizedACUsers[user] = result;
                            delete findProcess[findProcess.indexOf(user)]
                            $.each($('#LiveTypingUsers .Users')[0].childNodes, function(index, node) {
                                if (node.nodeType !== Node.TEXT_NODE) return;
                                if (!node.textContent.includes(user)) return;
                                if ($(node).closest('.username').length) return;
                                $(node).replaceWith(node.textContent.replace(user, result.username));
                            });
                        }
                    })
                });
                if (node.textContent === typing) return;

                $(node).replaceWith(typing);
            })
        }
    };
    const observer = new MutationObserver(callback);
    observer.observe($('#LiveTypingUsers')[0], config);

})();