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.20250318110102
  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 queue display with clear button
  18. queueDisplay = document.createElement('div');
  19. queueDisplay.style.position = 'fixed';
  20. queueDisplay.style.bottom = '100px';
  21. queueDisplay.style.right = '20px';
  22. queueDisplay.style.background = 'rgba(0,0,0,0.7)';
  23. queueDisplay.style.color = 'white';
  24. queueDisplay.style.padding = '5px 10px';
  25. queueDisplay.style.borderRadius = '4px';
  26. queueDisplay.style.display = 'flex';
  27. queueDisplay.style.gap = '8px';
  28. queueDisplay.style.alignItems = 'center';
  29.  
  30. const text = document.createElement('span');
  31. text.textContent = `Queue: ${queueCount}`;
  32. const clearBtn = document.createElement('button');
  33. clearBtn.textContent = '×';
  34. clearBtn.style.cursor = 'pointer';
  35. clearBtn.style.background = 'transparent';
  36. clearBtn.style.border = 'none';
  37. clearBtn.style.color = 'inherit';
  38. clearBtn.style.fontSize = '18px';
  39. clearBtn.style.padding = '0 4px';
  40. clearBtn.onclick = () => {
  41. queueCount = 0;
  42. text.textContent = `Queue: ${queueCount}`;
  43. };
  44.  
  45. queueDisplay.appendChild(text);
  46. queueDisplay.appendChild(clearBtn);
  47. document.body.appendChild(queueDisplay);
  48. }
  49.  
  50. // Rest of the original script remains unchanged
  51. function handleSendButton() {
  52. const sendButton = document.querySelector('[data-testid="send-button"]');
  53. if (sendButton && queueCount > 0) {
  54. sendButton.click();
  55. queueCount--;
  56. queueDisplay.querySelector('span').textContent = `Queue: ${queueCount}`;
  57. }
  58. }
  59.  
  60. const textareaObserver = new MutationObserver(() => {
  61. const textarea = document.getElementById('prompt-textarea');
  62. if (textarea && !textarea.dataset.queueEnabled) {
  63. textarea.dataset.queueEnabled = 'true';
  64. textarea.addEventListener('keydown', (e) => {
  65. if (e.key === 'Enter' && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
  66. if (document.querySelector('[data-testid="stop-button"]')) {
  67. e.preventDefault();
  68. queueCount++;
  69. queueDisplay.querySelector('span').textContent = `Queue: ${queueCount}`;
  70. if (!queueObserver) {
  71. queueObserver = new MutationObserver(handleSendButton);
  72. queueObserver.observe(document.body, {
  73. childList: true,
  74. subtree: true
  75. });
  76. }
  77. }
  78. }
  79. });
  80. }
  81. });
  82.  
  83. // Initialize
  84. createQueueDisplay();
  85. textareaObserver.observe(document.body, {
  86. childList: true,
  87. subtree: true
  88. });
  89. })();