- // ==UserScript==
- // @name DTF.ru. Show me avatars (NEW)
- // @namespace https://github.com/TentacleTenticals
- // @match https://dtf.ru/*
- // @grant none
- // @version 1.0
- // @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|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),
- 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();
- img.src = s.target.style.backgroundImage.replace(/.+(http.+)\/-\/scale.+/, '$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/)){
- 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;
- }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){
- new A({
- name: searches[i].name,
- searchUrl: searches[i].url,
- targetUrl: hovered.style.backgroundImage.replace(/.+(http.+)\/-\/scale.+/, '$1'),
- elem: menu
- });
- }
- }
- }
- }else
- if(s.target.classList.value.match(mainFilter) && button1Pressed && button2Pressed && !button3Pressed){
- hovered = s.target;
- navigator.clipboard.writeText(s.target.style.backgroundImage.replace(/.+(http.+)\/-\/scale.+/, '$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|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();
- }
- }
- ///
- }
- })();