// ==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')));
}
})();