DTF.ru. Show me avatars.

Показ аватарок пользователей, а также копирование ссылки на аватарку. Курсор на аватарку и Ctrl для её показа, или Ctrl+Shift для копирования URL ссылки в буфер обмена.

  1. // ==UserScript==
  2. // @name DTF.ru. Show me avatars.
  3. // @namespace Violentmonkey Scripts
  4. // @match https://dtf.ru/*
  5. // @grant none
  6. // @version 1.2.1
  7. // @author Tentacle Tenticals
  8. // @description Показ аватарок пользователей, а также копирование ссылки на аватарку. Курсор на аватарку и Ctrl для её показа, или Ctrl+Shift для копирования URL ссылки в буфер обмена.
  9. // @homepage https://github.com/TentacleTenticals/DTF-showAvatar
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. /* jshint esversion:6 */
  14.  
  15. (function() {
  16. 'use strict';
  17.  
  18. window.addEventListener('load', run)
  19.  
  20. function run(){
  21. console.log('Loaded!');
  22. let mainFilter = new RegExp(`comment__avatar|content-header-author__avatar|subsite-card__avatar|v-header__cover|v-header-avatar|${document.querySelector("div[class='layout__right-column'] div[style^='background-image").className}`),
  23. commentsRightBarFilter = new RegExp(document.querySelector("div[class='layout__right-column'] div[style^='background-image").className),
  24. ctrlPressed, cPressed, shiftPressed, hovered,
  25. // Настройки максимального размера превью аватарки
  26. userAvatarSize = '400px', // Аватарка пользователя (комментарий)
  27. userProfileCoverSizeWidth = '990px', // Обложка пользователя в профиле (длина)
  28. userProfileCoverSizeHeight = '400px', // Обложка пользователя в профиле (ширина)
  29. userProfileAvatarSize = '400px', // Аватар пользователя в профиле
  30. authorAvatarSizeHeader = '400px', // Аватарка подсайта статьи (хеадер)
  31. authorAvatarSizeFooter = '400px', // Аватарка автора статьи (футер)
  32. userAvatarSizeCommentsPanel = '250px'; // Аватарка пользователя (боковая панель комментариев, aka "live-список" комментариев к статьям)
  33. document.addEventListener('mouseover', hover, true);
  34. function hover(s){
  35. /* Аватарка пользователя в комментарии / Аватарка автора статьи в хеадере (шапке) / Аватарка автора статьи в футере (конце статьи) /
  36. Аватарка пользователя в комментарии в 'live-списке' комментариев справа */
  37. if(s.target.classList.value.match(mainFilter) && !ctrlPressed && !shiftPressed) {
  38. hovered = s.target;
  39. }else
  40. if(s.target.classList.value.match(mainFilter) && ctrlPressed && !shiftPressed){
  41. hovered = s.target;
  42. if(!document.querySelector(`div[class='avatar-preview']`)){
  43. let img = new Image();
  44. img.src = s.target.style.backgroundImage.replace(/.+(http.+)\/-\/scale.+/, '$1');
  45. let avatarPreview = document.createElement('div');
  46. avatarPreview.className = 'avatar-preview';
  47. avatarPreview.style.position = 'fixed';
  48. avatarPreview.style.zIndex = '1000';
  49. if(s.target.classList.value.match(/comment__avatar/)){
  50. avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 20}px`;
  51. avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 40}px`;
  52. img.style.maxWidth = userAvatarSize;
  53. img.style.maxHeight = userAvatarSize;
  54. }else
  55. if(s.target.classList.value.match(/v-header-avatar/)){
  56. avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 170}px`
  57. avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 20}px`
  58. img.style.maxWidth = userProfileAvatarSize;
  59. img.style.maxHeight = userProfileAvatarSize;
  60. }else
  61. if(s.target.classList.value.match(/v-header__cover/)){
  62. avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 300}px`
  63. avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 0}px`
  64. img.style.maxWidth = userProfileCoverSizeWidth;
  65. img.style.maxHeight = userProfileCoverSizeHeight;
  66. }else
  67. if(s.target.classList.value.match(/content-header-author__avatar/)){
  68. avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 25}px`;
  69. avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 40}px`;
  70. img.style.maxWidth = authorAvatarSizeHeader;
  71. img.style.maxHeight = authorAvatarSizeHeader;
  72. }else
  73. if(s.target.classList.value.match(/subsite-card__avatar/)){
  74. avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 35}px`;
  75. avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 50}px`;
  76. img.style.maxWidth = authorAvatarSizeFooter;
  77. img.style.maxHeight = authorAvatarSizeFooter;
  78. }else
  79. if(s.target.classList.value.match(commentsRightBarFilter)){
  80. avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 25}px`;
  81. avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 30}px`;
  82. img.style.maxWidth = userAvatarSizeCommentsPanel;
  83. img.style.maxHeight = userAvatarSizeCommentsPanel;
  84. }
  85. img.style.borderRadius = '3px';
  86. img.style.backgroundColor = 'rgb(0, 0, 0)';
  87. img.style.boxShadow = '0px 0px 6px 2px black';
  88. s.target.parentNode.appendChild(avatarPreview);
  89. document.querySelector(`div[class='avatar-preview']`).appendChild(img);
  90. }
  91. }else
  92. if(s.target.classList.value.match(mainFilter) && ctrlPressed && shiftPressed){
  93. hovered = s.target;
  94. navigator.clipboard.writeText(s.target.style.backgroundImage.replace(/.+(http.+)\/-\/scale.+/, '$1'));
  95. if(!document.querySelector(`div[class='avatar-link-copyed']`)){
  96. let alert = document.createElement('div');
  97. alert.className = 'avatar-link-copyed';
  98. alert.textContent = 'Ссылка на аватарку успешно скопирована';
  99. alert.style.position = 'fixed';
  100. alert.style.zIndex = '1000';
  101. if(s.target.classList.value.match(/v-header-avatar|v-header__cover/)){
  102. alert.style.top = `${s.target.getBoundingClientRect().top + 300}px`;
  103. alert.style.left = `${s.target.getBoundingClientRect().left + 0}px`;
  104. }else
  105. if(s.target.classList.value.match(/comment__avatar|content-header-author__avatar|subsite-card__avatar/)){
  106. alert.style.top = `${s.target.getBoundingClientRect().top - 25}px`;
  107. alert.style.left = `${s.target.getBoundingClientRect().left + 20}px`;
  108. }else
  109. if(s.target.classList.value.match(commentsRightBarFilter))
  110. {
  111. alert.style.top = `${s.target.getBoundingClientRect().top - 25}px`;
  112. alert.style.left = `${s.target.getBoundingClientRect().left + 20}px`;
  113. }else
  114. {
  115. alert.style.top = `${s.target.getBoundingClientRect().top + 300}px`;
  116. alert.style.left = `${s.target.getBoundingClientRect().left + 0}px`;
  117. }
  118. alert.style.background = 'rgb(165 235 189)';
  119. alert.style.borderRadius = '3px';
  120. alert.style.padding = '3px';
  121. alert.style.color = 'rgb(0 0 0)';
  122. alert.style.fontSize = '12px';
  123. alert.style.lineHeight = '12px';
  124. alert.style.fontWeight = '500';
  125. alert.style.boxShadow = '0px 0px 6px 1px black';
  126. s.target.parentNode.appendChild(alert);
  127. setTimeout(() => {
  128. if(document.querySelector(`div[class='avatar-link-copyed']`)){
  129. document.querySelector(`div[class='avatar-link-copyed']`).remove();
  130. }
  131. }, 2000);
  132. }
  133. }else
  134. if(!s.target.classList.value.match(mainFilter) && ctrlPressed && !shiftPressed){
  135. hovered = false;
  136. if(document.querySelector(`div[class='avatar-preview']`)){
  137. document.querySelector(`div[class='avatar-preview']`).remove();
  138. }
  139. }else
  140. if(!s.target.classList.value.match(mainFilter) && ctrlPressed && !shiftPressed){
  141. hovered = false;
  142. if(document.querySelector(`div[class='avatar-preview']`)){
  143. document.querySelector(`div[class='avatar-preview']`).remove();
  144. }
  145. }else
  146. if(!s.target.classList.value.match(mainFilter) && !ctrlPressed && !shiftPressed){
  147. hovered = false;
  148. }
  149. }
  150. document.addEventListener('keydown', kDown, true)
  151. function kDown(s){
  152. if(s.code === 'ControlLeft'||s.code === 'ControlRight'){
  153. ctrlPressed = true;
  154. if(hovered){
  155. hovered.dispatchEvent(new MouseEvent('mouseover', {
  156. view: window,
  157. bubbles: true,
  158. cancelable: true
  159. }));
  160. }
  161. }else
  162. if(s.code === 'ShiftLeft'||s.code === 'ShiftRight'){
  163. shiftPressed = true;
  164. if(hovered){
  165. hovered.dispatchEvent(new MouseEvent('mouseover', {
  166. view: window,
  167. bubbles: true,
  168. cancelable: true
  169. }));
  170. }
  171. }
  172. }
  173. document.addEventListener('keyup', kUp, true)
  174. function kUp(s){
  175. if(s.code === 'ControlLeft'||s.code === 'ControlRight'){
  176. ctrlPressed = false;
  177. }else
  178. if(s.code === 'ShiftLeft'||s.code === 'ShiftRight'){
  179. shiftPressed = false;
  180. }
  181. if(document.querySelector(`div[class='avatar-preview']`)){
  182. document.querySelector(`div[class='avatar-preview']`).remove();
  183. }
  184. }
  185. }
  186. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址