DTF.ru. Show me avatars (NEW)

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        DTF.ru. Show me avatars (NEW)
// @namespace   https://github.com/TentacleTenticals
// @match       https://dtf.ru/*
// @grant       none
// @version     1.1
// @author      Tentacle Tenticals
// @description Показ аватарок пользователей, а также копирование ссылки на аватарку. Курсор на аватарку и Ctrl для её показа, или Ctrl+Shift для копирования URL ссылки в буфер обмена.
// @homepage https://github.com/TentacleTenticals/DTF-showAvatar
// @license MIT
// ==/UserScript==
/* jshint esversion:6 */

(function() {
  'use strict';
  
  window.addEventListener('load', run);
function run(){
  let css = document.createElement('style');
  css.textContent = `
   .searchmenuItem {
     display: block;
     background: white;
     color: black;
     border-radius: 3px;
     text-decoration: unset;
     border: unset;
     padding: 3px 10px 3px 10px;
     width: -webkit-fill-available;
     text-align: center;
     font-size: 12px;
     line-height: 12px;
   }
   .searchmenuItem:hover {
     background: rgb(213, 213, 239);
   }

   .srcSearch {
     min-width: 100px;
     min-height: 100px;
     max-height: 500px;
     background: rgb(45, 5, 66);
     position: fixed;
     display: grid;
     grid-template-columns: repeat(1, auto);
     gap: 4px;
     align-content: center;
     justify-content: center;
     align-items: center;
     justify-items: center;
     padding: 10px;
     border-radius: 3px;
     z-index: 1000;
   }`
  document.body.appendChild(css);

let mainFilter = new RegExp(`comment__avatar__image|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}`),
    commentsRightBarFilter = new RegExp(document.querySelector("div[class='layout__right-column'] div[style^='background-image").className),
    urlFixer = new RegExp(`.*(http[s]{0,1}:\/\/leonardo.osnova.io\/[a-zA-Z0-9-_]+)\/.+`),
    button1Pressed, button2Pressed, button3Pressed, hovered,
    
    // Настройки клавиш. Используйте Control/Shift/Alt/и т.п. НЕ используйте буквы алфавита, цифры, знаки.
    useButton1ForAvatarView = true, // Использовать (true), или не использовать (false) button1 для показа аватарки.
    button1 = 'Control', // Клавиша для показа аватарки.
    button2 = 'Shift', // Клавиша, используемая в сочетании клавиш для копирования URL аватарки в буфер обмена.
    button3 = 'Alt', // Клавиша для показа поискового меню.
    
    // Настройки максимального размера превью аватарки
    userAvatarSize = '400px', // Аватарка пользователя (комментарий).
    userProfileCoverSizeWidth = '990px', // Обложка пользователя в профиле (длина).
    userProfileCoverSizeHeight = '400px', // Обложка пользователя в профиле (ширина).
    userProfileAvatarSize = '400px', // Аватар пользователя в профиле.
    authorAvatarSizeHeader = '400px', // Аватарка подсайта статьи (хеадер).
    authorAvatarSizeFooter = '400px', // Аватарка автора статьи (футер).
    userAvatarSizeCommentsPanel = '250px', // Аватарка пользователя (боковая панель комментариев, aka "live-список" комментариев к статьям).
    
    // Настройка вида превью аватарки
    imageBorderRadius = '3px', // Закругление углов.
    imageBackgroundColor = 'rgba(0, 0, 0, 1)', // Фон превью. Необходим, если аватарка это png и т.п. без фона.
    imageBoxShadow = '0px 0px 6px 2px black', // Тень, оставляемая элементом превью аватарки.
    
    // Список поисковиков, что вы хотите использовать. use:true/false (использовать)/(не использовать).
    // Можно добавить абсолютно любой "поиск по картинкам", главное это получить правильную ссылку для его работы.
    // url: - URL ссылка для работы поиска. name: - как будет называться этот поиск в поисковом меню.
    searches = [
      {url:'http://saucenao.com/search.php?db=999&url=', name:'Saucenao', use:true},
      {url:'https://www.bing.com/images/search?view=detailv2&iss=sbi&FORM=SBIHMP&sbisrc=UrlPaste&q=imgurl:', name:'Bing', use:true},
      {url:'https://www.google.com/searchbyimage?site=search&image_url=', name:'Google', use:true},
      {url:'https://yandex.ru/images/search?rdrnd=296405&rpt=imageview&url=', name:'Yandex', use:true},
      {url:'http://tineye.com/search/?url=', name:'TinEye', use:true},
      {url:'http://iqdb.org/?url=', name:'IQDB', use:true}
    ];

   class A {
    constructor({name, searchUrl, targetUrl, elem}) {
      this.e=document.createElement('a');
      this.e.className=`searchmenuItem`
      this.e.textContent=name
      this.e.href=`${searchUrl}${targetUrl}`
      this.e.target='_blank'
      this.e.onclick = function(s){
        s.preventDefault()
        s.stopImmediatePropagation();
        window.open(s.target.href, '_blank');
      }
      elem.appendChild(this.e);
      return this.e;
    }
  }

  function check(s){
      if(!useButton1ForAvatarView){
          hovered = s.target;
          return (!button1Pressed && !button2Pressed && !button3Pressed);
      }
      if(useButton1ForAvatarView){
          hovered = s.target;
          return (button1Pressed && !button2Pressed && !button3Pressed);
      }
  }
  
  document.addEventListener('mouseover', hover, true);
  function hover(s){
      if(s.target.classList.value.match(mainFilter) && check(s)){
          if(!document.querySelector(`div[class='avatar-preview']`)){
              let img = new Image();
              if(s.target.classList.value.match(commentsRightBarFilter) || s.target.classList.value.match(`subsite-card__avatar|v-header-avatar|v-header__cover`)) img.src = s.target.style.backgroundImage.replace(urlFixer, '$1')
              else img.src = s.target.children[0].src.replace(urlFixer, '$1');
              let avatarPreview = document.createElement('div');
              avatarPreview.className = 'avatar-preview';
              avatarPreview.style.position = 'fixed';
              avatarPreview.style.zIndex = '1000';
          if(s.target.classList.value.match(/comment__avatar__image/)){
              avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 20}px`;
              avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 40}px`;
              img.style.maxWidth = userAvatarSize;
              img.style.maxHeight = userAvatarSize;
              img.style.width = '-webkit-fill-available';
              img.style.height = '-webkit-fill-available';
          }else
          if(s.target.classList.value.match(/v-header-avatar/)){
              avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 170}px`
              avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 20}px`
              img.style.maxWidth = userProfileAvatarSize;
              img.style.maxHeight = userProfileAvatarSize;
          }else
          if(s.target.classList.value.match(/v-header__cover/)){
              avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 300}px`
              avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 0}px`
              img.style.maxWidth = userProfileCoverSizeWidth;
              img.style.maxHeight = userProfileCoverSizeHeight;
          }else
          if(s.target.classList.value.match(/content-header-author__avatar/)){
              avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 25}px`;
              avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 40}px`;
              img.style.maxWidth = authorAvatarSizeHeader;
              img.style.maxHeight = authorAvatarSizeHeader;
          }else
          if(s.target.classList.value.match(/subsite-card__avatar/)){
              avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 35}px`;
              avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 50}px`;
              img.style.maxWidth = authorAvatarSizeFooter;
              img.style.maxHeight = authorAvatarSizeFooter;
          }else
          if(s.target.classList.value.match(commentsRightBarFilter)){
              avatarPreview.style.top = `${s.target.getBoundingClientRect().top + 25}px`;
              avatarPreview.style.left = `${s.target.getBoundingClientRect().left + 30}px`;
              img.style.maxWidth = userAvatarSizeCommentsPanel;
              img.style.maxHeight = userAvatarSizeCommentsPanel;
          }
            img.style.borderRadius = imageBorderRadius;
            img.style.backgroundColor = imageBackgroundColor;
            img.style.boxShadow = imageBoxShadow;
            s.target.parentNode.appendChild(avatarPreview);
            document.querySelector(`div[class='avatar-preview']`).appendChild(img);
          }
      }else
      if(s.target.classList.value.match(mainFilter) && !button1Pressed && !button2Pressed && button3Pressed) {
        if(!document.querySelector(`div[class='srcSearch']`) && hovered){
            console.log('Creating menu...');
            let menu = document.createElement('div');
            menu.className = 'srcSearch';
            if(s.target.classList.value.match(/v-header-avatar/)){
                menu.style.top = `${s.target.getBoundingClientRect().top + 120}px`;
                menu.style.left = `${s.target.getBoundingClientRect().left + 0}px`;
            }else
            {
                menu.style.top = `${s.target.getBoundingClientRect().top + 20}px`;
                menu.style.left = `${s.target.getBoundingClientRect().left + 20}px`;
            }
            hovered.parentNode.appendChild(menu);

            for(let i = 0; i < searches.length; i++){
                if(searches[i].use){
                  if(s.target.classList.value.match(commentsRightBarFilter) || s.target.classList.value.match(`subsite-card__avatar|v-header-avatar|v-header__cover`)) {
                      new A({
                        name: searches[i].name,
                        searchUrl: searches[i].url,
                        targetUrl: hovered.style.backgroundImage.replace(urlFixer, '$1'),
                        elem: menu
                      });
                  }
                  else {
                      new A({
                        name: searches[i].name,
                        searchUrl: searches[i].url,
                        targetUrl: hovered.children[0].src.replace(urlFixer, '$1'),
                        elem: menu
                      });
                       }
                }
            }
        }
      }else
      if(s.target.classList.value.match(mainFilter) && button1Pressed && button2Pressed && !button3Pressed){
        hovered = s.target;
          if(s.target.classList.value.match(commentsRightBarFilter) || s.target.classList.value.match(`subsite-card__avatar|v-header-avatar|v-header__cover`)) navigator.clipboard.writeText(s.target.style.backgroundImage.replace(urlFixer, '$1'))
          else navigator.clipboard.writeText(s.target.children[0].src.replace(urlFixer, '$1'));
          if(!document.querySelector(`div[class='avatar-link-copyed']`)){
          let alert = document.createElement('div');
          alert.className = 'avatar-link-copyed';
          alert.textContent = 'Ссылка на аватарку успешно скопирована';
          alert.style.position = 'fixed';
          alert.style.zIndex = '1000';
          if(s.target.classList.value.match(/v-header-avatar/)){
              alert.style.top = `${s.target.getBoundingClientRect().top + 60}px`;
              alert.style.left = `${s.target.getBoundingClientRect().left + 0}px`;
          }else
          if(s.target.classList.value.match(/v-header__cover/)){
              alert.style.top = `${s.target.getBoundingClientRect().top + 300}px`;
              alert.style.left = `${s.target.getBoundingClientRect().left + 0}px`;
          }else
          if(s.target.classList.value.match(/comment__avatar__image|content-header-author__avatar|subsite-card__avatar/)){
              alert.style.top = `${s.target.getBoundingClientRect().top - 25}px`;
              alert.style.left = `${s.target.getBoundingClientRect().left + 20}px`;
          }else
          if(s.target.classList.value.match(commentsRightBarFilter)){
              alert.style.top = `${s.target.getBoundingClientRect().top - 25}px`;
              alert.style.left = `${s.target.getBoundingClientRect().left + 20}px`;
          }else
          {
              alert.style.top = `${s.target.getBoundingClientRect().top + 300}px`;
              alert.style.left = `${s.target.getBoundingClientRect().left + 0}px`;
          }
          alert.style.background = 'rgb(165 235 189)';
          alert.style.borderRadius = '3px';
          alert.style.padding = '3px';
          alert.style.color = 'rgb(0 0 0)';
          alert.style.fontSize = '12px';
          alert.style.lineHeight = '12px';
          alert.style.fontWeight = '500';
          alert.style.boxShadow = '0px 0px 6px 1px black';
          s.target.parentNode.appendChild(alert);
              setTimeout(() => {
                  if(document.querySelector(`div[class='avatar-link-copyed']`)){
                      document.querySelector(`div[class='avatar-link-copyed']`).remove();
                  }
              }, 2000);
          }
      }else
      if(!s.target.classList.value.match(mainFilter) && button1Pressed && !button2Pressed && !button3Pressed){
        hovered = false;
          if(document.querySelector(`div[class='avatar-preview']`)){
              document.querySelector(`div[class='avatar-preview']`).remove();
          }
      }else
      if(!s.target.classList.value.match(mainFilter) && !button1Pressed && !button2Pressed){
        hovered = false;
          if(!useButton1ForAvatarView){
              if(document.querySelector(`div[class='avatar-preview']`)){
                  document.querySelector(`div[class='avatar-preview']`).remove();
              }
          }
      }
  }
  document.addEventListener('keydown', kDown, true)
  function kDown(s){
      if(s.code === `${button1}Left`||s.code === `${button1}Right`||s.code === `${button1}`){
          button1Pressed = true;
        if(hovered){
          hovered.dispatchEvent(new MouseEvent('mouseover', {
            view: window,
            bubbles: true,
            cancelable: true
          }));
        }
      }else
      if(s.code === `${button2}Left`||s.code === `${button2}Right`||s.code === `${button2}`){
          button2Pressed = true;
          if(hovered){
            hovered.dispatchEvent(new MouseEvent('mouseover', {
              view: window,
              bubbles: true,
              cancelable: true
            }));
          }
      }else
      if(s.code === `${button3}Left`||s.code === `${button3}Right`||s.code === `${button3}`){
          button3Pressed = true;
        if(hovered){
          hovered.dispatchEvent(new MouseEvent('mouseover', {
            view: window,
            bubbles: true,
            cancelable: true
          }));
        }
      }
  }
  document.addEventListener('keyup', kUp, true)
  function kUp(s){
      if(s.code === `${button1}Left`||s.code === `${button1}Right`||s.code === `${button1}`){
          button1Pressed = false;
      }else
      if(s.code === `${button2}Left`||s.code === `${button2}Right`||s.code === `${button2}`){
          button2Pressed = false;
      }else
      if(s.code === `${button3}Left`||s.code === `${button3}Right`||s.code === `${button3}`){
          button3Pressed = false;
          if(document.querySelector(`div[class='srcSearch']`)){
              document.querySelector(`div[class='srcSearch']`).remove();
          }
      }
      if(document.querySelector(`div[class='avatar-preview']`)){
          document.querySelector(`div[class='avatar-preview']`).remove();
      }
  }
  ///
}
})();