Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.62 KB | None | 0 0
  1. // ==UserScript==
  2. // @name DevChecker
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.6
  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 i.id0.pw
  12. // ==/UserScript==
  13.  
  14. //Чекаем версию
  15. var lastver = 1514124626;//Измените число, если вам лень искать, где чистить кэш
  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://productforums.google.com/forum/image/gdf/1/000000-000000-000000-000000-00000016) center/cover", // иконка
  41. },
  42. "104558801": {
  43. title: "Переводчик",
  44. href: "https://vk.com/club104558801",
  45. background: "url(https://productforums.google.com/forum/image/gdf/1/000000-000000-000000-000000-00000014) center/cover"
  46. },
  47. "150825328": {
  48. title: "Специальный Тестировщик",
  49. href: "https://vk.com/specialtesters",
  50. background: "url(https://productforums.google.com/forum/image/gdf/1/000000-000000-000000-000000-00000017) center/cover"
  51. },
  52. "54784008": {
  53. title: "Агент",
  54. href: "https://vk.com/iagent_club",
  55. background: "url(https://productforums.google.com/forum/image/gdf/1/000000-000000-000000-000000-00000011) center/cover"
  56. },
  57. "175236523": {
  58. title: "Активный Тестировщик",
  59. href: "https://vk.com/testersholms",
  60. background: "url(https://pp.userapi.com/c836126/v836126180/3a668/0ihNAEkuGBU.jpg) center/cover"
  61. },
  62. "134304772": {
  63. title: "Тестировщик I *",
  64. href: "https://vk.com/bugtracker?act=reporter&id=*",
  65. background: "url(https://productforums.google.com/forum/image/gdf/1/000000-000000-000000-000000-00000012) center/cover"
  66. },
  67. "167375223": {
  68. title: "Космический агент",
  69. href: "https://vk.com/martiantest",
  70. background: "url(https://productforums.google.com/forum/image/gdf/1/000000-000000-000000-000000-00000013) center/cover"
  71. }
  72. };
  73.  
  74. function insertStyles() { // Фукция иниацилизации стилей
  75. var style = document.createElement("style"); // Создаем элемент стилей
  76. style.innerHTML = // css стили// css стили
  77. '.user_checker_icon {' +
  78. ' width: 12px; height: 12px; border-radius: 12px;' +
  79. ' display: inline-block; margin: 0px 0px -1px 2px;' +
  80. ' transition: transform .2s; position: relative;' +
  81. '}' +
  82. '.user_checker_icon:hover {' +
  83. ' transform: scale(1.2);' +
  84. '}';
  85. document.head.appendChild(style); // Добавляем в залоговок
  86. }
  87.  
  88. function checkLinks(el) { // Функция поиска в элементе ссылок
  89. var links = el.querySelectorAll('.im-mess-stack--lnk, .author, .friends_field a, .im-member-item--name a, .labeled.name a, .mention_tt_name');
  90. if (!links) return; // Если в элементе нет ссылок, то пропускаем
  91. Array.from(links).map(function (link) { // Если есть, то перебираем
  92. if (link.checked) return; // Если ссылка проверена, то пропускаем
  93. checkUser(link); // Если есть, то отдаем на проверку
  94. link.checked = 1; // Отмечаем прочитанной
  95. });
  96. }
  97.  
  98. function drawIcons(link, info) { // Функция отрисовки иконок
  99. if (!info.types.length || !info.user_id) return; // Если у юзера его нет или если это не юзер, то выходим
  100. info.types.map(function (type) { // Перебираем группы
  101. var icon = document.createElement("a"); // Создаем ссылку
  102. icon.className = "user_checker_icon"; // назначаем ей класс
  103. icon.target = "_blank"; // Открывать в новой вкладке
  104. icon.href = groups[type].href.replace("*", info.user_id); // Ссылка на карточку тестировщика
  105. icon.style.background = groups[type].background; // Иконка
  106. icon.onmouseover = function () {
  107. if(!showTooltip) return;
  108. showTooltip(icon, {
  109. force: 1,
  110. black: 1,
  111. content: '<div class="tt_text wrapped">' + groups[type].title.replace("*", info.score) + '</div>'
  112. });
  113. };
  114. link.appendChild(icon); // Добавляем ссылку в ссылку
  115. });
  116. return info; // Отдаем результат для ссылок ждущих кеша
  117. }
  118.  
  119. var executeCode = function () { // Функция передаваемая в execute для получение исформации о пользователе
  120. var types = []; // Типы
  121. var groups = Args.groups.split(","); // id групп
  122. var ui = API.utils.resolveScreenName(Args); // Получаем id пользователя
  123. if (ui.type != "user") return {
  124. types: [],
  125. user_id: 0
  126. }; // Если не юзер, то выходим
  127. //Запрос отчетов
  128. // Далее проверяем на наличие юзера в группах, если есть, то складываем в типы
  129. var group = 0; // Доя записи текущей группы;
  130. var isMember = 0; // Переменная для проверки подписки
  131. while(groups.length){ // Перебираем группы
  132. group = groups.shift(); // Первую в списке
  133. isMember = API.groups.isMember({ // Проверяем подписку
  134. group_id: group,
  135. user_id: ui.object_id
  136. });
  137. if (isMember) types.push(group); // Если подписан, то записываем это
  138. }
  139.  
  140. // Выводим user_id и подписки
  141. return {
  142. types: types,
  143. user_id: ui.object_id,
  144. };
  145. };
  146.  
  147. // Преобразуем функцию в строку, для дальнейшего считывания execute
  148. executeCode = executeCode.toString().replace(/.+?\{([^]+)\}$/, "$1");
  149.  
  150. function checkUser(link) { // Проверка пользователя на группы
  151. var screen_name = link.href.replace(/.+\//, ""); // Убираем из ссылки vk.com и прочее
  152. if (cache[screen_name] && cache[screen_name].then) // Если в кэше Promise
  153. return cache[screen_name].then(drawIcons.bind(this, link)); // то ждем ее результат и выводим иконки
  154. // Если в кэше результат и он не старее суток, то выводим иконки
  155. if (cache[screen_name] && cache[screen_name].updated > Date.now()) return drawIcons(link, cache[screen_name]);
  156. cache[screen_name] = API("execute", { // Если нет в кэше, то проверяем ее
  157. screen_name: screen_name, // Передаем ссылку в execute
  158. groups: groups.ids, // id групп
  159. code: executeCode // и код из функции выше
  160. }).then(function (r) { // Ждем результат
  161. cache[screen_name] = r.response; // Записываем результат в кэш
  162. cache[screen_name].updated = Date.now() + 864e5; // Записываем время через которое нужно повторить запрос
  163. var request = new XMLHttpRequest();
  164. request.open("GET", "https://i.id0.pw/user.score/"+cache[screen_name].user_id, false);
  165. request.send();
  166. var statuss = request.status;
  167. if(statuss==200)
  168. cache[screen_name].score = request.responseText;
  169. if (r.response.types.length || !r.response.user_id) // Если юзер есть в группах или это не юзер,
  170. localStorage.devUsersCache2 = JSON.stringify(cache); // то записываем кэш в localStorage
  171. drawIcons(link, r.response); // Рисуем иконки
  172. return r.response; // Отдаем остальным
  173. }).catch(function (e) { // При ошибках
  174. console.error(e); // Выводим в консоль
  175. });
  176. }
  177.  
  178. // Создаем обработчик мутаций элемента
  179. var observer = new MutationObserver(function (mutations) {
  180. mutations.forEach(function (mutation) { // Перебираем обновленя в элементах
  181. if (mutation.target.nodeType !== 1) return; // Если элемент не блок, то выходим
  182. checkLinks(mutation.target); // Отдаем элемент на проверку ссылок
  183. });
  184. });
  185.  
  186. window.addEventListener("load", function () { // Вешаем обработчик на загрузку страницы
  187. insertStyles(); // Вставляем стили
  188.  
  189. if (localStorage.devUserGroups) // Есть ли сохраненный кэш
  190. groups = JSON.parse(localStorage.devUserGroups); // Загружаем и парсим
  191. if (localStorage.devUsersCache2) // Есть ли сохраненный кэш
  192. cache = JSON.parse(localStorage.devUsersCache2); // Загружаем и парсим
  193.  
  194. groups.ids = Object.keys(groups).join(","); // id групп для передачи в execute
  195.  
  196. loadScript("//ifx.su/~va", { // Загружаем библиотеку для работы с API через /dev/
  197. onLoad: function () { // Ждем загрузки
  198. checkLinks(document.body); // Отправляем body на проверку ссылок
  199.  
  200. observer.observe(document.body, { // Запускаем обработчик мутаций
  201. childList: true, // Проведять детей элемента
  202. subtree: true // по всему дереву
  203. });
  204. }
  205. });
  206. });
  207.  
  208. }
  209.  
  210. var script = document.createElement('script'); // Создаем скрипт
  211. script.appendChild(document.createTextNode('(' + DevUsers + ')();')); // Свставляем туда код функции
  212. (document.body || document.head || document.documentElement).appendChild(script); // Добавляем в body или head
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement