Hide Discord sidebars

Give the chat more screen space

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

  1. // ==UserScript==
  2. // @name Hide Discord sidebars
  3. // @namespace https://github.com/Dragosarus/Userscripts/
  4. // @version 2.0
  5. // @description Give the chat more screen space
  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. var hide = {
  16. serverSidebar : true,
  17. channelSidebar: true,
  18. memberSidebar : true // also adds 2nd button
  19. };
  20.  
  21. var serverSelector = "nav[aria-label='Servers sidebar']";
  22. var channelSelector = "div[class*='sidebar']";
  23. var memberSelector = "div[class*='membersWrap']";
  24. var baseSelector = "div[class*='base']"; // needed when hiding server sidebar
  25. var chatSelector = "div[class*='chat']"; // needed for observer
  26.  
  27. var hideMenu = "Hide sidebars";
  28. var showMenu = "Show sidebars";
  29. var memberToggleMenu = "Toggle member sidebar"; // + " [current: (in)visible]"
  30. var hideSidebarMenuShortcut = 's';
  31. var memberToggleMenuShortcut = 't';
  32.  
  33. var hideSidebarMenuId;
  34. var memberToggleMenuId;
  35. var baseOffset; // e.g. "72px"
  36.  
  37. var sidebarsHidden = false;
  38. var memberSidebarHidden = false; // overrides sidebarsHidden
  39. var selectors = {
  40. serverSidebar: serverSelector,
  41. channelSidebar: channelSelector,
  42. memberSidebar: memberSelector
  43. };
  44.  
  45. const memberObserver = new MutationObserver(memberObserverCallback);
  46. const options = {attributes:true, childList:true};
  47.  
  48. init();
  49.  
  50. function init() {
  51. updateMemberToggleMenu(); // if hide.memberSidebar == true
  52. updateHideSidebarMenu();
  53. }
  54.  
  55. // Called when switching servers/channels
  56. function memberObserverCallback() {
  57. setSidebar(memberSelector, !memberSidebarHidden);
  58. }
  59.  
  60. function onMemberToggleMenuClick() {
  61. // (re-)activate observer
  62. memberObserver.observe($(chatSelector)[0], options);
  63.  
  64. if (!(sidebarsHidden)) {
  65. setSidebar(memberSelector, memberSidebarHidden);
  66. }
  67. memberSidebarHidden ^= true;
  68.  
  69. // Update menus (both of them to preserve order)
  70. updateMemberToggleMenu();
  71. updateHideSidebarMenu();
  72. }
  73.  
  74. function onHideSidebarMenuClick() {
  75. // Toggle visibility of sidebars
  76. for (var sidebar in selectors) {
  77. // hideMemberSidebar = memberSidebarHidden || sidebarsHidden
  78. if (sidebar == "memberSidebar" && memberSidebarHidden) {continue;}
  79.  
  80. if (hide[sidebar]) {
  81. setSidebar(selectors[sidebar], sidebarsHidden);
  82. }
  83. }
  84.  
  85. // Extra work is needed to properly hide the server sidebar
  86. if (hide.serverSidebar) {
  87. var base = $(baseSelector);
  88. if (sidebarsHidden) {
  89. base.css("left", baseOffset);
  90. } else {
  91. baseOffset = base[0].style.left;
  92. base.css("left", "0px");
  93. }
  94. }
  95. sidebarsHidden ^= true;
  96.  
  97. // Update menu
  98. updateHideSidebarMenu();
  99. }
  100.  
  101. function updateMemberToggleMenu() {
  102. if (hide.memberSidebar) {
  103. GM_unregisterMenuCommand(memberToggleMenuId);
  104. var v = memberSidebarHidden ? "in" : "";
  105. memberToggleMenuId = GM_registerMenuCommand(memberToggleMenu + " [current: " + v + "visible]",
  106. onMemberToggleMenuClick, memberToggleMenuShortcut);
  107. }
  108. }
  109.  
  110. function updateHideSidebarMenu() {
  111. GM_unregisterMenuCommand(hideSidebarMenuId);
  112. var menu = sidebarsHidden ? showMenu : hideMenu;
  113. hideSidebarMenuId = GM_registerMenuCommand(menu, onHideSidebarMenuClick, hideSidebarMenuShortcut);
  114. }
  115.  
  116. function setSidebar(selector, boolValue) {
  117. if (boolValue) {
  118. showSidebar(selector);
  119. } else {
  120. hideSidebar(selector);
  121. }
  122. }
  123.  
  124. function hideSidebar(selector) {
  125. var node = $(selector)[0];
  126. node.style.display = "none";
  127. }
  128.  
  129. function showSidebar(selector) {
  130. var node = $(selector)[0];
  131. node.style.removeProperty("display");
  132. }
  133.  
  134. })();
  135. /*eslint-env jquery*/ // stop eslint from showing "'$' is not defined" warnings