// ==UserScript== // @name Discord: Hide Image // @name:zh-TW Discord 隱藏圖片 // @name:zh-CN Discord 隐藏图片 // @name:ja Discord 画像を非表示 // @name:ko Discord 이미지 숨기기 // @name:ru Discord Скрыть изображение // @version 1.0.9 // @description Make images opacity lower. // @description:zh-TW 使圖片較為透明。 // @description:zh-CN 使图片较为透明。 // @description:ja 画像の不透明度を低くします。 // @description:ko 이미지의 불투명도를 낮추십시오. // @description:ru Уменьшите непрозрачность изображений. // @author Hayao-Gai // @namespace https://github.com/HayaoGai // @icon https://i.imgur.com/rE9N0R7.png // @match https://discord.com/channels/* // @grant GM_getValue // @grant GM_setValue // @downloadURL https://update.greasyfork.cloud/scripts/402647/Discord%3A%20Hide%20Image.user.js // @updateURL https://update.greasyfork.cloud/scripts/402647/Discord%3A%20Hide%20Image.meta.js // ==/UserScript== /* jshint esversion: 6 */ (function() { 'use strict'; // icons made by https://www.flaticon.com/authors/pixel-perfect const iconOn = ``; const iconOff = ``; // css const textStyle = ` .hide-set { transition: opacity 0.3s; } .switch-set { fill: white; text-align: center; bottom: 10px; cursor: pointer; pointer-events: all; }`; // target const targets = [ "img:not(.icon-27yU2q)", // all images. "video", // all videos ( gifs ). ".animatedContainer-1pJv5C", // the image on top of server channel lists. ".avatarContainer-2inGBK", // the avatar images in channels. ".icon-27yU2q" // discord server icons. ]; // update let updating = false; css(); init(10); locationChange(); window.addEventListener("scroll", update, true); function init(times) { for (let i = 0; i < times; i++) { // switch setTimeout(switchButton, 500 * i); // hide for (const target of targets) { setTimeout(() => hideTarget(target), 500 * i); } } // show showTarget(); } function switchButton() { // check exist const isExist = document.querySelector(".switch-set"); if (!!isExist) return; // left panel ( parent ) const leftPanel = document.querySelector("nav"); if (!leftPanel) return; // add switch button const button = document.createElement("div"); button.className = "unreadMentionsIndicatorBottom-BXS58x switch-set"; button.innerHTML = getToggle() ? iconOn : iconOff; button.addEventListener("click", onClick); leftPanel.appendChild(button); } function onClick() { const afterClick = !getToggle(); GM_setValue("switch", afterClick); this.innerHTML = afterClick ? iconOn : iconOff; init(3); } function hideTarget(target) { // check toggle if (!getToggle()) return; // hide target document.querySelectorAll(`${target}:not(.hide-set)`).forEach(t => { t.classList.add("hide-set"); t.style.opacity = 0.1; t.addEventListener("mouseenter", addListener); t.addEventListener("mouseleave", addListener); }); } function showTarget() { // check toggle if (getToggle()) return; // show target document.querySelectorAll(".hide-set").forEach(t => { t.classList.remove("hide-set"); t.style.opacity = 1; t.removeEventListener("mouseenter", addListener); t.removeEventListener("mouseleave", addListener); }); } function getToggle() { return GM_getValue("switch", true); } function addListener() { this.style.opacity = this.style.opacity > 0.5 ? 0.1 : 1; } function update() { if (updating) return; updating = true; init(3); setTimeout(() => { updating = false; }, 1000); } function css() { const style = document.createElement("style"); style.type = "text/css"; style.innerHTML = textStyle; document.head.appendChild(style); } function locationChange() { window.addEventListener('locationchange', () => init(10)); // situation 1 history.pushState = (f => function pushState(){ var ret = f.apply(this, arguments); window.dispatchEvent(new Event('pushState')); window.dispatchEvent(new Event('locationchange')); return ret; })(history.pushState); // situation 2 history.replaceState = (f => function replaceState(){ var ret = f.apply(this, arguments); window.dispatchEvent(new Event('replaceState')); window.dispatchEvent(new Event('locationchange')); return ret; })(history.replaceState); // situation 3 window.addEventListener('popstate', () => window.dispatchEvent(new Event('locationchange'))); } })();