Advertisement
Guest User

DevChecker

a guest
Jan 20th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JSON 12.57 KB | None | 0 0
  1. // ==UserScript==
  2. // @name         DevChecker
  3. // @namespace    http://tampermonkey.net/
  4. // @version      1.5.9
  5. // @description  Check Developers and testers in vk.com! Editor slmatthew
  6. // @updateURL https://openuserjs.org/meta/matuhak/DevChecker.meta.js
  7. // @copyright 2018, slmatthew (https://vk.com/slmatthew)
  8. // @license MIT
  9. // @author       Flyink, severecloud, slmatthew
  10. // @match        https://vk.com/*
  11. // @grant        GM_xmlhttpRequest
  12. // ==/UserScript==
  13.  
  14. //Чекаем версию
  15. var lastver = 1514124637;//Измените число, если вам лень искать, где чистить кэш
  16. if (localStorage.devUsersVer){
  17.     var ver = JSON.parse(localStorage.devUsersVer);
  18.     if (lastver != ver)
  19.         ClearCache();
  20.     localStorage.devUsersVer = lastver;
  21. } else
  22.     ClearCache();
  23.  
  24. function ClearCache(){//Чистим кэш
  25.     if (localStorage.devUsersCache2){
  26.         localStorage.removeItem("devUsersCache2");
  27.         localStorage.devUsersVer = lastver;
  28.         console.log('clearCache');
  29.     }
  30. }
  31.  
  32.  
  33. function DevUsers() {
  34.  
  35.     var cache = {}; // Кэш
  36.     var groups = { // Настройки
  37.         "9713780": { // id групп
  38.             title: "Разработчик", // Подсказки
  39.             href: "https://vk.com/devclub", // Ссылки * - id юзера
  40.             background: "url(https://pp.userapi.com/c846019/v846019924/11a830/16OtMC_qa7A.jpg?ava=1) center/cover", // иконка
  41.         },
  42.         "150825328": {
  43.             title: "Special Forces",
  44.             href: "https://vk.com/specialtesters",
  45.             background: "url(https://pp.userapi.com/c637621/v637621394/59591/XWk69t0P1Iw.jpg?ava=1) center/cover"
  46.         },
  47.         "134304772": {
  48.             title: "VK Testers",
  49.             href: "https://vk.com/bugtracker?act=reporter&id=*",
  50.             background: "url(https://pp.userapi.com/c639625/v639625391/42408/zj0kpTaIKiI.jpg?ava=1) center/cover"
  51.         },
  52.         "164546092": {
  53.             title: "/testhub",
  54.             href: "https://vk.com/testhub",
  55.             background: "url(https://pp.userapi.com/c846418/v846418760/7543a/FmOs3erqyXM.jpg?ava=1) center/cover"
  56.         },
  57.         "164186528": {
  58.             title: "Developer",
  59.             href: "https://vk.com/devsclub",
  60.             background: "url(https://pp.userapi.com/c851036/v851036173/18381/A8dEksSCyXk.jpg?ava=1) center/cover"
  61.         },
  62.         "157840421": {
  63.             title: "/testmem",
  64.             href: "https://vk.com/testmem",
  65.             background: "url(https://pp.userapi.com/c845016/v845016345/13db3b/EbTIxaMnZb8.jpg?ava=1) center/cover"
  66.         },
  67.                 "164245702": {
  68.             title: "Call-центр",
  69.             href: "https://vk.com/tsetsllac",
  70.             background: "url(https://sun1-2.userapi.com/c840720/v840720361/6fd31/CWmwGzBxtUk.jpg) center/cover"
  71.         },
  72.         "16000": {
  73.             title: "Переводчик",
  74.             href: "https://vk.com/club16000",
  75.             background: "url(https://pp.userapi.com/c841131/v841131046/568c7/JoteqN2aZhk.jpg) center/cover"
  76.         }
  77.     };
  78.  
  79.     function insertStyles() { // Фукция иниацилизации стилей
  80.         var style = document.createElement("style"); // Создаем элемент стилей
  81.         style.innerHTML = // css стили// css стили
  82.             '.user_checker_icon:last-child { margin-right: 2px; }'+
  83.             'a:hover .user_checker_icon {opacity:1;}'+
  84.  
  85.             '.user_checker_icon {' +
  86.             '   width: 12px; height: 12px; border-radius: 12px;opacity:.5; box-shadow: inset 0 0 0 1px rgb(106, 152, 204);' +//
  87.             '   display: inline-block;  margin: 0px 1px -1px 2px;outline-offset:-1px;' +
  88.             '   position: relative; transition: transform, margin .2s, .2s;' +
  89.             '}' +
  90.             '.user_checker_icon:first-child { margin-left: 5px; }'+
  91.             '.user_checker_icon:hover {' +
  92.             '    transform: scale(1.2); ' +
  93.             '}';
  94.         document.head.appendChild(style); // Добавляем в залоговок
  95.     }
  96.  
  97.     function checkLinks(el) { // Функция поиска в элементе ссылок
  98.         var links = el.querySelectorAll('.im-mess-stack--lnk, .author, .friends_field a, .im-member-item--name a, .labeled.name a, .mention_tt_name, .group_u_title, div.Entity__title a.Link, .bp_author');
  99.         if (!links) return; // Если в элементе нет ссылок, то пропускаем
  100.         Array.from(links).map(function (link) { // Если есть, то перебираем
  101.             if (link.checked) return; // Если ссылка проверена, то пропускаем
  102.             checkUser(link); // Если есть, то отдаем на проверку
  103.             link.checked = 1; // Отмечаем прочитанной
  104.         });
  105.     }
  106.  
  107.     function drawIcons(link, info) { // Функция отрисовки иконок
  108.         if (!info.types.length || !info.user_id) return; // Если у юзера его нет или если это не юзер, то выходим
  109.         info.types.map(function (type) { // Перебираем группы
  110.             var icon = document.createElement("a"); // Создаем ссылку
  111.             icon.className = "user_checker_icon"; // назначаем ей класс
  112.             icon.target = "_blank"; // Открывать в новой вкладке
  113.             icon.href = groups[type].href.replace("*", info.user_id); // Ссылка на карточку тестировщика
  114.             icon.style.background = groups[type].background; // Иконка
  115.             icon.onmouseover = function () {
  116.                 if(!showTooltip) return;
  117.                 showTooltip(icon, {
  118.                     force: 1,
  119.                     black: 1,
  120.                     content: '<div class="tt_text wrapped">' + groups[type].title + '</div>'
  121.                 });
  122.             };
  123.             link.appendChild(icon); // Добавляем ссылку в ссылку
  124.         });
  125.         return info; // Отдаем результат для ссылок ждущих кеша
  126.     }
  127.  
  128.     var executeCode = function () { // Функция передаваемая в execute для получение исформации о пользователе
  129.         var types = []; // Типы
  130.         var groups = Args.groups.split(","); // id групп
  131.         var ui = API.utils.resolveScreenName(Args); // Получаем id пользователя
  132.         if (ui.type != "user") return {
  133.             types: [],
  134.             user_id: 0
  135.         }; // Если не юзер, то выходим
  136.         //Запрос отчетов
  137.         // Далее проверяем на наличие юзера в группах, если есть, то складываем в типы
  138.         var group = 0; // Доя записи текущей группы;
  139.         var isMember = 0; // Переменная для проверки подписки
  140.         while(groups.length){ // Перебираем группы
  141.             group = groups.shift(); // Первую в списке
  142.             isMember = API.groups.isMember({ // Проверяем подписку
  143.                 group_id: group,
  144.                 user_id: ui.object_id
  145.             });
  146.             if (isMember) types.push(group); // Если подписан, то записываем это
  147.         }
  148.  
  149.         // Выводим user_id и подписки
  150.         return {
  151.             types: types,
  152.             user_id: ui.object_id,
  153.         };
  154.     };
  155.  
  156.     // Преобразуем функцию в строку, для дальнейшего считывания execute
  157.     executeCode = executeCode.toString().replace(/.+?\{([^]+)\}$/, "$1");
  158.  
  159.     function checkUser(link) { // Проверка пользователя на группы
  160.         var screen_name = link.href.replace(/.+\//, ""); // Убираем из ссылки vk.com и прочее
  161.         if (cache[screen_name] && cache[screen_name].then) // Если в кэше Promise
  162.             return cache[screen_name].then(drawIcons.bind(this, link)); // то ждем ее результат и выводим иконки
  163.         // Если в кэше результат и он не старее суток, то выводим иконки
  164.         if (cache[screen_name] && cache[screen_name].updated > Date.now()) return drawIcons(link, cache[screen_name]);
  165.         cache[screen_name] = API("execute", { // Если нет в кэше, то проверяем ее
  166.             screen_name: screen_name, // Передаем ссылку в execute
  167.             groups: groups.ids, // id групп
  168.             code: executeCode // и код из функции выше
  169.         }).then(function (r) { // Ждем результат
  170.             cache[screen_name] = r.response; // Записываем результат в кэш
  171.             cache[screen_name].updated = Date.now() + 864e5; // Записываем время через которое нужно повторить запрос
  172.             if (r.response.types.length || !r.response.user_id) // Если юзер есть в группах или это не юзер,
  173.                 localStorage.devUsersCache2 = JSON.stringify(cache); // то записываем кэш в localStorage
  174.             drawIcons(link, r.response); // Рисуем иконки
  175.             return r.response; // Отдаем остальным
  176.         }).catch(function (e) { // При ошибках
  177.             console.error(e); // Выводим в консоль
  178.         });
  179.     }
  180.  
  181.     // Создаем обработчик мутаций элемента
  182.     var observer = new MutationObserver(function (mutations) {
  183.         mutations.forEach(function (mutation) { // Перебираем обновленя в элементах
  184.             if (mutation.target.nodeType !== 1) return; // Если элемент не блок, то выходим
  185.             checkLinks(mutation.target); // Отдаем элемент на проверку ссылок
  186.         });
  187.     });
  188.  
  189.     window.addEventListener("load", function () { // Вешаем обработчик на загрузку страницы
  190.         insertStyles(); // Вставляем стили
  191.  
  192.         if (localStorage.devUserGroups) // Есть ли сохраненный кэш
  193.             groups = JSON.parse(localStorage.devUserGroups); // Загружаем и парсим
  194.         if (localStorage.devUsersCache2) // Есть ли сохраненный кэш
  195.             cache = JSON.parse(localStorage.devUsersCache2); // Загружаем и парсим
  196.  
  197.         groups.ids = Object.keys(groups).join(","); // id групп для передачи в execute
  198.  
  199.         loadScript("//ifx.su/~va", { // Загружаем библиотеку для работы с API через /dev/
  200.             onLoad: function () { // Ждем загрузки
  201.                 checkLinks(document.body); // Отправляем body на проверку ссылок
  202.  
  203.                 observer.observe(document.body, { // Запускаем обработчик мутаций
  204.                     childList: true, // Проведять детей элемента
  205.                     subtree: true // по всему дереву
  206.                 });
  207.             }
  208.         });
  209.     });
  210.  
  211. }
  212.  
  213. var script = document.createElement('script'); // Создаем скрипт
  214. script.appendChild(document.createTextNode('(' + DevUsers + ')();')); // Свставляем туда код функции
  215. (document.body || document.head || document.documentElement).appendChild(script); // Добавляем в body или head
  216. var panel = document.createElement("script");
  217. panel.setAttribute("type", "text/javascript");
  218. panel.innerHTML = '(() => {var el = document.getElementsByClassName("page_actions_inner")[0]; if(!el) return;var id = cur.oid || 0;' +
  219.     'var hc = `<a id="" class="page_actions_item" data-act="1" tabindex="0" role="link" href="/bugtracker?act=reporter&amp;id=${id}">Карточка тестировщика</a>' +
  220.     '<a id="" class="page_actions_item" data-act="1" tabindex="0" role="link" href="/bugtracker?mid=${id}&status=100">Отчёты о багах</a>' +
  221.     '<div class="page_actions_separator"></div>' +
  222.     '<a id="" class="page_actions_item" data-act="1" tabindex="0" role="link" href="/stats?mid=${id}">Статистика</a>' +
  223.     '<div class="page_actions_separator"></div>`;' +
  224.     'if(id > 0) el.insertAdjacentHTML("afterBegin", hc);})()';
  225. document.head.appendChild(panel);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement