您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Avoid accidentally typing in chat
// ==UserScript== // @name Disable Discord chat input // @namespace https://github.com/Dragosarus/Userscripts/ // @version 4.1 // @description Avoid accidentally typing in chat // @author Dragosarus // @match http://discord.com/* // @match https://discord.com/* // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM.setValue // @grant GM.getValue // @require http://code.jquery.com/jquery-latest.js // ==/UserScript== // NOTE: Does not work with Greasemonkey as it neither supports GM_registerMenuCommand nor GM_unregisterMenuCommand. // Use Tampermonkey or Violentmonkey instead. (function() { 'use strict'; var persist = true; // Remember selected mode across page refreshes and browser reloads // Modes (use menu to cycle between these): // "hover": Enable chat input only when the cursor is hovering over it // "strict": Disables chat input completely // "off": Keep chat input enabled. var modes = ["hover", "strict", "off"]; var menuShortcut = 'm'; var modeIndex; var menuId; const channelObserver = new MutationObserver(channelObserverCallback); const serverObserver = new MutationObserver(serverObserverCallback); const options = {childList:true, attributes:true}; init(); async function init() { // Will activate the mode of the next index (default: hover) const modeIndex_default = modes.length - 1; // Load stored value if available and persist is set to true if (persist) { var storedMode = await GM.getValue("mode", "hover"); modeIndex = modes.indexOf(storedMode); if (modeIndex != -1) { modeIndex = (modeIndex - 1) % modes.length; } else { // Mode does not exist modeIndex = modeIndex_default; } } else { modeIndex = modeIndex_default; } start(); } function start(){ switchMode(); addObserver(serverObserver,"div[class*='content-']"); serverObserverCallback(); // Init } function serverObserverCallback(mutationList, observer) { // When changing servers //console.log("server callback"); addObserver(channelObserver,"div[class*='chat-']", disable); addHoverFunc(); } function channelObserverCallback(mutationList, observer) { // When changing channels //console.log("channel callback"); disable(); addHoverFunc(); } function addObserver(observer, query, onSuccess = function(){}) { var q = $(query); if (!q.length) { setTimeout(function(){addObserver(observer, query, onSuccess)},100);} else { observer.observe(q[0], options); onSuccess(); } } function switchMode() { modeIndex = (modeIndex + 1) % modes.length; if (persist) {GM.setValue("mode",modes[modeIndex]);} GM_unregisterMenuCommand(menuId); menuId = GM_registerMenuCommand("Switch mode [current: " + modes[modeIndex] + "]", switchMode, menuShortcut); switch (modes[modeIndex]){ case "hover": case "strict": disable(); break; case "off": enable(); break; default: console.error("Disable Discord chat input: Unimplemented mode."); break; } } function disable() { if (modes[modeIndex] != "off") { //console.log("disabled!"); var textareaQuery = $("div[class*='slateTextArea']"); if (textareaQuery.length) { textareaQuery.attr("contenteditable","false"); textareaQuery[0].style.removeProperty("-webkit-user-modify"); // Needed for Chrome textareaQuery.parent().parent()[0].style.setProperty("pointer-events","none"); // Disable mouse events } else { setTimeout(disable, 100); } } } function enable() { var textareaQuery = $("div[class*='slateTextArea']"); if (textareaQuery.length) { textareaQuery.attr("contenteditable","true"); textareaQuery[0].style.setProperty("-webkit-user-modify", "read-write-plaintext-only"); textareaQuery.parent().parent()[0].style.removeProperty("pointer-events"); } else { setTimeout(enable, 100); } } function addHoverFunc() { var textareaQuery = $("div[class*='scrollableContainer']"); if (textareaQuery.length) { textareaQuery.hover(hoverEnter, hoverExit); } else { setTimeout(addHoverFunc, 100); } } function hoverEnter() { if (modes[modeIndex] == "hover"){ enable(); } } function hoverExit() { if (modes[modeIndex] == "hover"){ disable(); } } })(); /*eslint-env jquery*/ // stop eslint from showing "'$' is not defined" warnings