Disable Discord chat input

Avoid accidentally typing in chat

当前为 2020-09-09 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Disable Discord chat input
  3. // @namespace https://github.com/Dragosarus/Userscripts/
  4. // @version 3.0
  5. // @description Avoid accidentally typing in chat
  6. // @author Dragosarus
  7. // @match *discord.com/*
  8. // @grant GM_registerMenuCommand
  9. // @grant GM_unregisterMenuCommand
  10. // @require http://code.jquery.com/jquery-latest.js
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. // Modes (use menu to cycle between these):
  17. // "hover": Enable chat input only when the cursor is hovering over it
  18. // "strict": Disables chat input completely
  19. // "off": Keep chat input enabled.
  20. var modes = ["hover","strict", "off"];
  21. var modeIndex = modes.length-1;
  22. var menuShortcut = 'm';
  23. var menuId;
  24. switchMode(); // default: hover
  25.  
  26. const channelObserver = new MutationObserver(channelObserverCallback);
  27. const serverObserver = new MutationObserver(serverObserverCallback);
  28. const options = {childList:true, attributes:true};
  29. addObserver(serverObserver,"div[class*='content-']");
  30. serverObserverCallback(); // init
  31.  
  32. function serverObserverCallback(mutationList, observer) { // when changing servers
  33. //console.log("server callback");
  34. addObserver(channelObserver,"div[class*='chat-']", disable);
  35. addHoverFunc();
  36. }
  37. function channelObserverCallback(mutationList, observer) { // when changing channels
  38. //console.log("channel callback");
  39. disable();
  40. addHoverFunc();
  41. }
  42.  
  43. function addObserver(observer, query, onSuccess = function(){}) {
  44. var q = $(query);
  45. if (!q.length) { setTimeout(function(){addObserver(observer, query, onSuccess)},100);}
  46. else {
  47. observer.observe(q[0], options);
  48. onSuccess();
  49. }
  50. }
  51.  
  52. function switchMode() {
  53. modeIndex = (modeIndex + 1) % modes.length;
  54. GM_unregisterMenuCommand(menuId);
  55. menuId = GM_registerMenuCommand("Switch mode [current: " + modes[modeIndex] + "]", switchMode, menuShortcut);
  56. switch (modes[modeIndex]){
  57. case "hover":
  58. case "strict":
  59. disable();
  60. break;
  61. case "off":
  62. enable();
  63. break;
  64. }
  65. }
  66.  
  67. function disable() {
  68. if (modes[modeIndex] != "off") {
  69. //console.log("disabled!");
  70. var textareaQuery = $("div[class*='slateTextArea']");
  71. if (textareaQuery.length) {
  72. textareaQuery.attr("contenteditable","false");
  73. textareaQuery[0].style.removeProperty("-webkit-user-modify"); // needed for Chrome
  74. textareaQuery.parent().parent()[0].style.setProperty("pointer-events","none"); // disable mouse events
  75. } else {
  76. setTimeout(disable,100);
  77. }
  78. }
  79. }
  80.  
  81. function enable() {
  82. var textareaQuery = $("div[class*='slateTextArea']");
  83. if (textareaQuery.length) {
  84. textareaQuery.attr("contenteditable","true");
  85. textareaQuery[0].style.setProperty("-webkit-user-modify", "read-write-plaintext-only");
  86. textareaQuery.parent().parent()[0].style.removeProperty("pointer-events");
  87. } else {
  88. setTimeout(enable,100);
  89. }
  90. }
  91.  
  92. function addHoverFunc() {
  93. var textareaQuery = $("div[class*='scrollableContainer']");
  94. if (textareaQuery.length) {
  95. textareaQuery.hover(hoverEnter, hoverExit);
  96. } else {
  97. setTimeout(addHoverFunc,100);
  98. }
  99. }
  100.  
  101. function hoverEnter() {
  102. if (modes[modeIndex] == "hover"){
  103. enable();
  104. }
  105. }
  106.  
  107. function hoverExit() {
  108. if (modes[modeIndex] == "hover"){
  109. disable();
  110. }
  111. }
  112.  
  113. })();