Educake ChatGPT Button + Allow Pasting

Adds a ChatGPT button to Educake which copies question text and opens a ChatGPT window, allowing you to get answers quickly. This script also re-enables the pasting feature in the answer box, so you can copy answers from GPT / Google, and paste them in the answer box

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Educake ChatGPT Button + Allow Pasting
// @namespace    https://github.com/Z2r-YT/Educake-Pasting
// @version      1.0
// @description  Adds a ChatGPT button to Educake which copies question text and opens a ChatGPT window, allowing you to get answers quickly. This script also re-enables the pasting feature in the answer box, so you can copy answers from GPT / Google, and paste them in the answer box
// @author       liam @ duckwithsunglasses.com
// @match        *://*.educake.co.uk/*
// @grant        none
// @license      MIT
// @icon         data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiBpZD0iSWNvbnMiIHg9IjAiIHk9IjAiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4IiBzdHlsZT0iY3Vyc29yOiBkZWZhdWx0OyI+DQogIDxzdHlsZT4NCiAgICAuc3Qze2ZpbGw6bm9uZTtzdHJva2U6IzQ1NDEzYztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9DQogIDwvc3R5bGU+DQogIDxnIGlkPSJYTUxJRF8xNzQ5N18iPg0KICAgIDxlbGxpcHNlIGlkPSJYTUxJRF8xNzUxM18iIGN4PSIyNCIgY3k9IjQ1LjEiIGZpbGw9IiM0NTQxM2MiIG9wYWNpdHk9Ii4xNSIgcng9IjE0LjIiIHJ5PSIxLjkiLz4NCiAgICA8ZyBpZD0iWE1MSURfMTc0OThfIj4NCiAgICAgIDxwYXRoIGlkPSJYTUxJRF8xNzUxMl8iIGZpbGw9IiNkZWJiN2UiIGQ9Ik0zNyA0NC41SDExYy0xLjkgMC0zLjUtMS42LTMuNS0zLjVWNy44QzcuNSA1LjkgOSA0LjQgMTEgNC40aDI2YzEuOSAwIDMuNSAxLjYgMy41IDMuNVY0MWMwIDEuOS0xLjUgMy41LTMuNSAzLjV6Ii8+DQogICAgICA8cGF0aCBpZD0iWE1MSURfMTc1MTFfIiBmaWxsPSIjZjBkNWE4IiBkPSJNMzcgNC40SDExYy0yIDAtMy41IDEuNS0zLjUgMy40djRDNy41IDkuOSA5IDguNCAxMSA4LjRoMjZjMS45IDAgMy41IDEuNiAzLjUgMy41di00YzAtMi0xLjUtMy41LTMuNS0zLjV6Ii8+DQogICAgICA8cGF0aCBpZD0iWE1MSURfMTc1MTBfIiBkPSJNMzcgNDQuNUgxMWMtMS45IDAtMy41LTEuNi0zLjUtMy41VjcuOEM3LjUgNS45IDkgNC40IDExIDQuNGgyNmMxLjkgMCAzLjUgMS42IDMuNSAzLjVWNDFjMCAxLjktMS41IDMuNS0zLjUgMy41eiIgY2xhc3M9InN0MyIvPg0KICAgICAgPHBhdGggaWQ9IlhNTElEXzE3NTA5XyIgZmlsbD0iI2ZmZmVmMiIgZD0iTTM1LjEgNDAuNEgxMi45Yy0uNyAwLTEuMi0uNi0xLjItMS4yVjExLjZjMC0uNy42LTEuMiAxLjItMS4yaDIyLjNjLjcgMCAxLjIuNiAxLjIgMS4ydjI3LjZjMCAuNy0uNiAxLjItMS4zIDEuMnoiLz4NCiAgICAgIDxwYXRoIGlkPSJYTUxJRF8xNzUwOF8iIGZpbGw9IiNmZmYiIGQ9Ik0zNS4xIDEwLjRIMTIuOWMtLjcgMC0xLjIuNi0xLjIgMS4ydjMuOWMwLS43LjYtMS4yIDEuMi0xLjJoMjIuM2MuNyAwIDEuMi42IDEuMiAxLjJ2LTMuOWMwLS43LS42LTEuMi0xLjMtMS4yeiIvPg0KICAgICAgPHBhdGggaWQ9IlhNTElEXzE3NTA3XyIgZD0iTTM1LjEgNDAuNEgxMi45Yy0uNyAwLTEuMi0uNi0xLjItMS4yVjExLjZjMC0uNy42LTEuMiAxLjItMS4yaDIyLjNjLjcgMCAxLjIuNiAxLjIgMS4ydjI3LjZjMCAuNy0uNiAxLjItMS4zIDEuMnoiIGNsYXNzPSJzdDMiLz4NCiAgICAgIDxwYXRoIGlkPSJYTUxJRF8xNzUwNl8iIGZpbGw9IiNkYWVkZjciIGQ9Ik0yNiA4LjFjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAyaC0zLjVjLS43IDAtMS4yLjYtMS4yIDEuMnYxLjljMCAuNy42IDEuMiAxLjIgMS4yaDExYy43IDAgMS4yLS42IDEuMi0xLjJWOS4zYzAtLjctLjYtMS4yLTEuMi0xLjJIMjZ6Ii8+DQogICAgICA8cGF0aCBpZD0iWE1MSURfMTc1MDVfIiBmaWxsPSIjZThmNGZhIiBkPSJNMjkuNSA4LjFIMjZjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAyaC0zLjVjLS43IDAtMS4yLjYtMS4yIDEuMnYyYzAtLjcuNi0xLjIgMS4yLTEuMkgyMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyaDMuNWMuNyAwIDEuMi41IDEuMiAxLjJ2LTJjLjEtLjYtLjUtMS4yLTEuMi0xLjJ6Ii8+DQogICAgICA8cGF0aCBpZD0iWE1MSURfMTc1MDRfIiBkPSJNMjYgOC4xYzAtMS4xLS45LTItMi0ycy0yIC45LTIgMmgtMy41Yy0uNyAwLTEuMi42LTEuMiAxLjJ2MS45YzAgLjcuNiAxLjIgMS4yIDEuMmgxMWMuNyAwIDEuMi0uNiAxLjItMS4yVjkuM2MwLS43LS42LTEuMi0xLjItMS4ySDI2eiIgY2xhc3M9InN0MyIvPg0KICAgICAgPHBhdGggaWQ9IlhNTElEXzE3NTAzXyIgZD0iTTE1LjQgMTYuM2g2LjIiIGNsYXNzPSJzdDMiLz4NCiAgICAgIDxwYXRoIGlkPSJYTUxJRF8xNzUwMl8iIGQ9Ik0xNS40IDM0LjRoNi4yIiBjbGFzcz0ic3QzIi8+DQogICAgICA8cGF0aCBpZD0iWE1MSURfMTc1MDFfIiBkPSJNMTUuNCAyMGgxNC41IiBjbGFzcz0ic3QzIi8+DQogICAgICA8cGF0aCBpZD0iWE1MSURfMTc1MDBfIiBkPSJNMTUuNCAyMy4zaDE0LjUiIGNsYXNzPSJzdDMiLz4NCiAgICAgIDxwYXRoIGlkPSJYTUxJRF8xNzQ5OV8iIGQ9Ik0xNS40IDI2LjloMTQuNSIgY2xhc3M9InN0MyIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+
// ==/UserScript==

