🌺 Clean ChatGPT

Cleaner and better ChatGPT 3.5

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

  1. // ==UserScript==
  2. // @name 🌺 Clean ChatGPT
  3. // @name:pl 🌺 Clean ChatGPT
  4. // @namespace https://greasyfork.org/pl/users/1081704-nameniok
  5. // @version 1.1.7
  6. // @author Nameniok
  7. // @description Cleaner and better ChatGPT 3.5
  8. // @description:pl Czystszy i lepszy ChatGPT 3.5
  9. // @run-at document-start
  10. // @match https://chat.openai.com/
  11. // @grant none
  12. // @license MIT
  13. // ==/UserScript==
  14.  
  15. // Cleaner ui //
  16. function removeElements() {
  17. var elementsToRemove = [
  18. "div.\\!pr-3.group.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.hover\\:bg-token-main-surface-secondary.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.rounded.m-1\\.5.gap-2.flex:nth-of-type(2)",
  19. ".to-gray-900.from-gray-900\\/0.bg-gradient-to-t.h-24",
  20. ".uppercase.rounded-md.md\\:text-sm.text-xs.px-1\\.5.py-0\\.5.text-yellow-900.bg-yellow-200",
  21. ".border-white\\/20.border.flex-shrink-0.mb-1.text-sm.rounded-md.gap-3.items-center.px-3.py-3.flex.kgold",
  22. ".py-3.px-4.bg-gray-900",
  23. "span.uppercase.rounded-md.md\\:text-sm.text-xs.px-1\\.5.py-0\\.5.text-yellow-900.bg-yellow-200",
  24. "#kcg",
  25. ".pt-2.pb-3",
  26. ".space-y-2.flex-col.flex",
  27. ".w-\\[72px\\].h-\\[72px\\].mb-3",
  28. ".font-medium.text-2xl.mb-5",
  29. // Upgrade button
  30. ".px-2.rounded-lg.m-0.hover\\:bg-token-sidebar-surface-secondary.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.gap-2.flex.group",
  31. // Upgrade button on smaller width
  32. "div.\\!pr-3.group.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.hover\\:bg-token-main-surface-secondary.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.rounded.m-1\\.5.gap-2.flex:nth-of-type(2)",
  33. ".justify-center.md\\:gap-2.gap-0.md\\:mb-4.md\\:m-auto.md\\:w-full.ml-1.flex.h-full",
  34. ".text-token-text-tertiary > .mt-2",
  35. ".font-medium.text-2xl.mb-5",
  36. ".md\\:mt-14.relative",
  37. ".pr-1.gap-2.flex",
  38. // Invite members button
  39. ".rounded-lg.hover\\:bg-token-sidebar-surface-secondary.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.gap-2.flex.group",
  40.  
  41. // CLEANER - Chat history not visible with this
  42. //".justify-center.items-center.flex-col.h-full.flex",
  43. //".text-token-text-primary.justify-center.items-center.flex-col.h-full.flex",
  44.  
  45. /*
  46. // MEGA CLEAN
  47. ".ml-2.focus\\:ring-0.border-token-border-medium.border.rounded-lg.whitespace-nowrap.justify-center.items-center.w-9.h-9.flex.btn-small.btn-neutral.relative.btn",
  48. ".bg-token-sidebar-surface-primary.overflow-x-hidden.flex-shrink-0",
  49. ".justify-center.items-center.w-8.h-\\[72px\\].flex",
  50. ".z-40.top-1\\/2.left-0.fixed",
  51. "#headlessui-portal-root > div > div > .relative",
  52. ".active\\:opacity-50.focus\\:ring-white.focus\\:ring-inset.focus\\:ring-2.focus\\:outline-none.hover\\:text-token-text-primary.rounded-md.justify-center.items-center.w-10.h-10.inline-flex.-mt-0\\.5.-ml-0\\.5.left-0.absolute",
  53. */
  54.  
  55. ".md\\:px-\\[60px\\].text-token-text-secondary.text-xs.text-center.py-2.px-2.relative > span"
  56. ];
  57. elementsToRemove.forEach(function(selector) {
  58. var elements = document.querySelectorAll(selector);
  59. elements.forEach(function(element) {
  60. element.remove();
  61. });
  62. });
  63. setTimeout(function() {
  64. observer.disconnect();
  65. }, 5000);
  66. }
  67. function observeDOMChanges() {
  68. var observer = new MutationObserver(function(mutationsList, observer) {
  69. removeElements();
  70. });
  71. observer.observe(document.documentElement, { childList: true, subtree: true });
  72. return observer;
  73. }
  74. var observer = observeDOMChanges();
  75. window.addEventListener('load', function() {
  76. removeElements();
  77. });
  78.  
  79. function removeElements2() {
  80. var elementsToRemove = [
  81. "div.\\!pr-3.group.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.hover\\:bg-token-main-surface-secondary.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.rounded.m-1\\.5.gap-2.flex:nth-of-type(2)",
  82. ".to-gray-900.from-gray-900\\/0.bg-gradient-to-t.h-24",
  83. ".pr-1.gap-2.flex",
  84. // Hide upgrade button
  85. ".px-2.rounded-lg.m-0.hover\\:bg-token-sidebar-surface-secondary.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.gap-2.flex.group",
  86. // Hide upgrade button on smaller width
  87. "div.\\!pr-3.group.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.hover\\:bg-token-main-surface-secondary.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.rounded.m-1\\.5.gap-2.flex:nth-of-type(2)",
  88. ".text-token-text-tertiary > .mt-2",
  89. ".justify-center.md\\:gap-2.gap-0.md\\:mb-4.md\\:m-auto.md\\:w-full.ml-1.flex.h-full",
  90. ".md\\:px-\\[60px\\].text-token-text-secondary.text-xs.text-center.py-2.px-2.relative > span",
  91. ".font-medium.text-2xl.mb-5",
  92. ".md\\:mt-14.relative",
  93. // Invite members button
  94. ".rounded-lg.hover\\:bg-token-sidebar-surface-secondary.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.gap-2.flex.group",
  95.  
  96. // CLEANER - Chat history not visible with this
  97. //".justify-center.items-center.flex-col.h-full.flex",
  98. //".text-token-text-primary.justify-center.items-center.flex-col.h-full.flex",
  99.  
  100. /*
  101. // MEGA CLEAN
  102. ".ml-2.focus\\:ring-0.border-token-border-medium.border.rounded-lg.whitespace-nowrap.justify-center.items-center.w-9.h-9.flex.btn-small.btn-neutral.relative.btn",
  103. ".bg-token-sidebar-surface-primary.overflow-x-hidden.flex-shrink-0",
  104. ".justify-center.items-center.w-8.h-\\[72px\\].flex",
  105. ".z-40.top-1\\/2.left-0.fixed",
  106. "#headlessui-dialog-\\:r1p\\: > .flex.inset-0.fixed",
  107. "#headlessui-portal-root > div > div > .relative",
  108. ".active\\:opacity-50.focus\\:ring-white.focus\\:ring-inset.focus\\:ring-2.focus\\:outline-none.hover\\:text-token-text-primary.rounded-md.justify-center.items-center.w-10.h-10.inline-flex.-mt-0\\.5.-ml-0\\.5.left-0.absolute",
  109. */
  110.  
  111. ".py-3.px-4.bg-gray-900"
  112. ];
  113. elementsToRemove.forEach(function(selector) {
  114. var elements = document.querySelectorAll(selector);
  115. elements.forEach(function(element) {
  116. element.remove();
  117. });
  118. });
  119. }
  120.  
  121. function observeDOMChanges2() {
  122. var observer2 = new MutationObserver(function(mutationsList, observer2) {
  123. mutationsList.forEach(function(mutation) {
  124. if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
  125. var hasTextNodes = Array.from(mutation.addedNodes).some(function(node) {
  126. if (node.nodeType === 3 && node.textContent.trim().length > 0) {
  127. return true;
  128. } else if (node.nodeType === 1 && node.tagName.toLowerCase() === 'p') {
  129. return true;
  130. } else if (node.nodeType === 1 && node.classList) {
  131. var ignoredClasses = ['m-auto', 'md:gap-6', 'text-base', 'justify-center', 'py-2', 'px-4'];
  132. return ignoredClasses.some(function(ignoredClass) {
  133. return node.classList.contains(ignoredClass);
  134. });
  135. }
  136. return false;
  137. });
  138. if (!hasTextNodes) {
  139. removeElements2();
  140. }
  141. }
  142. });
  143. });
  144. observer2.observe(document.documentElement, { childList: true, subtree: true }); // subtree: false - for better optimization but inaccurate
  145. return observer2;
  146. }
  147. var observer2 = observeDOMChanges2();
  148. window.addEventListener('load', function() {
  149. removeElements2();
  150. });
  151.  
  152.  
  153. // Auto continue //
  154. let Observer;
  155. (async () => {
  156. Observer = new MutationObserver(mutations =>
  157. mutations.forEach(mutation => {
  158. if (mutation.attributeName == 'style' && mutation.target.style.opacity == '1') {
  159. document.querySelectorAll('button').forEach(button => {
  160. if (button.textContent.includes('Continue generating')) {
  161. button.click();
  162. console.log("Auto generating");
  163. }
  164. });
  165. }
  166. })
  167. );
  168. Observer.observe(document.querySelector('body'), { attributes: true, subtree: true });
  169. })();