NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==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); })();