Greasy Fork

Greasy Fork is available in English.

Chatgpt 角色扮演助手/Chatgpt Role Play Helper

在屏幕中央弹出一个可拖动位置的悬浮窗,悬浮窗内有三个文本框并且可以编辑,以及一个按钮,点击按钮后将这三个文本框的内容合并,并将合并后的文本输入到页面中符合特定CSS类别的文本框中,最后触发符合特定CSS类别的提交按钮以提交表单。

目前为 2023-03-24 提交的版本。查看 最新版本

// ==UserScript==
// @name         Chatgpt 角色扮演助手/Chatgpt Role Play Helper
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  在屏幕中央弹出一个可拖动位置的悬浮窗,悬浮窗内有三个文本框并且可以编辑,以及一个按钮,点击按钮后将这三个文本框的内容合并,并将合并后的文本输入到页面中符合特定CSS类别的文本框中,最后触发符合特定CSS类别的提交按钮以提交表单。
// @author       Chatgpt (most)and 环白
// @match        https://chat.openai.com/*
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';
    // 设置字体为黑色
    const elements = document.getElementsByTagName('*');
    for (let i = 0; i < elements.length; i++) {
        const element = elements[i];
        const styles = getComputedStyle(element);
        const bgColor = styles.backgroundColor;
        if (bgColor === 'transparent' || bgColor === 'rgba(0, 0, 0, 0)') {
            element.style.color = 'black';
        }
    }
    // 创建悬浮按钮
    const floatingButton = document.createElement('button');
    floatingButton.id = 'floating-button';
    floatingButton.innerText = '展开/Unfold';
    floatingButton.title = '角色扮演助手/Role Play Helper';
    floatingButton.style.position = 'fixed';
    floatingButton.style.right = '50px';
    floatingButton.style.bottom = '50px';
    floatingButton.style.backgroundColor = 'lightblue';
    floatingButton.style.padding = '10px';
    floatingButton.style.borderRadius = '5px';
    floatingButton.style.border = 'none';
    floatingButton.style.cursor = 'pointer';
    floatingButton.style.fontWeight = 'bold';
    document.body.appendChild(floatingButton);

    // 创建悬浮窗和文本框
    const floatingDiv = document.createElement('div');
    floatingDiv.id = 'floating-div';
    floatingDiv.style.position = 'fixed';
    floatingDiv.style.top = 'calc(40% + 50px)';
    floatingDiv.style.height = '600px';
    floatingDiv.style.left = 'calc(100% - 350px)';
    floatingDiv.style.transform = 'translate(-50%, -50%)';
    floatingDiv.style.zIndex = '9999';
    floatingDiv.style.backgroundColor = 'white';
    floatingDiv.style.border = '1px solid black';
    floatingDiv.style.padding = '10px';
    floatingDiv.style.borderRadius = '5px';
    floatingDiv.style.display = 'none';
    floatingDiv.style.width = '400px';
    document.body.appendChild(floatingDiv);
    const input1 = document.createElement('textarea');
    input1.id = 'input1';
    input1.style.width = '100%';
    input1.style.height = '100px';
    input1.style.marginBottom = '0px';
    floatingDiv.appendChild(input1);
    const spaceDiv = document.createElement('div');
    spaceDiv.style.height = '60px'; // 设置空白div的高度
    floatingDiv.insertBefore(spaceDiv, input1); // 将空白div插入到input1前面
    const input2 = document.createElement('textarea');
    input2.id = 'input2';
    input2.style.width = '100%';
    input2.style.height = '100px';
    input2.style.marginBottom = '0px';
    floatingDiv.appendChild(input2);

    const input3 = document.createElement('textarea');
    input3.id = 'input3';
    input3.style.width = '100%';
    input3.style.height = '100px';
    input3.style.marginBottom = '0px';
    floatingDiv.appendChild(input3);
    // 创建注释标签
    const label1 = document.createElement('label');
    label1.innerHTML = '以下内容包括辅助文本会被合并输入:';
    floatingDiv.insertBefore(label1, input1);
    label1.style.fontFamily = '楷体';
    label1.style.fontSize = '14px';
    label1.style.fontWeight = 'bold';

    const label2 = document.createElement('label');
    label2.innerHTML = '回顾区(回顾区存放着ChatGPT你上一次交互过程中的响应){ ';
    floatingDiv.insertBefore(label2, input2);
    label2.style.fontFamily = '楷体';
    label2.style.fontSize = '14px';
    label2.style.fontWeight = 'bold';

    const label3 = document.createElement('label');
    label3.innerHTML = '}<br>交互区(我所扮演的角色的行为、对话和心理,格式【{角色名:(行为、心理)对话】){';
    floatingDiv.insertBefore(label3, input3);
    label3.style.fontFamily = '楷体';
    label3.style.fontSize = '14px';
    label3.style.fontWeight = 'bold';
    const label4 = document.createElement('div');
    label4.innerHTML = '<p>}</p>';
    floatingDiv.insertBefore(label4, input3.nextSibling);
    label4.style.fontFamily = '楷体';
    label4.style.fontSize = '14px';
    label4.style.fontWeight = 'bold';
    label1.classList.add('label');
    label2.classList.add('label');
    label3.classList.add('label');
    label4.classList.add('label');
    // 创建按钮
    const toggleButton = document.createElement('button');
    toggleButton.innerHTML = '<div class="circle"></div>';
    toggleButton.title = '开启/关闭辅助文本(关闭则不合并辅助文本)';
    floatingDiv.appendChild(toggleButton);

    // 添加点击事件
    toggleButton.addEventListener('click', function() {
        const labels = document.querySelectorAll('.label');
        labels.forEach((label, index) => {
            if (index === 0) {
                label.style.display = 'block'; // 让第一个label(即label1)始终显示
            } else if (label.style.display === 'none') {
                label.style.display = 'block';
            } else {
                label.style.display = 'none';
            }
        });
    });

    // 添加样式
    const style = document.createElement('style');
    style.innerHTML = `
  .circle {
    width: 20px;
    height: 20px;
    border: 2px solid #000;
    border-radius: 50%;
    margin: auto;
    position: relative;
  }
  .circle::before,
  .circle::after {
    content: '';
    display: block;
    position: absolute;
    background-color: #000;
  }
  .circle::before {
    width: 10px;
    height: 2px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  .circle::after {
    width: 2px;
    height: 10px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
`;
    document.head.appendChild(style);



    // 创建加载存档按钮和保存存档按钮
    const archiveButtonLeft = document.createElement('button');
    archiveButtonLeft.id = 'archive-button-left';
    archiveButtonLeft.innerText = '加载/Load';
    archiveButtonLeft.title = '点击选择想要加载的存档';
    archiveButtonLeft.style.padding = '10px';
    archiveButtonLeft.style.borderRadius = '5px';
    archiveButtonLeft.style.backgroundColor = 'lightblue';
    archiveButtonLeft.style.border = '1px solid black';
    archiveButtonLeft.style.cursor = 'pointer';
    archiveButtonLeft.style.float = 'left';
    floatingDiv.insertBefore(archiveButtonLeft, spaceDiv);

    const archiveButtonRight = document.createElement('button');
    archiveButtonRight.id = 'archive-button-right';
    archiveButtonRight.innerText = '保存/Save';
    archiveButtonRight.title = '点击选择想要保存的存档';
    archiveButtonRight.style.padding = '10px';
    archiveButtonRight.style.borderRadius = '5px';
    archiveButtonRight.style.backgroundColor = 'lightblue';
    archiveButtonRight.style.border = '1px solid black';
    archiveButtonRight.style.cursor = 'pointer';
    archiveButtonRight.style.float = 'right';
    floatingDiv.insertBefore(archiveButtonRight, spaceDiv);
    // 修改加载存档按钮样式
    archiveButtonLeft.style.border = 'none';
    archiveButtonLeft.style.fontFamily = 'cursive';
    archiveButtonLeft.style.fontWeight = 'bold';
    archiveButtonLeft.style.color = 'black';

    // 修改保存按钮样式
    archiveButtonRight.style.border = 'none';
    archiveButtonRight.style.fontFamily = 'cursive';
    archiveButtonRight.style.fontWeight = 'bold';
    archiveButtonRight.style.color = 'black';


    // 创建加载存档弹窗
    const archivePopup = document.createElement('div');
    archivePopup.id = 'archive-popup-left';
    archivePopup.style.position = 'fixed';
    archivePopup.style.top = '50%';
    archivePopup.style.left = '50%';
    archivePopup.style.transform = 'translate(-50%, -50%)';
    archivePopup.style.zIndex = '9999';
    archivePopup.style.backgroundColor = 'white';
    archivePopup.style.border = '1px solid black';
    archivePopup.style.padding = '10px';
    archivePopup.style.borderRadius = '5px';
    archivePopup.style.display = 'none';
    archivePopup.style.width = '200px';
    document.body.appendChild(archivePopup);


    // 创建加载存档弹窗的关闭按钮
    const closeArchiveButton = document.createElement('button');
    closeArchiveButton.id = 'close-archive-button';
    closeArchiveButton.innerHTML = '&#10060;';
    closeArchiveButton.title = '关闭';
    closeArchiveButton.style.padding = '10px';
    closeArchiveButton.style.borderRadius = '5px';
    closeArchiveButton.style.backgroundColor = 'lightgray';
    closeArchiveButton.style.border = '1px solid black';
    closeArchiveButton.style.cursor = 'pointer';
    closeArchiveButton.style.float = 'right';
    closeArchiveButton.style.border = 'none';
    closeArchiveButton.style.backgroundColor = 'transparent';
    archivePopup.appendChild(closeArchiveButton);

    // 点击加载存档弹窗的关闭按钮关闭弹窗
    closeArchiveButton.addEventListener('click', function() {
        archivePopup.style.display = 'none';
    });
    // 添加存档1、存档2、存档3按钮到加载存档弹窗
    const archiveButton1 = document.createElement('button');
    archiveButton1.id = 'archive-1';
    archiveButton1.innerText = '存档1';
    archiveButton1.title = '存档1';
    archiveButton1.style.padding = '10px';
    archiveButton1.style.borderRadius = '5px';
    archiveButton1.style.backgroundColor = 'lightblue';
    archiveButton1.style.border = 'none';
    archiveButton1.style.cursor = 'pointer';
    archiveButton1.style.marginBottom = '10px';
    archiveButton1.style.fontWeight = 'bold';
    archivePopup.appendChild(archiveButton1);

    const archiveButton2 = document.createElement('button');
    archiveButton2.id = 'archive-2';
    archiveButton2.innerText = '存档2';
    archiveButton2.title = '存档2';
    archiveButton2.style.padding = '10px';
    archiveButton2.style.borderRadius = '5px';
    archiveButton2.style.backgroundColor = 'lightblue';
    archiveButton2.style.border = 'none';
    archiveButton2.style.cursor = 'pointer';
    archiveButton2.style.marginBottom = '10px';
    archiveButton2.style.fontWeight = 'bold';
    archivePopup.appendChild(archiveButton2);

    const archiveButton3 = document.createElement('button');
    archiveButton3.id = 'archive-3';
    archiveButton3.innerText = '存档3';
    archiveButton3.title = '存档3';
    archiveButton3.style.padding = '10px';
    archiveButton3.style.borderRadius = '5px';
    archiveButton3.style.backgroundColor = 'lightblue';
    archiveButton3.style.border = 'none';
    archiveButton3.style.cursor = 'pointer';
    archiveButton3.style.marginBottom = '10px';
    archiveButton3.style.fontWeight = 'bold';
    archivePopup.appendChild(archiveButton3);

    // 创建保存弹窗
    const savePopup = document.createElement('div');
    savePopup.id = 'save-popup';
    savePopup.style.position = 'fixed';
    savePopup.style.top = '50%';
    savePopup.style.left = '50%';
    savePopup.style.transform = 'translate(-50%, -50%)';
    savePopup.style.zIndex = '9999';
    savePopup.style.backgroundColor = 'white';
    savePopup.style.border = '1px solid black';
    savePopup.style.padding = '10px';
    savePopup.style.borderRadius = '5px';
    savePopup.style.display = 'none';
    savePopup.style.width = '300px';
    document.body.appendChild(savePopup);
    // 创建保存弹窗的关闭按钮
    const closeSaveButton = document.createElement('button');
    closeSaveButton.id = 'close-save-button';
    closeSaveButton.innerHTML = '&#10060;';
    closeArchiveButton.title = '关闭';
    closeSaveButton.style.padding = '10px';
    closeSaveButton.style.borderRadius = '5px';
    closeSaveButton.style.backgroundColor = 'transparent';
    closeSaveButton.style.border = 'none';
    closeSaveButton.style.cursor = 'pointer';
    closeSaveButton.style.float = 'right';
    savePopup.appendChild(closeSaveButton);


    // 点击保存弹窗的关闭按钮关闭弹窗
    closeSaveButton.addEventListener('click', function() {
        savePopup.style.display = 'none';
    });

    // 添加导入存档按钮到保存弹窗
    const importButton1 = document.createElement('button');
    importButton1.id = 'import-button1';
    importButton1.innerText = '存入存档1';
    importButton1.title = '存入存档1';
    importButton1.style.padding = '10px';
    importButton1.style.borderRadius = '5px';
    importButton1.style.backgroundColor = 'lightblue';
    importButton1.style.border = 'none';
    importButton1.style.cursor = 'pointer';
    importButton1.style.fontWeight = 'bold';
    importButton1.style.float = 'left';
    savePopup.appendChild(importButton1);

    const importButton2 = document.createElement('button');
    importButton2.id = 'import-button2';
    importButton2.innerText = '存入存档2';
    importButton2.title = '存入存档2';
    importButton2.style.padding = '10px';
    importButton2.style.borderRadius = '5px';
    importButton2.style.backgroundColor = 'lightblue';
    importButton2.style.border = 'none';
    importButton2.style.cursor = 'pointer';
    importButton2.style.fontWeight = 'bold';
    importButton2.style.float = 'left';
    savePopup.appendChild(importButton2);

    const importButton3 = document.createElement('button');
    importButton3.id = 'import-button3';
    importButton3.innerText = '存入存档3';
    importButton3.title = '存入存档3';
    importButton3.style.padding = '10px';
    importButton3.style.borderRadius = '5px';
    importButton3.style.backgroundColor = 'lightblue';
    importButton3.style.border = 'none';
    importButton3.style.cursor = 'pointer';
    importButton3.style.fontWeight = 'bold';
    importButton3.style.float = 'left';
    savePopup.appendChild(importButton3);
    const MAX_CHUNK_COUNT = 100;

    // 存储存档数据的对象
    const archiveData = {
        archive1: {
            text1: '',
            text2: '',
            text3: ''
        },
        archive2: {
            text1: '',
            text2: '',
            text3: ''
        },
        archive3: {
            text1: '',
            text2: '',
            text3: ''
        }
    };

    // 点击存储按钮将悬浮窗的三个文本框内的文本存储到“存档1”按钮中
    importButton1.addEventListener('click', function() {
        archiveData.archive1.text1 = input1.value;
        archiveData.archive1.text2 = input2.value;
        archiveData.archive1.text3 = input3.value;
        localStorage.setItem('archiveData', JSON.stringify(archiveData));
        input1.value = '';
        input2.value = '';
        input3.value = '';
        savePopup.style.display = 'none';
    });

    // 点击存储按钮将悬浮窗的三个文本框内的文本存储到“存档2”按钮中
    importButton2.addEventListener('click', function() {
        archiveData.archive2.text1 = input1.value;
        archiveData.archive2.text2 = input2.value;
        archiveData.archive2.text3 = input3.value;
        localStorage.setItem('archiveData', JSON.stringify(archiveData));
        input1.value = '';
        input2.value = '';
        input3.value = '';
        savePopup.style.display = 'none';
    });

    // 点击存储按钮将悬浮窗的三个文本框内的文本存储到“存档3”按钮中
    importButton3.addEventListener('click', function() {
        archiveData.archive3.text1 = input1.value;
        archiveData.archive3.text2 = input2.value;
        archiveData.archive3.text3 = input3.value;
        localStorage.setItem('archiveData', JSON.stringify(archiveData));
        input1.value = '';
        input2.value = '';
        input3.value = '';
        savePopup.style.display = 'none';
    });

    // 点击存档1按钮将“存档1”中的文本替换到悬浮窗的三个文本框内
    archiveButton1.addEventListener('click', function() {
        const archiveData = JSON.parse(localStorage.getItem('archiveData'));
        const texts = [
            archiveData.archive1.text1,
            archiveData.archive1.text2,
            archiveData.archive1.text3
        ];
        input1.value = texts[0];
        input2.value = texts[1];
        input3.value = texts[2];
        archivePopup.style.display = 'none';
    });

    // 点击存档2按钮将“存档2”中的文本替换到悬浮窗的三个文本框内
    archiveButton2.addEventListener('click', function() {
        const archiveData = JSON.parse(localStorage.getItem('archiveData'));
        const texts = [
            archiveData.archive2.text1,
            archiveData.archive2.text2,
            archiveData.archive2.text3
        ];
        input1.value = texts[0];
        input2.value = texts[1];
        input3.value = texts[2];
        archivePopup.style.display = 'none';
    });

    // 点击存档3按钮将“存档3”中的文本替换到悬浮窗的三个文本框内
    archiveButton3.addEventListener('click', function() {
        const archiveData = JSON.parse(localStorage.getItem('archiveData'));
        const texts = [
            archiveData.archive3.text1,
            archiveData.archive3.text2,
            archiveData.archive3.text3
        ];
        input1.value = texts[0];
        input2.value = texts[1];
        input3.value = texts[2];
        archivePopup.style.display = 'none';
    });


    let archivePopupVisible = false;
    archiveButtonLeft.addEventListener('click', function() {
        // 隐藏弹窗并清除之前的位置信息
        archivePopup.style.display = 'none';
        archivePopup.style.left = '';
        archivePopup.style.top = '';
        archivePopupVisible = false;

        if (!archivePopupVisible) {
            // 获取加载存档按钮的位置和尺寸
            const buttonRect = archiveButtonLeft.getBoundingClientRect();
            const buttonWidth = buttonRect.width;
            const buttonHeight = buttonRect.height;

            // 计算弹窗的位置
            const popupLeft = buttonRect.left + buttonWidth + savePopup.offsetWidth;
            const popupTop = buttonRect.top - buttonHeight/2 - archivePopup.offsetHeight/2;

            // 设置弹窗的位置
            archivePopup.style.left = popupLeft + 'px';
            archivePopup.style.top = popupTop + 'px';

            // 显示弹窗
            archivePopup.style.display = 'block';
            archivePopupVisible = true;
        }
    });
    // 点击加载存档按钮弹出加载存档弹窗
    archiveButtonLeft.addEventListener('click', function() {
        // 获取加载存档按钮的位置和尺寸
        const buttonRect = archiveButtonLeft.getBoundingClientRect();
        const buttonWidth = buttonRect.width;
        const buttonHeight = buttonRect.height;

        // 计算弹窗的位置
        const popupLeft = buttonRect.left + buttonWidth - archivePopup.offsetWidth / 3;
        const popupTop = buttonRect.top + archivePopup.offsetHeight/2.4;

        // 设置弹窗的位置
        archivePopup.style.left = popupLeft + 'px';
        archivePopup.style.top = popupTop + 'px';

        // 显示弹窗
        archivePopup.style.display = 'block';
    });

    // 点击加载存档弹窗的关闭按钮或其他地方关闭弹窗
    closeArchiveButton.addEventListener('click', function() {
        archivePopup.style.display = 'none';
        archivePopupVisible = false;
    });

    archivePopup.addEventListener('click', function(event) {
        if (event.target === archivePopup) {
            archivePopup.style.display = 'none';
            archivePopupVisible = false;
        }
    });

    // 点击保存按钮弹出保存弹窗
    let savePopupVisible = false;
    archiveButtonRight.addEventListener('click', function() {
        // 获取保存按钮的位置和尺寸
        const savebuttonRect = archiveButtonRight.getBoundingClientRect();
        const savebuttonWidth = savebuttonRect.width;
        const savebuttonHeight = savebuttonRect.height;

        // 计算弹窗的位置
        const savepopupLeft = savebuttonRect.left + savebuttonWidth + savePopup.offsetWidth;
        const savepopupTop = savebuttonRect.top + savebuttonHeight + savePopup.offsetHeight;

        // 计算弹窗的最大左边距和上边距,防止弹窗超出浏览器窗口
        const maxLeft = window.innerWidth - savePopup.offsetWidth;
        const maxTop = window.innerHeight - savePopup.offsetHeight;

        // 设置弹窗的位置
        savePopup.style.left = Math.min(savepopupLeft, maxLeft) - savePopup.offsetWidth + 'px';
        savePopup.style.top = Math.min(savepopupTop, maxTop) - savePopup.offsetHeight + 'px';

        // 显示弹窗
        savePopup.style.display = 'block';
    });


    // 点击保存弹窗的关闭按钮或其他地方关闭弹窗
    closeSaveButton.addEventListener('click', function() {
        savePopup.style.display = 'none';
        savePopupVisible = false;
    });

    savePopup.addEventListener('click', function(event) {
        if (event.target === savePopup) {
            savePopup.style.display = 'none';
            savePopupVisible = false;
        }
    });


    // 创建发送按钮
    const button = document.createElement('button');
    button.id = 'merge-button';
    button.innerText = '发送/Send';
    button.title = '合并以上文本进行发送';
    button.style.padding = '10px';
    button.style.borderRadius = '5px';
    button.style.backgroundColor = 'lightblue';
    button.style.border = '1px solid black';
    button.style.cursor = 'pointer';
    button.style.float = 'right';
    // 修改发送按钮样式
    button.style.border = 'none';
    button.style.fontFamily = 'cursive';
    button.style.fontWeight = 'bold';
    button.style.color = 'black';
    floatingDiv.appendChild(button);
    // 在悬浮窗左下角添加文本
    const helperText = document.createElement('div');
    helperText.innerText = 'Role Play Helper';
    helperText.title = '这是一个帮助文本,它提供了一些有用的信息来帮助您使用本脚本。\n帮助:将你的鼠标放在每一个你能看到的图标上,仔细查看这些图标的注解。'
    helperText.style.position = 'absolute';
    helperText.style.bottom = '10px';
    helperText.style.left = '10px';
    helperText.style.fontFamily = 'cursive';
    helperText.style.fontWeight = 'bold';
    helperText.style.fontStyle = 'italic';
    helperText.style.fontSize = '16px';
    floatingDiv.appendChild(helperText);
    // 设置悬浮窗可拖动
    let isDragging = false;
    let offsetX = 0;
    let offsetY = 0;

    const textInputs = [input1, input2, input3];

    floatingDiv.addEventListener('mousedown', function(event) {
        // 检查事件目标是否是文本框
        if (textInputs.includes(event.target)) {
            return;
        }
        isDragging = true;
        offsetX = event.clientX - floatingDiv.offsetLeft;
        offsetY = event.clientY - floatingDiv.offsetTop;
    });

    document.addEventListener('mousemove', function(event) {
        if (isDragging) {
            floatingDiv.style.left = (event.clientX - offsetX) + 'px';
            floatingDiv.style.top = (event.clientY - offsetY) + 'px';
        }
    });

    document.addEventListener('mouseup', function() {
        isDragging = false;
    });

    function generateOutputArray(selector, num = 0) {
        const matchedDivs = document.querySelectorAll(selector);
        const results = [];
        let startIdx = 0;
        if (num > 0) {
            startIdx = Math.max(matchedDivs.length - num, 0);
        }
        matchedDivs.forEach((div, idx) => {
            if (idx >= startIdx) {
                const hasFlexBetweenChild = div.querySelector('div.flex.justify-between') !== null;
                const flexBetweenDiv = div.querySelector('div.flex.justify-between');
                const hasChild = flexBetweenDiv && flexBetweenDiv.children.length > 0;
                const text = div.textContent.trim();
                let role = hasChild ? "assistant" : "user";
                results.push({ role, content: text });
            }
        });
        return results;
    }

    //生成指定限制数量和字数长度的会话数组
    function generateOutputArrayWithMaxLength(selector, num = 0, maxLength = Infinity) {
        const outputArray = generateOutputArray(selector, num);
        let totalLength = 0;
        let resultArray = [];
        for (let i = outputArray.length - 1; i >= 0; i--) {
            const { role, content } = outputArray[i];
            totalLength += content.length;
            if (totalLength > maxLength || resultArray.length >= num) {
                break;
            }
            resultArray.unshift({ role, content });
        }
        return resultArray;
    }

    //格式化会话数组为导出文本
    function formatOutputArray(outputArray) {
        return outputArray
            .map(({ role, content }) => `${role}: ${content}`)
            .join('\r\n\r\n----------------\r\n\r\n');
    }

    //创建一个下载文本
    function downloadTextFile(text, filename) {
        const blob = new Blob([text], { type: "text/plain;charset=utf-8" });
        const a = document.createElement("a");
        a.href = URL.createObjectURL(blob);
        a.download = `${filename}.txt`;
        a.textContent = `Download ${filename}`;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    }

    //获取最新的助手消息
    function getLatestAssistantMessage(selector) {
        const matchedDivs = document.querySelectorAll(selector);
        for (let i = matchedDivs.length - 1; i >= 0; i--) {
            const div = matchedDivs[i];
            const flexBetweenDiv = div.querySelector('div.flex.justify-between');
            if (flexBetweenDiv && flexBetweenDiv.children.length > 0) {
                const text = div.textContent.trim();
                return text;
            }
        }
        return null;
    }

    // 创建按钮元素
    const button2 = document.createElement('button');
    button2.innerHTML = '<svg width="24" height="24" viewBox="0 0 24 24"><path fill="#ff69b4" d="M12,21.4c-0.4,0-0.7-0.1-1-0.4C5.5,16.8,2,12.2,2,8.5C2,5.4,4.4,3,7.5,3c2,0,3.8,1.2,4.5,2.9C12.7,4.2,14.5,3,16.5,3C19.6,3,22,5.4,22,8.5c0,3.7-3.5,8.3-9,12.5C12.7,21.2,12.4,21.4,12,21.4z"/></svg>';
    button2.title = '复制GPT最新回复到回顾区';
    floatingDiv.appendChild(button2);

    // 修改按钮样式
    button2.style.position = 'absolute';
    button2.style.top = '90%';
    button2.style.left = '50%';
    button2.style.transform = 'translate(-50%, 10px)';
    button2.style.border = 'none';
    button2.style.background = 'transparent';
    button2.style.cursor = 'pointer';

    ;


  // 给按钮添加点击事件监听器
