Advertisement
Guest User

Untitled

a guest
Apr 24th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         DevChecker
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.5
  5. // @description  Check Developers and testers in vk.com! Editor SevereCloud
  6. // @copyright 2017, flyink13 (https://openuserjs.org/users/flyink13)
  7. // @license MIT
  8. // @author       Flyink13
  9. // @match        https://vk.com/*
  10. // @grant        GM_xmlhttpRequest
  11. // @connect      itnull.severecloud.me
  12. // ==/UserScript==
  13.  
  14. //Чекаем версию
  15. var lastver = 321;//Измените число, если вам лень искать, где чистить кэш
  16. if (localStorage.devUsersVer){
  17.     var ver = JSON.parse(localStorage.devUsersVer);
  18.     ClearCache();
  19.     localStorage.devUsersVer = lastver;
  20. } else
  21.     ClearCache();
  22.  
  23. function ClearCache(){//Чистим кэш
  24.     if (localStorage.devUsersCache2){
  25.         localStorage.removeItem("devUsersCache2");
  26.         localStorage.devUsersVer = lastver;
  27.         console.log('clearCache');
  28.     }
  29. }
  30.  
  31.  
  32. function DevUsers() {
  33.  
  34.     var cache = {}; // Кэш
  35.     var groups = { // Настройки
  36.         "9713780": { // id групп
  37.             title: "Разработчик", // Подсказки
  38.             href: "https://vk.com/devclub", // Ссылки * - id юзера
  39.             background: "url(https://pp.userapi.com/c619526/v619526550/1ab9e/21AneyV7dPc.jpg) center/cover", // иконка
  40.         },
  41.         "150825328": {
  42.             title: "Special Forces",
  43.             href: "https://vk.com/specialtesters",
  44.             background: "url(https://pp.userapi.com/c637621/v637621394/59591/XWk69t0P1Iw.jpg) center/cover"
  45.         },
  46.         "158726194": {
  47.             title: "Один дома",
  48.             href: "https://vk.com/club158726194",
  49.             background: "url(https://pp.userapi.com/c831208/v831208300/1993e/ugyzKSzAMf4.jpg) center/cover"
  50.         },
  51.         "134304772": {
  52.             title: "Тестер (*)",
  53.             href: "https://vk.com/bugtracker?act=reporter&id=*",
  54.             background: "url(https://pp.userapi.com/c639625/v639625391/42408/zj0kpTaIKiI.jpg) center/cover"
  55.         },
  56.         "150532800": {
  57.             title: "Bots VK",
  58.             href: "https://vk.com/crbotsvk",
  59.             background: "url(https://pp.userapi.com/c841338/v841338142/46c58/ncKAvZbSuMw.jpg) center/cover"
  60.         },
  61.         "133366272": {
  62.             title: "Robochat",
  63.             href: "https://vk.com/robochatio",
  64.             background: "url(https://pp.userapi.com/c636128/v636128517/84fc6/cOzdLq5ci3Y.jpg) center/cover"
  65.         },
  66.         "137700079": {
  67.             title: "Groupcloud",
  68.             href: "https://vk.com/servicegroupcloud",
  69.             background: "url(https://pp.userapi.com/c637326/v637326583/2e546/5H6jhsuhJNs.jpg) center/cover"
  70.         },
  71.         "143033562": {
  72.             title: "Zveno",
  73.             href: "https://vk.com/zvenobot",
  74.             background: "url(https://pp.userapi.com/c636927/v636927753/582e7/xzsr9-uriYc.jpg) center/cover"
  75.         },
  76.         "151500402": {
  77.             title: "Ubots",
  78.             href: "https://vk.com/ubotsru",
  79.             background: "url(https://pp.userapi.com/c639618/v639618325/3b674/Yoe00Y2-tzY.jpg) center/cover"
  80.         },
  81.         "126527125": {
  82.             title: "Bot VK",
  83.             href: "https://vk.com/botvkgq",
  84.             background: "url(https://pp.userapi.com/c639126/v639126608/588a9/GSUA-AIIFuM.jpg) center/cover"
  85.         },
  86.         "147015595": {
  87.             title: "CreateBot",
  88.             href: "https://vk.com/createbotml",
  89.             background: "url(https://pp.userapi.com/c840231/v840231198/3dfe/drpPZzjNNpg.jpg) center/cover"
  90.         }
  91.     };
  92.  
  93.     function insertStyles() { // Фукция иниацилизации стилей
  94.         var style = document.createElement("style"); // Создаем элемент стилей
  95.         style.innerHTML = // css стили// css стили
  96.             '.user_checker_icon {' +
  97.             '   width: 12px; height: 12px; border-radius: 12px;' +
  98.             '   display: inline-block;  margin: 0px 0px -1px 2px;' +
  99.             '   transition: transform .2s; position: relative;' +
  100.             '}' +
  101.             '.user_checker_icon:hover {' +
  102.             '    transform: scale(1.2);' +
  103.             '}';
  104.         document.head.appendChild(style); // Добавляем в залоговок
  105.     }
  106.  
  107.     function checkLinks(el) { // Функция поиска в элементе ссылок
  108.         var links = el.querySelectorAll('.im-mess-stack--lnk, .group_l_title, .author, .friends_field a, .im-member-item--name a, .labeled.name a, .mention_tt_name, .im-page--title-main-inner, .bp_author, .mem_link');
  109.         if (!links) return; // Если в элементе нет ссылок, то пропускаем
  110.         Array.from(links).map(function (link) { // Если есть, то перебираем
  111.             if (link.checked) return; // Если ссылка проверена, то пропускаем
  112.             checkUser(link); // Если есть, то отдаем на проверку
  113.             link.checked = 1; // Отмечаем прочитанной
  114.         });
  115.     }
  116.  
  117.     function drawIcons(link, info) { // Функция отрисовки иконок
  118.         if (!info.types.length || !info.user_id) return; // Если у юзера его нет или если это не юзер, то выходим
  119.         info.types.map(function (type) { // Перебираем группы
  120.             var icon = document.createElement("a"); // Создаем ссылку
  121.             icon.className = "user_checker_icon"; // назначаем ей класс
  122.             icon.target = "_blank"; // Открывать в новой вкладке
  123.             icon.href = groups[type].href.replace("*", info.user_id); // Ссылка на карточку тестировщика
  124.             icon.style.background = groups[type].background; // Иконка
  125.             icon.onmouseover = function () {
  126.                 if(!showTooltip) return;
  127.                 showTooltip(icon, {
  128.                     force: 1,
  129.                     black: 1,
  130.                     content: '<div class="tt_text wrapped">' + groups[type].title.replace("*", info.score) + '</div>'
  131.                 });
  132.             };
  133.             link.appendChild(icon); // Добавляем ссылку в ссылку
  134.         });
  135.         return info; // Отдаем результат для ссылок ждущих кеша
  136.     }
  137.  
  138.     var executeCode = function () { // Функция передаваемая в execute для получение исформации о пользователе
  139.         var types = []; // Типы
  140.         var groups = Args.groups.split(","); // id групп
  141.         var ui = API.utils.resolveScreenName(Args); // Получаем id пользователя
  142.         if (ui.type != "user") return { // Если не юзер, то выходим
  143.             types: [],
  144.             user_id: 0
  145.         };
  146.         //Запрос отчетов
  147.         // Далее проверяем на наличие юзера в группах, если есть, то складываем в типы
  148.         var group = 0; // Доя записи текущей группы;
  149.         var isMember = 0; // Переменная для проверки подписки
  150.         while(groups.length){ // Перебираем группы
  151.             group = groups.shift(); // Первую в списке
  152.             isMember = API.groups.isMember({ // Проверяем подписку
  153.                 group_id: group,
  154.                 user_id: ui.object_id
  155.             });
  156.             if (isMember) {
  157.                 if(ui.object_id != 206478936) types.push(group);
  158.             }
  159.         }
  160.  
  161.         // Выводим user_id и подписки
  162.         return {
  163.             types: types,
  164.             user_id: ui.object_id,
  165.         };
  166.     };
  167.  
  168.     // Преобразуем функцию в строку, для дальнейшего считывания execute
  169.     executeCode = executeCode.toString().replace(/.+?\{([^]+)\}$/, "$1");
  170.  
  171.     function checkUser(link) { // Проверка пользователя на группы
  172.         var screen_name = link.href.replace(/.+\//, ""); // Убираем из ссылки vk.com и прочее
  173.         if (cache[screen_name] && cache[screen_name].then) // Если в кэше Promise
  174.             return cache[screen_name].then(drawIcons.bind(this, link)); // то ждем ее результат и выводим иконки
  175.         // Если в кэше результат и он не старее суток, то выводим иконки
  176.         if (cache[screen_name] && cache[screen_name].updated > Date.now()) return drawIcons(link, cache[screen_name]);
  177.         cache[screen_name] = API("execute", { // Если нет в кэше, то проверяем ее
  178.             screen_name: screen_name, // Передаем ссылку в execute
  179.             groups: groups.ids, // id групп
  180.             code: executeCode // и код из функции выше
  181.         }).then(function (r) { // Ждем результат
  182.             cache[screen_name] = r.response; // Записываем результат в кэш
  183.             cache[screen_name].updated = Date.now() + 864e5; // Записываем время через которое нужно повторить запрос
  184.             var request = new XMLHttpRequest();
  185.             request.open("GET", "https://itnull.severecloud.me/user.score/"+cache[screen_name].user_id, false);
  186.             request.send();
  187.             var statuss = request.status;
  188.             if(statuss==200)
  189.                 cache[screen_name].score = request.responseText;
  190.             if (r.response.types.length || !r.response.user_id) // Если юзер есть в группах или это не юзер,
  191.                 localStorage.devUsersCache2 = JSON.stringify(cache); // то записываем кэш в localStorage
  192.             drawIcons(link, r.response); // Рисуем иконки
  193.             return r.response; // Отдаем остальным
  194.         }).catch(function (e) { // При ошибках
  195.             console.error(e); // Выводим в консоль
  196.         });
  197.     }
  198.  
  199.     // Создаем обработчик мутаций элемента
  200.     var observer = new MutationObserver(function (mutations) {
  201.         mutations.forEach(function (mutation) { // Перебираем обновленя в элементах
  202.             if (mutation.target.nodeType !== 1) return; // Если элемент не блок, то выходим
  203.             checkLinks(mutation.target); // Отдаем элемент на проверку ссылок
  204.         });
  205.     });
  206.  
  207.     window.addEventListener("load", function () { // Вешаем обработчик на загрузку страницы
  208.         insertStyles(); // Вставляем стили
  209.  
  210.         if (localStorage.devUserGroups) // Есть ли сохраненный кэш
  211.             groups = JSON.parse(localStorage.devUserGroups); // Загружаем и парсим
  212.         if (localStorage.devUsersCache2) // Есть ли сохраненный кэш
  213.             cache = JSON.parse(localStorage.devUsersCache2); // Загружаем и парсим
  214.  
  215.         groups.ids = Object.keys(groups).join(","); // id групп для передачи в execute
  216.  
  217.         loadScript("//ifx.su/~va", { // Загружаем библиотеку для работы с API через /dev/
  218.             onLoad: function () { // Ждем загрузки
  219.                 checkLinks(document.body); // Отправляем body на проверку ссылок
  220.  
  221.                 observer.observe(document.body, { // Запускаем обработчик мутаций
  222.                     childList: true, // Проведять детей элемента
  223.                     subtree: true // по всему дереву
  224.                 });
  225.             }
  226.         });
  227.     });
  228.  
  229. }
  230.  
  231. var script = document.createElement('script'); // Создаем скрипт
  232. script.appendChild(document.createTextNode('(' + DevUsers + ')();')); // Свставляем туда код функции
  233. (document.body || document.head || document.documentElement).appendChild(script); // Добавляем в body или head
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement