TimofeiRylow / ExpChecker

// ==UserScript==
// @name         ExpChecker
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  Check Experts in vk.com!
// @copyright 2017, RULON (https://openuserjs.org/users/TimofeiRylow/)
// @updateURL https://openuserjs.org/meta/TimofeiRylow/ExpChecker.meta.js
// @license MIT
// @author       RULON
// @match        https://vk.com/*
// @resource     apiLib https://ifx.su/~va
// @grant        GM_getResourceText
// ==/UserScript==

function DevUsers() {

    var cache = {}; 
    var groups = { 
         "182611749": {
            title: "Эксперт ВКонтакте",
            href: "https://vk.com/experts",
            background: "url(https://sun3-13.userapi.com/c855432/v855432129/15ab82/2wyTzD5LxuA.jpg?ava=1) center/cover"
        }
    };

    function insertStyles() {
        var style = document.createElement("style"); 
        style.innerHTML = 
            '.user_checker_icon {' +
            '   width: 12px; height: 12px; border-radius: 12px;' +
            '   display: inline-block;  margin: 0px 0px -1px 2px;' +
            '   transition: transform .2s; position: relative;' +
            '}' +
            '.user_checker_icon:hover {' +
            '    transform: scale(1.2);' +
            '}';
        document.head.appendChild(style); 
    }

    function checkLinks(el) { 
        var links = el.querySelectorAll('.im-mess-stack--lnk, .author, .friends_field a, .im-member-item--name a');
        if (!links) return; 
        Array.from(links).map(function (link) { 
            if (link.checked) return; 
            checkUser(link); 
            link.checked = 1; 
        });
    }

    function drawIcons(link, info) { 
        if (!info.types.length || !info.user_id) return; 
        info.types.map(function (type) { 
            var icon = document.createElement("a"); 
            icon.className = "user_checker_icon"; 
            icon.title = groups[type].title; 
            icon.style.background = groups[type].background;
            icon.onmouseover = function () {
                if(!showTooltip) return;
                showTooltip(icon, {
                	force: 1,
                	black: 1,
                	content: '<div class="tt_text wrapped">' + icon.title + '</div>'
                });
            };
            link.appendChild(icon); 
        });
        return info; 
    }

    var executeCode = function () { 
        var types = []; 
        var groups = Args.groups.split(","); 
        var ui = API.utils.resolveScreenName(Args); 
        if (ui.type != "user") return {
            types: [],
            user_id: 0
        }; 
       
        var group = 0; 
        var isMember = 0; 
        while(groups.length){ 
            group = groups.shift();
            isMember = API.groups.isMember({ 
                group_id: group,
                user_id: ui.object_id
            });
            if (isMember) types.push(group); 
        }
        // Выводим user_id и подписки
        return {
            types: types,
            user_id: ui.object_id
        };
    };

    
    executeCode = executeCode.toString().replace(/.+?\{([^]+)\}$/, "$1");

    function checkUser(link) { 
        var screen_name = link.href.replace(/.+\//, "");
        if (cache[screen_name] && cache[screen_name].then)
            return cache[screen_name].then(drawIcons.bind(this, link));
       
        if (cache[screen_name] && cache[screen_name].updated > Date.now()) return drawIcons(link, cache[screen_name]);
        cache[screen_name] = API("execute", { 
            screen_name: screen_name, 
            groups: groups.ids, 
            code: executeCode 
        }).then(function (r) { 
            cache[screen_name] = r.response; 
            cache[screen_name].updated = Date.now() + 864e5; 
            if (r.response.types.length || !r.response.user_id) 
                localStorage.expUsersCache2 = JSON.stringify(cache); 
            drawIcons(link, r.response); 
            return r.response; 
        }).catch(function (e) {
            console.error(e); 
        });
    }

  
    var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            if (mutation.target.nodeType !== 1) return;
            checkLinks(mutation.target); 
        });
    });

    window.addEventListener("load", function () { 
        insertStyles(); 

        if (localStorage.expUserGroups) 
            groups = JSON.parse(localStorage.expUserGroups); 
        if (localStorage.expUsersCache2) 
            cache = JSON.parse(localStorage.expUsersCache2);

        groups.ids = Object.keys(groups).join(",");

        checkLinks(document.body);

        observer.observe(document.body, { 
            childList: true, 
            subtree: true 
        });
    });

}

(function injectScript() {
    var script = document.createElement('script');
    var code = '(' + DevUsers + ')();';
    code += '(function(){' + (GM_getResourceText('apiLib')) + '})();';
    script.appendChild(document.createTextNode(code));
    (document.body || document.head || document.documentElement).appendChild(script);
})();