button2.addEventListener('click', function() {
    const latestAssistantMessage = getLatestAssistantMessage('div[class*="w-[calc(100%"]');
    if (latestAssistantMessage) {
        input2.value = latestAssistantMessage;
    }
});
button.addEventListener('click', function() {
    const inputText1 = input1.value.trim();
    const inputText2 = input2.value.trim();
    const inputText3 = input3.value.trim();
let mergedTextoutput = '';

if (inputText1 !== '') {
    mergedTextoutput += inputText1 + '\n';
}

if (label2.style.display !== 'none' && inputText2 !== '') {
    mergedTextoutput += label2.textContent.trim() + '\n';
}

if (inputText2 !== '') {
    mergedTextoutput += inputText2 + '\n';
}

if (label3.style.display !== 'none' && inputText3 !== '') {
    mergedTextoutput += label3.textContent.trim() + '\n';
}

if (inputText3 !== '') {
    mergedTextoutput += inputText3 + '\n';
}

if (label4.style.display !== 'none') {
    mergedTextoutput += label4.textContent.trim() + '\n';
}



        console.log(mergedTextoutput);
        // 将合并后的文本输入到页面中符合特定CSS类别的文本框中,并触发提交按钮
        const textareas = document.querySelectorAll('[class*="m-"][class*="w-full"][class*="resize-none"][class*="border-0"][class*="bg-transparent"][class*="p-"][class*="pl-"][class*="pr-"][class*="focus:ring-0"][class*="focus-visible:ring-0"][class*="dark:bg-transparent"][class*="md:pl-"]');
        if (textareas.length > 0) {
            textareas[0].value = mergedTextoutput;

            // 触发提交按钮
            const button = document.querySelector('[class*="absolute"][class*="rounded-md"][class*="bottom-"][class*="right-"][class*="disabled"]');
            if (button) {
                button.click();
            }
        }
    });

    // 点击悬浮按钮展开悬浮窗
    floatingButton.addEventListener('click', function() {
        if (floatingDiv.style.display === 'none') {
            floatingDiv.style.display = 'block';
            floatingButton.innerText = '收起/Fold';
        } else {
            floatingDiv.style.display = 'none';
            floatingButton.innerText = '展开/Unfold';

        }
    });})();