(function() {
    'use strict';

    // check if GPT button exists
    function isNewButtonAdded() {
      return document.getElementById("newButton") !== null;
    }

    // inject GPT Button
    function injectGPT() {
      // Check if the button has already been added
        if (!isNewButtonAdded()) {
            var newButton = document.createElement("div");
            newButton.className = "btn bg-green-80 bg-green-hover r-bg-light r-bg-light-hover r-text-dark ml-2 lh-close mb-2 mb-sm-0 align-self-start";
            newButton.textContent = "Copy and open ChatGPT";
            newButton.id = "newButton";

            // Add event listener to copy text and open "chat.openai.com" in a new tab
            newButton.addEventListener("click", function() {
                // Copy text from elements with class ".question-text"
                var questionTextElements = document.querySelectorAll(".question-text");
                var copiedText = Array.from(questionTextElements).map(element => element.textContent).join('\n');

                // Copy text to clipboard
                var tempInput = document.createElement("textarea");
                tempInput.value = copiedText;
                document.body.appendChild(tempInput);
                tempInput.select();
                document.execCommand("copy");
                document.body.removeChild(tempInput);

                // Open "chat.openai.com" in a new tab
                window.open("https://chat.openai.com", "_blank");
            });

            // Insert the new button before the last div in the existing div
            var existingDiv = document.querySelector(".column");
            existingDiv.insertBefore(newButton, existingDiv.lastElementChild);
        }
    }

    // wait for body to click
    document.addEventListener('click', function() {
    setInterval(injectGPT, 500);
    });

    // remove retarded "onpaste" disable func
function removePaste() {
    var elements = document.querySelectorAll('.answer-text');
    elements.forEach(function(element) {
        element.removeAttribute('onpaste');
    });
}
// check every .5s for new boxess
setInterval(removePaste, 500);

})();