Favorite GPT conversations

Show favorite GPT conversions

当前为 2024-09-05 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Favorite GPT conversations
// @version      1.0.0
// @homepage     https://www.techbytegaming.net/
// @description  Show favorite GPT conversions
// @author       acheshirov
// @match        https://chatgpt.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=chatgpt.com
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @grant        GM_getValue
// @grant        GM_setValue
// @namespace https://greasyfork.org/users/1363565
// ==/UserScript==

(function() {
    'use strict';

    $( document ).ready(function() {
        var isDark = !$('html').hasClass('light');

        var observer = new MutationObserver(function(mutations) {
            setTimeout(function() {
                showPinChatBtn();
            }, 3000);
        });

        observer.observe(document.querySelector("main"), {
            childList: true
        });

        function showPinChatBtn()
        {
            var m2 = $('body').find('.leading\\-\\[0\\]');
            if (m2.find('#addPinThisPage').length === 0) {
                var span2 = m2.find('span').eq(0).clone();
                span2.attr('id', 'addPinThisPage')
                span2.find('svg').replaceWith(`<svg xmlns="http://www.w3.org/2000/svg" fill="#fff" width="24" height="24" viewBox="0 0 24 24"><path d="M8 2h8a1 1 0 0 1 1 1v.382a1 1 0 0 1-.553.894L15 5v5l2.707 2.707a1 1 0 0 1 .293.707V15a1 1 0 0 1-1 1h-4v4l-1 3l-1-3v-4H7a1 1 0 0 1-1-1v-1.586a1 1 0 0 1 .293-.707L9 10V5l-1.447-.724A1 1 0 0 1 7 3.382V3a1 1 0 0 1 1-1z"/></svg>`);
                if (!isDark) {
                    span2.find('svg').css('filter', 'invert(50%)');
                }
                span2.prependTo(m2);
            }
        }

        setTimeout(function() {
            var m = $('body').find('.h\\-\\[60px\\]');
            var span = m.find('span').eq(0).clone();

            span.find('svg').replaceWith(`<svg xmlns="http://www.w3.org/2000/svg" fill="#fff" width="24" height="24" viewBox="0 0 24 24"><path d="M8 2h8a1 1 0 0 1 1 1v.382a1 1 0 0 1-.553.894L15 5v5l2.707 2.707a1 1 0 0 1 .293.707V15a1 1 0 0 1-1 1h-4v4l-1 3l-1-3v-4H7a1 1 0 0 1-1-1v-1.586a1 1 0 0 1 .293-.707L9 10V5l-1.447-.724A1 1 0 0 1 7 3.382V3a1 1 0 0 1 1-1z"/></svg>`);
            if (!isDark) {
                span.find('svg').css('filter', 'invert(50%)');
            }
            span.appendTo(m);

            span.on('click', function() {
                showModal();
            });

            showPinChatBtn();
        }, 2000);

        function showModal()
        {
            var chats = GM_getValue('gpt_pin_chats');

            if (!chats) {
                return alert('No pinned chats found!');
            }

            chats = JSON.parse(chats);

            if (chats.length === 0) {
                return alert('No pinned chats found!');
            }

            $('body').find('#myPinnedChats').remove();

            $('body').append('<dialog style="box-shadow: 0 0 7px rgba(200, 200, 200, 0.7); padding: 10px; font-size: 18px; border-radius: 10px; background: rgba(25, 25, 25, 0.98);" id="myPinnedChats"><table border="0"></table></dialog>');

            for (var key in chats) {
                $('#myPinnedChats table').append('<tr data-element-key="' + key + '"><td style="padding: 5px;"><a style="color: #fff" href="' + chats[key].link + '">' + chats[key].title + '</a></td><td style="padding: 5px; color: #fff">[<a href="#" style="color: #fff" class="deletePinnedChat" title="Delete">X</a>]</td></tr>');
            }

            $('#myPinnedChats')[0].showModal();
        }

        $('body').on('click', '#addPinThisPage', function() {
            var title;
            if (title = prompt('Title of the pinned chat', $('head').find('title').text())) {
                var chats = GM_getValue('gpt_pin_chats');
                if (chats) {
                    chats = JSON.parse(chats);
                } else {
                    chats = [];
                }

                for (var key in chats) {
                    if (chats[key].link === window.location.href) {
                        chats[key].title = title;
                        GM_setValue('gpt_pin_chats', JSON.stringify(chats));
                        return;
                    }
                }

                chats.push({'link': window.location.href, 'title': title});

                GM_setValue('gpt_pin_chats', JSON.stringify(chats));
            }
        });

        $('body').on('click', '#myPinnedChats a', function(e) {
            e.preventDefault();

            if ($(this).hasClass('deletePinnedChat')) {
                if (confirm('Are you sure you want to delete this pin?')) {
                    var chats = JSON.parse(GM_getValue('gpt_pin_chats'));

                    chats.splice($(this).parents('tr').attr('data-element-key'), 1)

                    GM_setValue('gpt_pin_chats', JSON.stringify(chats));

                    $('#myPinnedChats')[0].close();
                    showModal();
                }

                return;
            }

            window.location.href = $(this).attr('href');
        });
    });
})();