DeepSeek Auto-Retry with Text & SVG Detection

Auto retry when server busy detected by text or SVG icon, with toggle UI and cooldown.

// ==UserScript==
// @name         DeepSeek Auto-Retry with Text & SVG Detection
// @version      1.6
// @description  Auto retry when server busy detected by text or SVG icon, with toggle UI and cooldown.
// @author       balkken
// @match        https://chat.deepseek.com/*
// @grant        none
// @license      Blakken 
// @namespace https://greatest.deepsurf.us/users/1477546
// ==/UserScript==

(function () {
  "use strict";

  const config = {
    autoRetryEnabled: true,
    cooldown: 15000, // 15 sec entre clics
  };

  function showStatus(msg) {
    let el = document.getElementById("autoRetryStatus");
    if (!el) {
      el = document.createElement("div");
      el.id = "autoRetryStatus";
      el.style.position = "fixed";
      el.style.bottom = "100px";
      el.style.right = "20px";
      el.style.backgroundColor = "rgba(0,0,0,0.7)";
      el.style.color = "white";
      el.style.padding = "6px 12px";
      el.style.borderRadius = "6px";
      el.style.zIndex = "9999";
      document.body.appendChild(el);
    }
    el.textContent = msg;
    setTimeout(() => {
      if (el.textContent === msg) el.textContent = "";
    }, 3000);
  }

  function findRetryButton() {
    const buttons = document.querySelectorAll('div[role="button"]');
    for (const btn of buttons) {
      const path = btn.querySelector('svg path');
      if (!path) continue;

      const d = path.getAttribute("d") || "";
      if (d.startsWith("M1.27209")) {
        return btn;
      }
    }
    return null;
  }

  function checkAndRetry() {
    if (!config.autoRetryEnabled) return;

    const now = Date.now();
    if (window.lastRetryTime && now - window.lastRetryTime < config.cooldown) {
      const remaining = Math.round((config.cooldown - (now - window.lastRetryTime)) / 1000);
      showStatus(`AutoRetry: cooldown (${remaining}s)`);
      return;
    }

    const retryBtn = findRetryButton();
    if (retryBtn) {
      retryBtn.click();
      window.lastRetryTime = now;
      showStatus("AutoRetry: clicked Retry (SVG)");
      console.log("AutoRetry: Retry clicked", retryBtn);
    }
  }

  function createToggleUI() {
    const container = document.createElement("div");
    container.style.position = "fixed";
    container.style.bottom = "70px";
    container.style.right = "20px";
    container.style.zIndex = "9999";
    container.style.backgroundColor = "rgba(0,0,0,0.6)";
    container.style.padding = "8px 12px";
    container.style.borderRadius = "8px";
    container.style.color = "white";
    container.style.fontFamily = "Arial, sans-serif";
    container.style.fontSize = "14px";
    container.style.userSelect = "none";

    container.innerHTML = `
      <label style="cursor: pointer;">
        <input type="checkbox" id="autoRetryCheckbox" checked style="margin-right:6px;">
        Auto‑Retry
      </label>
    `;
    document.body.appendChild(container);

    document.getElementById("autoRetryCheckbox").addEventListener("change", e => {
      config.autoRetryEnabled = e.target.checked;
      showStatus(`Auto‑Retry ${config.autoRetryEnabled ? "ON" : "OFF"}`);
    });
  }

  function init() {
    createToggleUI();
    setInterval(checkAndRetry, 1000); // toutes les secondes
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", init);
  } else {
    init();
  }
})();