EZ GPT

Load chats and save chats easily

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name         EZ GPT
// @namespace    http://tampermonkey.net/
// @version      1.01
// @description  Load chats and save chats easily
// @author       @theyhoppingonme on discord
// @match        https://chatgpt.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=chatgpt.com
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    // code is pretty much junk, i made it quickly but it works
    const jsonIsChatName = false; // set this to true if you want the JSON files to be saved with the names of the chats
    // Wait for page to load
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

    // Hide saved messages
    setInterval(function() {
        if (document.location.href != "https://chatgpt.com/") {
        const savedMsg = localStorage.getItem('savedmsg');

        if (savedMsg && savedMsg !== 'undefined') {
            try {
                const savedArray = JSON.parse(savedMsg);
                const messageElements = document.querySelectorAll('div[data-message-id]');

                messageElements.forEach(el => {
                    if (savedArray.includes(el.getAttribute('data-message-id'))) {
                        const targetEl = el.parentElement?.parentElement?.parentElement?.parentElement;
                        if (targetEl) {
                            targetEl.hidden = true;
                        }
                    }
                });
            } catch (e) {
                console.error('Error parsing savedmsg:', e);
            }
        }
        }
    }, 100); // Changed from 1ms to 100ms for better performance

    function isValid(jsonString) {
        try {
            JSON.parse(jsonString);
            return true;
        } catch (e) {
            return false;
        }
    }

    function init() {
        // Load chat functionality
        if (localStorage.sigma !== undefined && isValid(localStorage.sigma)) {
            setTimeout(function() {
                const doc = document.querySelector("div#prompt-textarea");
                if (doc) {
                    // Show loading overlay
                    const overlay = document.createElement("div");
                    Object.assign(overlay.style, {
                        position: "fixed",
                        top: "0",
                        left: "0",
                        width: "100%",
                        height: "100%",
                        backgroundColor: "black",
                        display: "flex",
                        alignItems: "center",
                        justifyContent: "center",
                        color: "white",
                        fontSize: "2em",
                        zIndex: "9999"
                    });
                    overlay.textContent = "Loading...";
                    document.body.appendChild(overlay);

                    setTimeout(() => {
                        if (overlay.parentElement) {
                            document.body.removeChild(overlay);
                        }
                    }, 1000);

                    const search = `${localStorage.sigma}`;
                    doc.innerHTML = `<p hidden="true">${search}</p>`;

                    setTimeout(function() {
                        const submitBtn = document.querySelector("button#composer-submit-button");
                        if (submitBtn) {
                            submitBtn.click();
                            localStorage.removeItem("sigma");

                            let done = false;
                            const interval = setInterval(function() {
                                document.querySelectorAll('div.whitespace-pre-wrap').forEach(div => {
                                    if (div.innerHTML.includes("82713") || div.textContent === search) {
                                        const messageId = div.parentElement?.parentElement?.parentElement?.getAttribute("data-message-id");
                                        if (messageId) {
                                            // Initialize or update savedmsg array
                                            let saved = [];
                                            try {
                                                if (localStorage.savedmsg) {
                                                    saved = JSON.parse(localStorage.savedmsg);
                                                }
                                            } catch (e) {
                                                console.error('Error parsing savedmsg:', e);
                                            }

                                            if (!saved.includes(messageId)) {
                                                saved.push(messageId);
                                                localStorage.savedmsg = JSON.stringify(saved);
                                            }

                                            const targetEl = div.parentElement?.parentElement?.parentElement?.parentElement?.parentElement?.parentElement?.parentElement;
                                            if (targetEl) {
                                                targetEl.hidden = true;
                                            }
                                        }
                                    }
                                });

                                if (document.location.href !== "https://chatgpt.com/") {
                                    setTimeout(function() {
                                        done = true; // check if the site has changed
                                    }, 100);
                                }

                                if (done === true) {
                                    clearInterval(interval);
                                }
                            }, 100); // Changed from 1ms to 100ms
                        }
                    }, 100);
                }
            }, 1000);
        }

        // Create main container
        const panel = document.createElement("div");
        panel.id = "ez-gpt-by-an";

        // Panel styles
        Object.assign(panel.style, {
            position: "fixed",
            bottom: "-120px",
            right: "20px",
            background: "linear-gradient(135deg, #1e1e1e 0%, #2d2d2d 100%)",
            borderRadius: "12px 12px 0 0",
            padding: "20px",
            boxShadow: "0 -5px 20px rgba(0,0,0,0.5)",
            display: "flex",
            flexDirection: "column",
            gap: "10px",
            transition: "bottom 0.4s cubic-bezier(0.4, 0, 0.2, 1)",
            zIndex: "99999",
            minWidth: "200px",
            border: "1px solid #444",
            borderBottom: "none"
        });

        // Create header
        const header = document.createElement("div");
        header.textContent = "EZ GPT";
        Object.assign(header.style, {
            color: "#fff",
            fontSize: "14px",
            fontWeight: "bold",
            marginBottom: "5px",
            textAlign: "center",
            fontFamily: "system-ui, -apple-system, sans-serif",
            letterSpacing: "1px"
        });

        // Create button container
        const btnContainer = document.createElement("div");
        Object.assign(btnContainer.style, {
            display: "flex",
            gap: "10px",
            flexDirection: "column"
        });

        // Button factory
        function createButton(text, color, onClick) {
            const btn = document.createElement("button");
            btn.textContent = text;
            Object.assign(btn.style, {
                background: color,
                color: "#fff",
                border: "none",
                borderRadius: "6px",
                padding: "10px 20px",
                cursor: "pointer",
                fontSize: "13px",
                fontWeight: "600",
                transition: "all 0.2s ease",
                fontFamily: "system-ui, -apple-system, sans-serif",
                boxShadow: "0 2px 5px rgba(0,0,0,0.2)"
            });

            // Hover effects
            btn.addEventListener("mouseenter", () => {
                btn.style.transform = "translateY(-2px)";
                btn.style.boxShadow = "0 4px 8px rgba(0,0,0,0.3)";
                btn.style.filter = "brightness(1.1)";
            });

            btn.addEventListener("mouseleave", () => {
                btn.style.transform = "translateY(0)";
                btn.style.boxShadow = "0 2px 5px rgba(0,0,0,0.2)";
                btn.style.filter = "brightness(1)";
            });

            btn.onclick = onClick;
            return btn;
        }

        // Create buttons
        const btnSave = createButton("💾 Save Chat", "#4CAF50", () => {
            if (document.location.href != "https://chatgpt.com/") {
            // Extract all visible chat messages
            const messages = [...document.querySelectorAll('[data-message-author-role]')].map(el => ({
                role: el.getAttribute('data-message-author-role'),
                text: el.innerText.trim(),
            }));
            messages.push({title: document.title});
            messages.push({instruction: "Continue this chat seamlessly from the given conversation history. The conversation was previously saved (dumped) and is completely unmodified. Ignore numeric tags exactly named as 82713"});

            // Create a JSON blob
            const blob = new Blob([JSON.stringify(messages, null, 2)], { type: 'application/json' });
            const url = URL.createObjectURL(blob);

            // Create a tuff download link
            const a = document.createElement('a');
            a.href = url;
            a.download = !jsonIsChatName ? 'chat_dump.json' : document.title;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            URL.revokeObjectURL(url); // Clean up
            }
        });

        const btnLoad = createButton("📂 Load Chat", "#2196F3", () => { // super tuufff
            const input = document.createElement("input");
            input.type = "file";
            input.accept = ".json";
            input.onchange = e => {
                const file = e.target.files[0];
                if (file) {
                    const r = new FileReader();
                    r.onload = () => {
                        localStorage.sigma = String(r.result);
                        document.location.href = "https://chatgpt.com/";
                    };
                    r.readAsText(file);
                }
            };
            document.body.appendChild(input);
            input.click();
            document.body.removeChild(input);
        });

        const btnClear = createButton("🗑️ Reset ALL", "#f44336", () => {
            if (confirm("Are you sure you want to reset ABSOLUTELY everything saved to your client? This won't delete all chats but you will be logged out.")) {
                if (confirm("Are you 100% certain?")) { // oh nooo
                    try {
                        localStorage.clear();

                        // Clear cookies
                        document.cookie.split(";").forEach(c => {
                            document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/");
                        });

                        // Clear IndexedDB
                        indexedDB.databases().then(dbs => {
                            dbs.forEach(db => indexedDB.deleteDatabase(db.name));
                        });

                        alert("Successfully cleared.");
                        document.location.reload();
                    } catch (e) {
                        alert("Error: " + e);
                    }
                }
            }
        });

        // Hover animation for panel
        let hoverTimeout;

        panel.addEventListener("mouseenter", () => {
            clearTimeout(hoverTimeout);
            panel.style.bottom = "0";
        });

        panel.addEventListener("mouseleave", () => {
            hoverTimeout = setTimeout(() => {
                panel.style.bottom = "-120px";
            }, 300);
        });

        // Create hover trigger area (invisible bar at bottom)
        const trigger = document.createElement("div");
        Object.assign(trigger.style, {
            position: "fixed",
            bottom: "0",
            right: "20px",
            width: "200px",
            height: "5px",
            zIndex: "99998",
            cursor: "pointer"
        });

        trigger.addEventListener("mouseenter", () => {
            panel.style.bottom = "0";
        });

        // Append buttons
        btnContainer.appendChild(btnSave);
        btnContainer.appendChild(btnLoad);
        btnContainer.appendChild(btnClear);

        // Append elements
        panel.appendChild(header);
        panel.appendChild(btnContainer);
        document.body.appendChild(trigger);
        document.body.appendChild(panel);

        console.log("loaded");
    }
})();