您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Hides the channel list at the press of a button
当前为
// ==UserScript== // @name Discord Hide Channel List Button // @namespace http://tampermonkey.net/ // @version 0.8.2 // @description Hides the channel list at the press of a button // @author 20kdc // @match https://discordapp.com/* // @match https://discord.com/* // @grant none // ==/UserScript== // I release this user-script into the public domain. // Enables the new button location. var buttonLocation0p6 = true; var buttonProperWrap = buttonLocation0p6; // Since iterating through the entire DOM would be performance suicide, // let's try to detect classes in ANY OTHER WAY. var dragonequus; dragonequus = { version: 4, getAllClassesLen: 0, getAllClassesCache: [], getAllClasses: function () { var sheets = document.styleSheets; if (sheets.length == dragonequus.getAllClassesLen) { return dragonequus.getAllClassesCache; } var workspace = []; var seen = {}; for (var k = 0; k < sheets.length; k++) { var sheet = sheets[k]; for (var k2 = 0; k2 < sheet.cssRules.length; k2++) { var rule = sheet.cssRules[k2]; if (rule.type == CSSRule.STYLE_RULE) { // .A:I .B:I, .A .B var majors = rule.selectorText.split(","); for (var k3 = 0; k3 < majors.length; k3++) { var minors = majors[k3].split(" "); for (var k4 = 0; k4 < minors.length; k4++) { // Minor starts off as say .A:B var minor = minors[k4]; // Must be class if (!minor.startsWith(".")) continue; // Cut off any : and remove . var selectorBreak = minor.indexOf(":"); if (selectorBreak != -1) { minor = minor.substring(1, selectorBreak); } else { minor = minor.substring(1); } if (seen[minor]) continue; seen[minor] = true; workspace.push(minor); } } } } } dragonequus.getAllClassesLen = sheets.length; dragonequus.getAllClassesCache = workspace; return workspace; }, isValidDC: function (obfuscated, real) { if (!obfuscated.startsWith(real + "-")) return false; if (obfuscated.length != real.length + 7) return false; return true; }, findAllByDiscordClass: function (name) { var q = []; var q2 = document.querySelectorAll("." + name); for (var k2 = 0; k2 < q2.length; k2++) q.push(q2[k2]); var classes = dragonequus.getAllClasses(); for (var k in classes) { var n = classes[k]; if (dragonequus.isValidDC(n, name)) { q2 = document.querySelectorAll("." + n); for (var k2 = 0; k2 < q2.length; k2++) q.push(q2[k2]); } } return q; }, findByDiscordClass: function (name) { var all = dragonequus.findAllByDiscordClass(name); if (all.length > 0) return all[0]; return null; }, toDiscordClass: function (name) { var classes = dragonequus.getAllClasses(); for (var k in classes) { var n = classes[k]; if (dragonequus.isValidDC(n, name)) return n; } return name; } }; var findParent, performAppend; if (buttonLocation0p6) { // New behavior as per given feedback. findParent = function () { const vChat = dragonequus.findByDiscordClass("unreadMentionsIndicatorTop").parentNode.childNodes[1].firstChild; if (!vChat) return null; return vChat; }; performAppend = function (a, b) { a.insertBefore(b, a.childNodes[1]); }; } else { // Older behavior that may be better for some people. findParent = function () { const vChat = dragonequus.findByDiscordClass("chat"); if (!vChat) return null; return vChat.firstChild.firstChild.lastChild; }; performAppend = function (a, b) { a.appendChild(b); }; } var mainFunc; var lastTryParent; mainFunc = function() { 'use strict'; // Toolbar instance tends to change setTimeout(mainFunc, 5000); const bParent = findParent(); if (!bParent) return; if (lastTryParent == bParent) return; lastTryParent = bParent; // Create & append button const d = document.createElement("img"); d.draggable = false; d.src = "/assets/a860a4e9c04e5cc2c8c48ebf51f7ed46.svg"; // Unscalable, but Discord does it too d.width = 24; d.height = 24; var button = d; if (buttonProperWrap) { button = document.createElement("div"); button.type = "div"; // Make it a div, listItem & clickable, which makes it similar to other Discord buttons button.className = dragonequus.toDiscordClass("listItem") + " " + dragonequus.toDiscordClass("clickable"); button.appendChild(d); } performAppend(bParent, button); var toggleState = true; button.addEventListener("click", () => { const v2a = dragonequus.findByDiscordClass("chat"); if (!v2a) return; const v2 = v2a.parentNode.firstChild; toggleState = !toggleState; if (toggleState) { v2.style.display = "inherit"; } else { v2.style.display = "none"; } }); }; mainFunc();