Greasy Fork

Greasy Fork is available in English.

ChatGPT Conversation Seeker Newer Version

Search past conversations with auto-load and keyboard enter support

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         ChatGPT Conversation Seeker Newer Version
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  Search past conversations with auto-load and keyboard enter support
// @author       Emree.el on Instagram :)
// @match        https://chatgpt.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Create a container for the search bar and button
    const searchBarContainer = document.createElement('div');
    searchBarContainer.style.position = 'fixed';
    searchBarContainer.style.top = '0';
    searchBarContainer.style.left = 'calc(50% + 280px)';
    searchBarContainer.style.transform = 'translateX(-50%)';
    searchBarContainer.style.zIndex = '9999';
    searchBarContainer.style.background = '#171717';
    searchBarContainer.style.padding = '5px';
    searchBarContainer.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
    searchBarContainer.style.display = 'flex';
    searchBarContainer.style.alignItems = 'center';

    // Create the search input
    const searchInput = document.createElement('input');
    searchInput.type = 'text';
    searchInput.placeholder = 'Enter text to search';
    searchInput.style.marginRight = '5px';
    searchInput.style.padding = '5px';
    searchInput.style.fontSize = '14px';
    searchInput.style.backgroundColor = 'black';

    // Create the search button
    const searchButton = document.createElement('button');
    searchButton.textContent = 'Enter';
    searchButton.style.padding = '5px';
    searchButton.style.fontSize = '14px';

    // Append the input and button to the container
    searchBarContainer.appendChild(searchInput);
    searchBarContainer.appendChild(searchButton);

    // Append the container to the body
    document.body.appendChild(searchBarContainer);

    // Function to continuously scroll down and up an element
    function scrollElement(element, resolve) {
        let lastScrollTop = element.scrollTop;
        const scrollDownInterval = setInterval(() => {
            element.scrollTop += 100;
            if (element.scrollTop === lastScrollTop) {
                clearInterval(scrollDownInterval);
                scrollUp(element, resolve);
            }
            lastScrollTop = element.scrollTop;
        }, 50); // Adjust speed if necessary
    }

    // Function to scroll up an element
    function scrollUp(element, callback) {
        const scrollUpInterval = setInterval(() => {
            element.scrollTop -= 100;
            if (element.scrollTop === 0) {
                clearInterval(scrollUpInterval);
                callback();
            }
        }, 50); // Adjust speed if necessary
    }

    // Function to perform search
    function performSearch() {
        const searchText = searchInput.value.trim().toLowerCase();
        const elements = document.querySelectorAll('a.flex.items-center.gap-2.p-2');

        elements.forEach(element => {
            const text = element.textContent.trim().toLowerCase();
            if (text.includes(searchText)) {
                element.style.display = 'block';
            } else {
                element.style.display = 'none';
            }
        });
    }

    // Function to handle scrolling for up to three scrollable elements
    function handleScrollForElements(elements) {
        if (elements.length === 0) {
            performSearch();
            return;
        }

        let index = 0;
        function scrollNext() {
            if (index < elements.length && index < 3) {
                scrollElement(elements[index], () => {
                    index++;
                    scrollNext();
                });
            } else {
                performSearch();
            }
        }

        scrollNext();
    }

    // Add event listener to the button
    searchButton.addEventListener('click', function() {
        const scrollableElements = Array.from(document.querySelectorAll('*')).filter(el => el.scrollHeight > el.clientHeight);
        handleScrollForElements(scrollableElements);
    });

    // Add event listener for Enter key press in the search input
    searchInput.addEventListener('keydown', function(e) {
        if (e.key === 'Enter') {
            const scrollableElements = Array.from(document.querySelectorAll('*')).filter(el => el.scrollHeight > el.clientHeight);
            handleScrollForElements(scrollableElements);
        }
    });

    // Automatically trigger loading on page load
    window.addEventListener('load', function() {
        const scrollableElements = Array.from(document.querySelectorAll('*')).filter(el => el.scrollHeight > el.clientHeight);
        handleScrollForElements(scrollableElements);
    });

})();