BetterChatGPT

ChatGPT but better!

  1. // ==UserScript==
  2. // @name BetterChatGPT
  3. // @namespace https://github.com/optionsx
  4. // @version 1.3.8
  5. // @author https://github.com/optionsx
  6. // @description ChatGPT but better!
  7. // @grant GM_setClipboard
  8. // @grant GM_cookie
  9. // @grant GM_addStyle
  10. // @run-at document-idle
  11. // @match https://chat.openai.com/*
  12. // @icon https://www.google.com/s2/favicons?sz=64&domain=openai.com
  13. // @license MIT
  14. // ==/UserScript==
  15. // check out TheTerrasque extension: https://github.com/TheTerrasque/chatgpt-firefox-extension
  16. if (localStorage.getItem('capacityCounter') === null) localStorage.setItem('capacityCounter', 0)
  17. // access while down functionality...
  18. if (document.getElementsByClassName("text-3xl font-medium").length > 0) {
  19. localStorage.setItem('capacityCounter', parseInt(localStorage.getItem('capacityCounter')) + 1)
  20. if (parseInt(localStorage.getItem('capacityCounter')) > 8) {
  21. localStorage.setItem('capacityCounter', 0)
  22. alert("after 8 attempts, the server still down. now trying bypass approach...");
  23.  
  24. return window.location.href = "https://chatlogin.angryman.repl.co/bypass";
  25. }
  26. window.location.href = "https://chat.openai.com/";
  27. }
  28. document.addEventListener("keydown", function (event) {
  29. if (event.key === " " && event.ctrlKey) {
  30. GM_cookie.list(
  31. {
  32. url: this.location.href,
  33. name: "__Secure-next-auth.session-token",
  34. },
  35. (cookie, error) => {
  36. if (!error)
  37. GM_setClipboard(
  38. cookie[0].value,
  39. alert("SessionToken Copied to clipboard!")
  40. );
  41. else console.error(error);
  42. }
  43. );
  44. }
  45. });
  46.  
  47. // sessionExpired? then logout functionality...
  48. (async () => {
  49. try {
  50. if (window.location.href.includes('https://chat.openai.com/auth/login')) return;
  51. const resp = await fetch("https://chat.openai.com/api/auth/session");
  52. console.log(resp.status === 403 ? "Session Expired" : "Session Active");
  53. if (resp?.error !== "RefreshAccessTokenError") return;
  54. changeFavicon("red");
  55. alert("Session Expired. Logging out...");
  56. localStorage.removeItem("__Secure-next-auth.session-token");
  57. window.location.reload();
  58. } catch (e) {
  59. console.log(e);
  60. }
  61. })();
  62.  
  63. // remove server-underload yellow warning func...
  64. const loophole = setInterval(() => {
  65. try {
  66. if (document.querySelector(".toast-root").dataset.state) {
  67. changeFavicon("yellow");
  68. document.querySelector(".toast-root").innerHTML = "";
  69. if (document.querySelector(".toast-root").innerHTML === "")
  70. clearInterval(loophole);
  71. }
  72. } catch { }
  73. }, 0);
  74.  
  75.  
  76. // click login button func...
  77. if (document.querySelectorAll('button').length !== 0 && document.querySelectorAll('button')[0].innerText === "Log in")
  78. document.querySelectorAll('button')[0].click()
  79.  
  80. // if enter key pressed/clicked, check if session expired...
  81. if (document.querySelector("textarea") !== null) {
  82. const triggerPoint = document.querySelector("button.absolute"); // "textarea" for textfield
  83. const inputField = document.querySelector('textarea');
  84.  
  85. triggerPoint.addEventListener("click", detectReload, false);
  86. window.addEventListener('keydown', event => event.keyCode === 13 && detectReload(), true);
  87. triggerPoint.addEventListener("mousemove", () => triggerPoint.focus());
  88. async function detectReload() {
  89. try {
  90. const resp = await fetch("https://chat.openai.com/api/auth/session");
  91. if (window.location.href.includes("https://chat.openai.com/auth/login")) return;
  92. console.log(resp.status === 403 ? "Session Expired" : "Session Active");
  93. if (resp.status !== 403) return "no reload";
  94. const prompt = document.querySelector("textarea");
  95. prompt.focus();
  96. changeFavicon("yellow");
  97. prompt.value.length > 0
  98. ? localStorage.setItem("prompt", prompt.value)
  99. : null;
  100. window.location.reload();
  101. } catch (e) {
  102. console.log(e);
  103. }
  104. }
  105.  
  106.  
  107. // cache prompt func...
  108. const prompt = localStorage.getItem("prompt");
  109. setTimeout(() => {
  110. if (prompt) {
  111. document.querySelector("textarea").value = prompt;
  112. localStorage.removeItem("prompt");
  113. document.querySelector("textarea").focus();
  114. }
  115. }
  116. , 3000);
  117. }
  118. const status = {
  119. yellow:
  120. "https://github.com/TheTerrasque/chatgpt-firefox-extension/blob/master/resources/favicon-32x32-yellow.png?raw=true",
  121. green:
  122. "https://github.com/TheTerrasque/chatgpt-firefox-extension/blob/master/resources/favicon-32x32.png?raw=true",
  123. red: "https://github.com/TheTerrasque/chatgpt-firefox-extension/blob/master/resources/favicon-32x32-red.png?raw=true",
  124. blue: "https://github.com/TheTerrasque/chatgpt-firefox-extension/blob/master/resources/favicon-32x32-blue.png?raw=true",
  125. };
  126.  
  127. // change favicon color func...
  128. const changeFavicon = (color) => {
  129. const icons = document.querySelectorAll("head link[rel='icon']");
  130. for (let i = 0; i < icons.length; i++) {
  131. icons[i].href = status[color];
  132. }
  133. };
  134. // some styling func...
  135. let location = window.location.href;
  136. const color = ["green", "black", "white", "yellow"];
  137. setInterval(() => {
  138. try {
  139. if (
  140. location !== window.location.href &&
  141. window.location.href === "https://chat.openai.com/chat" &&
  142. document.querySelector(".text-gray-800").lastChild.childElementCount !== 0
  143. ) {
  144. location = window.location.href;
  145. document.querySelector("div.px-3").childNodes[1].remove(); // remove blah blah blah text which don't exist in plus version
  146. document.querySelector(".text-gray-800").lastChild.remove(); // unnecessary block of text
  147. const randomColor = color[Math.floor(Math.random() * color.length)];
  148. GM_addStyle(`.text-4xl { color: ${randomColor} !important; }`);
  149.  
  150. document.querySelector(
  151. ".text-4xl"
  152. ).innerHTML = `<a href="https://t.me/NimDev" class="text-4xl font-semibold text-center mt-6 sm:mt-[20vh] ml-auto mr-auto mb-10 sm:mb-16 flex gap-2 items-center justify-center">ChatGPT</a>`;
  153. }
  154. if (
  155. (location !== window.location.href &&
  156. window.location.href === "https://chat.openai.com/chat") ||
  157. document.querySelector("div.px-3").childNodes.length > 1
  158. ) {
  159. location = window.location.href;
  160. const elementsToCopy = document.querySelectorAll("p, ul, ol");
  161. const cacheLength = elementsToCopy.length;
  162. for (let i = 0; i < cacheLength; i++) {
  163. elementsToCopy[i].addEventListener("dblclick", function (e) {
  164. GM_setClipboard(e?.toElement?.parentElement?.outerText) ??
  165. GM_setClipboard(e?.target?.outerText) ??
  166. "";
  167. });
  168. }
  169. document.querySelector("textarea").focus();
  170. console.log("mfr changed path");
  171. if (document.querySelector("div.px-3").childNodes.length > 1)
  172. document.querySelector("div.px-3").childNodes[1].remove(); // remove blah blah blah text which don't exist in plus version
  173. }
  174. } catch { }
  175. }, 100);
  176.  
  177. // custom cursor
  178. GM_addStyle(
  179. `body {cursor: url('data:@file/x-123;base64,AAACAAEAICAAAAAAAACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArADA67AAuN/MAMzyPAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJy3aAAAAPwAAAAAAAAAAAAAAAAA6RagAoL78AMrw/wBtgfYAFRhnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AMzz1AAAAPwAAAAAAAAASAC029gDQ9/8A1///AG2B8gAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wC94f8AMzz1AAAAPwAjKnUAhJz1ANf//wDI7f8AMDnwAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ANf//wC94f8AMzz1AC027gDB5f8A1///AJCs+AAvOIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A1///ANf//wC94f8AhZ74ANf//wDU+/8AMzz3AAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wDX//8A1///ANf//wDX//8A1///AL/j/wAAAP8AAAD/AAAA/wAAAP8AJy3aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ANf//wDX//8A1///ANf//wDX//8A1///ANf//wDX//8AveH/ADM89QAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A1///ANf//wDX//8A1///ANf//wDX//8A1///AL3h/wAzPPUAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wDX//8A1///ANf//wDX//8A1///ANf//wC94f8AMzz1AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ANf//wDX//8A1///ANf//wDX//8AveH/ADM89QAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A1///ANf//wDX//8A1///AL3h/wAzPPUAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wDX//8A1///ANf//wC94f8AMzz1AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ANf//wDX//8AveH/ADM89QAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A1///AL3h/wAzPPUAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wC94f8AMzz1AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ADM89QAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnLdoAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////////////z////4P///OD///xA///8AP///AH///wB///8AD///AA///wAf//8AP///AH///wD///8B////A////wf///8P////H////z////8='), auto; !important;}`
  180. );