ChatGPT Assistant

Bypasses page errors like 'conversation not found' + popup tools + model switcher + resume support after reloads

Versione datata 24/05/2025. Vedi la nuova versione l'ultima versione.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         ChatGPT Assistant
// @namespace    http://tampermonkey.net/
// @version      v1.1
// @description  Bypasses page errors like 'conversation not found' + popup tools + model switcher + resume support after reloads
// @author       dylojestem
// @license This script may be freely shared, but modification is not allowed. All rights reserved by dylojestem.
// @match        https://chatgpt.com/*
// @icon         https://static.vecteezy.com/system/resources/previews/021/608/790/non_2x/chatgpt-logo-chat-gpt-icon-on-black-background-free-vector.jpg
// @grant        none
// ==/UserScript==

(function () {
  const style = document.createElement('style');
  style.textContent = `
    #chatgpt-menu {
      position: fixed;
      top: 0;
      right: -240px;
      width: 240px;
      height: 100%;
      background-color: #111;
      color: white;
      z-index: 10000;
      padding: 20px 10px;
      box-shadow: -2px 0 6px rgba(0,0,0,0.3);
      transition: right 0.3s ease;
      font-family: sans-serif;
      overflow-y: auto;
    }
    #chatgpt-menu.open {
      right: 0;
    }
    #chatgpt-toggle {
      position: fixed;
      bottom: 30px;
      right: 30px;
      z-index: 10001;
      background-color: #000;
      color: white;
      border: none;
      border-radius: 50%;
      width: 42px;
      height: 42px;
      font-size: 20px;
      cursor: pointer;
      box-shadow: 0 2px 6px rgba(0,0,0,0.3);
    }
    #chatgpt-menu button {
      width: 100%;
      margin: 6px 0;
      padding: 8px;
      font-size: 14px;
      border: none;
      border-radius: 6px;
      background-color: #222;
      color: white;
      cursor: pointer;
      transition: background-color 0.2s;
    }
    #chatgpt-menu button:hover {
      background-color: #333;
    }
    #chatgpt-menu .section-title {
      margin: 10px 0 5px;
      font-size: 12px;
      color: #aaa;
      text-transform: uppercase;
    }
    #chatgpt-menu .model-card {
      background-color: #1a1a1a;
      border-radius: 8px;
      padding: 10px;
      margin-bottom: 8px;
      box-shadow: 0 1px 3px rgba(0,0,0,0.4);
    }
    #chatgpt-menu .model-title {
      font-weight: bold;
      color: #fff;
      margin-bottom: 4px;
    }
    #chatgpt-menu .model-desc {
      font-size: 12px;
      color: #ccc;
    }
    #chatgpt-menu .note {
      font-size: 11px;
      color: #999;
      margin-top: 10px;
      padding: 6px;
      border-top: 1px solid #333;
    }
    #chatgpt-header {
      text-align: center;
      font-size: 18px;
      font-weight: bold;
      margin-bottom: 2px;
      user-select: none;
    }
    #chatgpt-subheader {
      text-align: center;
      font-size: 11px;
      color: #888;
      margin-bottom: 12px;
      user-select: none;
    }
    #contact {
    text-decoration: none;
    color: #888;
    transition: color 0.2s ease;
    }
    #contact:hover {
    color: #aaa;
    }
  `;
  document.head.appendChild(style);

  // === ELEMENTY ===
  const menu = document.createElement('div');
  menu.id = 'chatgpt-menu';

  const toggleBtn = document.createElement('button');
  toggleBtn.id = 'chatgpt-toggle';
  toggleBtn.textContent = '☰';

  let popupWindow = null;
  let intervalId = null;
  let isRunning = false;
  let currentModel = '4o';

  const mainButton = document.createElement('button');
  mainButton.textContent = 'Open/Resume ChatGPT';

  const models = ['4o', 'o3', 'o4-mini', 'o4-mini-high', '4.1', '4.1-mini'];
  const modelMap = {
    '4o': 'gpt-4o',
    'o3': 'o3',
    'o4-mini': 'o4-mini',
    'o4-mini-high': 'o4-mini-high',
    '4.1': 'gpt-4-1',
    '4.1-mini': 'gpt-4-1-mini'
  };
  const modelDescriptions = {
    '4o': 'Wspaniałe rozwiązanie do większości zadań',
    'o3': 'Używa zaawansowanego rozumowania',
    'o4-mini': 'Najszybszy w zaawansowanym rozumowaniu',
    'o4-mini-high': 'Świetny w kodowaniu i rozumowaniu wizualnym',
    '4.1': 'Świetny do szybkiego kodowania i analiz',
    '4.1-mini': 'Szybszy przy realizacji codziennych zadań'
  };

  // === HEADER ===
  const header = document.createElement('div');
  header.id = 'chatgpt-header';
  header.textContent = 'ChatGPT Assistant';

  const subheader = document.createElement('div');
  subheader.id = 'chatgpt-subheader';
  subheader.innerHTML = 'Created by <a id="contact" href="https://dylojestem.com/contact" target="_blank">dylojestem</a>';

  menu.appendChild(header);
  menu.appendChild(subheader);

  const popupSectionTitle = document.createElement('div');
  popupSectionTitle.className = 'section-title';
  popupSectionTitle.textContent = 'Assistant';
  menu.appendChild(popupSectionTitle);
  menu.appendChild(mainButton);

  const popupWarning = document.createElement('div');
  popupWarning.className = 'note';
  popupWarning.textContent = "Do not close the popup window – it must stay open for refreshing to work.";
  menu.appendChild(popupWarning);

  const sectionTitle = document.createElement('div');
  sectionTitle.className = 'section-title';
  sectionTitle.textContent = 'Models';
  menu.appendChild(sectionTitle);

  models.forEach(model => {
    const btn = document.createElement('button');
    btn.textContent = model;
    btn.addEventListener('click', () => {
      const urlModel = modelMap[model] || model;
      const baseUrl = window.location.origin + window.location.pathname;
      window.location.href = `${baseUrl}?model=${encodeURIComponent(urlModel)}`;
    });
    menu.appendChild(btn);
  });

  const note = document.createElement('div');
  note.className = 'note';
  note.textContent = "Note: After switching the model, you must click the 'Open/Resume ChatGPT' button again.";
  menu.appendChild(note);

  const descTitle = document.createElement('div');
  descTitle.className = 'section-title';
  descTitle.textContent = 'Model Descriptions';
  menu.appendChild(descTitle);

  models.forEach(model => {
    const card = document.createElement('div');
    card.className = 'model-card';

    const title = document.createElement('div');
    title.className = 'model-title';
    title.textContent = model;

    const desc = document.createElement('div');
    desc.className = 'model-desc';
    desc.textContent = modelDescriptions[model] || 'Brak opisu';

    card.appendChild(title);
    card.appendChild(desc);
    menu.appendChild(card);
  });

  document.body.appendChild(toggleBtn);
  document.body.appendChild(menu);

  // === LOGIKA ===
  toggleBtn.addEventListener('click', () => {
    menu.classList.toggle('open');
  });

  mainButton.addEventListener('click', () => {
    const urlModel = modelMap[currentModel] || currentModel;
    if (!isRunning) {
      const popupWidth = 400;
      const popupHeight = 300;
      const left = Math.floor((window.innerWidth - popupWidth) / 2 + window.screenX);
      const top = Math.floor((window.innerHeight - popupHeight) / 2 + window.screenY);

      popupWindow = window.open(
        `https://chatgpt.com/?model=${urlModel}`,
        'chatgpt_popup',
        `width=${popupWidth},height=${popupHeight},left=${left},top=${top},resizable=no,scrollbars=yes,toolbar=no,menubar=no,status=no`
      );
      intervalId = setInterval(() => {
        if (popupWindow && !popupWindow.closed) {
          popupWindow.location.reload();
        } else {
          clearInterval(intervalId);
          intervalId = null;
          isRunning = false;
          mainButton.textContent = 'Open/Resume ChatGPT';
        }
      }, 5000);
      isRunning = true;
      mainButton.textContent = 'STOP';
    } else {
      if (popupWindow && !popupWindow.closed) popupWindow.close();
      clearInterval(intervalId);
      intervalId = null;
      popupWindow = null;
      isRunning = false;
      mainButton.textContent = 'Open/Resume ChatGPT';
    }
  });
})();