ChatGPT Message Queue

Queue messages when ChatGPT is still composing responses

当前为 2025-03-18 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name ChatGPT Message Queue
  3. // @match https://chat.openai.com/*
  4. // @match https://chatgpt.com/*
  5. // @description Queue messages when ChatGPT is still composing responses
  6. // @version 0.0.1.20250318105806
  7. // @namespace https://greasyfork.org/users/1435046
  8. // ==/UserScript==
  9.  
  10. (function() {
  11. 'use strict';
  12. let queueCount = 0;
  13. let queueObserver;
  14. let queueDisplay;
  15.  
  16. function createQueueDisplay() {
  17. // Create basic elements without styling
  18. queueDisplay = document.createElement('div');
  19. const text = document.createElement('span');
  20. text.textContent = `Queue: ${queueCount}`;
  21. const clearBtn = document.createElement('button');
  22. clearBtn.textContent = 'Clear';
  23. clearBtn.onclick = () => {
  24. queueCount = 0;
  25. text.textContent = `Queue: ${queueCount}`;
  26. };
  27.  
  28. queueDisplay.appendChild(text);
  29. queueDisplay.appendChild(clearBtn);
  30. document.body.appendChild(queueDisplay);
  31. }
  32.  
  33. function handleSendButton() {
  34. const sendButton = document.querySelector('[data-testid="send-button"]');
  35. if (sendButton && queueCount > 0) {
  36. sendButton.click();
  37. queueCount--;
  38. queueDisplay.querySelector('span').textContent = `Queue: ${queueCount}`;
  39. }
  40. }
  41.  
  42. const textareaObserver = new MutationObserver(() => {
  43. const textarea = document.getElementById('prompt-textarea');
  44. if (textarea && !textarea.dataset.queueEnabled) {
  45. textarea.dataset.queueEnabled = 'true';
  46. textarea.addEventListener('keydown', (e) => {
  47. if (e.key === 'Enter' && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
  48. if (document.querySelector('[data-testid="stop-button"]')) {
  49. e.preventDefault();
  50. queueCount++;
  51. queueDisplay.querySelector('span').textContent = `Queue: ${queueCount}`;
  52. if (!queueObserver) {
  53. queueObserver = new MutationObserver(handleSendButton);
  54. queueObserver.observe(document.body, {
  55. childList: true,
  56. subtree: true
  57. });
  58. }
  59. }
  60. }
  61. });
  62. }
  63. });
  64.  
  65. // Initialize
  66. createQueueDisplay();
  67. textareaObserver.observe(document.body, {
  68. childList: true,
  69. subtree: true
  70. });
  71. })();