Favorite GPT conversations

Show favorite GPT conversions

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

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

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴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');
        });
    });
})();