// ==UserScript== // @name Auto Regenerate on Server Busy (DeepSeek) // @name:ar مُجَدِّد ديب سيك (DeepSeek Regenerator) // @namespace Violentmonkey Scripts // @version 1.5 // @description Automatically regenerates messages on DeepSeek when the server is busy. // @description:ar سكربت مدعوم بالذكاء الاصطناعي لتحسين تجربة المستخدم على ديب سيك من خلال التجديد التلقائي، واكتشاف الأخطاء، والمحاولات الذكية. // @author Ezio Auditore // @license MIT // @icon https://i.imgur.com/3RqMFdM.png // @match https://chat.deepseek.com/* // @grant none // @downloadURL https://update.greasyfork.icu/scripts/527233/Auto%20Regenerate%20on%20Server%20Busy%20%28DeepSeek%29.user.js // @updateURL https://update.greasyfork.icu/scripts/527233/Auto%20Regenerate%20on%20Server%20Busy%20%28DeepSeek%29.meta.js // ==/UserScript== (function () { "use strict"; // ----------------------- // Configuration Settings // ----------------------- // This XPath query checks for a

element that contains either the English or Chinese busy message. const BUSY_MESSAGE_XPATH = `//p[contains(text(), "The server is busy. Please try again later.") or contains(text(), "服务器繁忙")]`; const REGENERATE_SVG_ID = "重新生成"; // The id of the element within the regenerate button const DEBOUNCE_DELAY = 500; // Debounce delay in milliseconds const CLICK_COOLDOWN = 3000; // Minimum interval between clicks (in ms) const POLLING_INTERVAL = 3000; // Fallback polling interval (in ms) const DEBUG = true; // Set to false to disable debug logging // ----------------------- // Internal State Variables // ----------------------- let lastClickTime = 0; let debounceTimer = null; // ----------------------- // Utility: Debug Logging // ----------------------- function log(...args) { if (DEBUG) { console.log("[AutoRegenerate]", ...args); } } // ----------------------- // Core: Check for Busy Message & Click Regenerate // ----------------------- function checkForServerBusy() { log("Checking for busy message..."); // Use XPath to locate a

element that contains either the English or Chinese busy message. const busyMessage = document.evaluate( BUSY_MESSAGE_XPATH, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; if (busyMessage) { log("Busy message detected:", busyMessage.textContent); // Enforce click cooldown to prevent rapid, repeated clicks. const now = Date.now(); if (now - lastClickTime < CLICK_COOLDOWN) { log("Click cooldown active; skipping click."); return; } // Locate the regenerate button by finding the element with the specified id. const regenerateSvg = document.querySelector( `rect[id="${REGENERATE_SVG_ID}"]` ); if (regenerateSvg) { const buttonElement = regenerateSvg.closest("div.ds-icon-button"); if (buttonElement) { log("Regenerate button found. Clicking..."); buttonElement.click(); lastClickTime = now; log("Clicked regenerate button."); } else { console.error( "Regenerate button container (div.ds-icon-button) not found." ); } } else { console.error( "Regenerate SVG element not found with id:", REGENERATE_SVG_ID ); } } else { log("No busy message detected."); } } // ----------------------- // Debounce Wrapper // ----------------------- function debouncedCheck() { if (debounceTimer) clearTimeout(debounceTimer); debounceTimer = setTimeout(checkForServerBusy, DEBOUNCE_DELAY); } // ----------------------- // MutationObserver Setup // ----------------------- const observer = new MutationObserver((mutations) => { debouncedCheck(); }); function startObserver() { if (document.body) { observer.observe(document.body, { childList: true, subtree: true }); log("MutationObserver started on document.body."); } else { document.addEventListener("DOMContentLoaded", () => { observer.observe(document.body, { childList: true, subtree: true }); log("MutationObserver started after DOMContentLoaded."); }); } } // ----------------------- // Fallback Polling // ----------------------- function startPolling() { setInterval(checkForServerBusy, POLLING_INTERVAL); log("Fallback polling started (every", POLLING_INTERVAL, "ms)."); } // ----------------------- // Initialization // ----------------------- function init() { startObserver(); startPolling(); // Also perform an initial check once the window loads. window.addEventListener("load", checkForServerBusy); } init(); })();