Google Forms Helper

Aids to solve google forms

Pada tanggal 08 Februari 2024. Lihat %(latest_version_link).

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Google Forms Helper
// @namespace    https://github.com
// @version      2.3
// @description  Aids to solve google forms
// @author       erucix
// @match        https://docs.google.com/forms/*
// @icon         https://www.gstatic.com/images/branding/product/1x/forms_2020q4_48dp.png
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    window.trustedTypes.createPolicy('default', {createHTML: (string, sink) => string});

    const formBlockHolderName = ".Qr7Oae";
    const questionHolderParentName = ".z12JJ";
    const questionHolderName = ".M7eMe";
    const optionsHolderName = ".nWQGrd.zwllIb";

    const searchEngine = "https://google.com/search?q=";

    const formBlockContainer = document.querySelectorAll(formBlockHolderName);

    formBlockContainer.forEach((element, index) => {
        attatchMenu(element);
        attatchAiBox(element);
        findAnswer(element);
    });

    function findAnswer(element) {
        fetch("https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText?key=AIzaSyCWvB0JMPgfzpdK9e3UtfDvSoTzrtDZ7ns", {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                prompt: {
                    text: "Which of the following option is correct for this question?\n" +
                    getQuestionWithOptions(element),
                },
            }),
        })
            .then(response => response.json())
            .then(data => {
            element.querySelector("#chatGPTAnswer").innerText = data?.candidates[0].output;
            autoClickAnswers(element, data?.candidates[0].output);
        })
            .catch(error => {
            element.querySelector("#chatGPTAnswer").innerText = "😢 Failed to fetch answer. ";
        });
    }

    function autoClickAnswers(destinationElement, answer) {
        const optionsHolder = destinationElement.querySelectorAll(optionsHolderName);
        optionsHolder?.forEach((element, index) => {

            if (answer.includes(element.textContent)) {
                element.querySelector(".Od2TWd.hYsg7c").click();
            }
        })
    }

    function attatchMenu(destinationElement) {
        const optionHolder = destinationElement.querySelectorAll(optionsHolderName);

        const searchButton = document.createElement("a");
        searchButton.setAttribute("target", "_blank");
        searchButton.classList.add("partofai");

        const copyButton = document.createElement("a");
        copyButton.setAttribute("target", "_blank");
        copyButton.classList.add("partofai");

        searchButton.textContent = "SEARCH";
        copyButton.textContent = "COPY";

        const searchButtonStyle = {
            color: "red",
            fontWeight: "bold",
            textDecoration: "none",
            padding: "0px",
        };

        const copyButtonStyle = {
            color: "blue",
            fontWeight: "bold",
            textDecoration: "none",
            padding: "10px",
            cursor: "pointer"
        };

        Object.assign(searchButton.style, searchButtonStyle);
        Object.assign(copyButton.style, copyButtonStyle);

        searchButton.href = searchEngine + encodeURIComponent(getQuestionWithOptions(destinationElement));

        copyButton.addEventListener("click", () => {
            navigator.clipboard.writeText(getQuestionWithOptions(destinationElement));

            copyButton.textContent = "COPIED";

            setTimeout(() => {
                copyButton.textContent = "COPY";
            }, 1000);
        });

        destinationElement.appendChild(searchButton);
        destinationElement.appendChild(copyButton);
    }

    function attatchAiBox(destinationElement) {
        const chatAnswerDiv = document.createElement('div');
        chatAnswerDiv.classList.add("partofai");

        const boldTextParagraph = document.createElement('p');
        boldTextParagraph.innerText = "👻 AI Answer:";

        const chatAnswerDivStyle = {
            backgroundColor: "rgba(139, 97, 238, 0.683)",
            padding: "5px 10px",
            borderRadius: "5px",
            marginBottom: "20px"
        };

        const boldTextParagraphStyle = {
            fontWeight: "bolder",
            padding: 0,
            margin: 0,
            color: "rgb(255, 255, 255)"
        };

        const hrElement = document.createElement('hr');
        hrElement.style.border = '1px solid white';

        const textContentParagraph = document.createElement('p');
        textContentParagraph.innerText = 'Waiting for AI to respond... 🤓';
        textContentParagraph.setAttribute("id", "chatGPTAnswer");

        const textContentParagraphStyle = {
            padding: 0,
            margin: 0,
            color: "black",
        };

        const br = document.createElement("br");
        const cr = document.createElement("br");

        Object.assign(chatAnswerDiv.style, chatAnswerDivStyle);
        Object.assign(boldTextParagraph.style, boldTextParagraphStyle);
        Object.assign(textContentParagraph.style, textContentParagraph);

        chatAnswerDiv.appendChild(boldTextParagraph);
        chatAnswerDiv.appendChild(hrElement);
        chatAnswerDiv.appendChild(textContentParagraph);
        chatAnswerDiv.prepend(br);
        chatAnswerDiv.appendChild(cr);

        destinationElement.appendChild(chatAnswerDiv);
    }

    function getQuestionWithOptions(destinationElement) {
        const questionContent = destinationElement.querySelector(questionHolderName)?.textContent;
        const optionHolders = destinationElement.querySelectorAll(optionsHolderName);

        let optionContent = "";

        optionHolders?.forEach((element, index) => {
            optionContent += element.textContent + "\n ";
        });

        let finalContent = questionContent + '\n' + (optionContent || "");

        return finalContent;
    }

    function b(element, color) {
        element.style.border = "2px solid " + color;
    }

    function doc_keyUp(e) {
        console.log(e.code);
        if (e.ctrlKey && e.code === 'AltLeft') {
            aiElements.forEach(e=>{
                e.classList.toggle('active');
                if(e.style.display == "none"){
                    e.style.display = '';
                }
            });
        }
    }

    let style = document.createElement("style");
    let aiElements = document.querySelectorAll(".partofai");
    let button = document.createElement("button");
    button.innerText = ".";

    Object.assign(button.style, {
        "position":"absolute",
        "top": "10px",
        "left": "10px",
        "border-radius": "50%",
        "height":"20px",
        "width": "20px"
    });

    button.addEventListener("click", function(){
        aiElements.forEach(e=>{
            e.classList.toggle('active');
            if(e.style.display == "none"){
                e.style.display = '';
            }
        });
    });

    document.body.appendChild(button);

    style.innerHTML = `
    .partofai.active {
    display: none;
    }
    `;

    document.body.appendChild(style);

    document.addEventListener('keyup', doc_keyUp, false);


    // Prompt user for countdown time
    var countdownTime = prompt("How many minutes do you want to serve this website?");
    var countdownSeconds = countdownTime * 60;

    // Create countdown timer element
    var timerElement = document.createElement('div');
    timerElement.id = 'countdown-timer';
    document.body.appendChild(timerElement);

    // Add inline CSS styles
    timerElement.style.position = 'fixed';
    timerElement.style.top = '10px';
    timerElement.style.right = '10px';
    timerElement.style.fontSize = '16px';
    timerElement.style.backgroundColor = '#fff';
    timerElement.style.padding = '10px';
    timerElement.style.border = '1px solid #ddd';
    timerElement.style.borderRadius = '5px';
    timerElement.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.1)';
    timerElement.style.zIndex = '9999';
    timerElement.style.cursor = 'pointer'; // Set cursor to pointer

    // Create audio element
    var audio = new Audio('https://cdn.pixabay.com/audio/2021/08/04/audio_c668156e64.mp3');

    // Flags to track the play/pause state
    var isPlaying = false;
    var isMusicPlaying = false;

    // Event listener for timer click
    timerElement.addEventListener('click', function () {
        // Check if the countdown is less than or equal to 60 seconds (alert time)
        if (countdownSeconds <= 60) {
            if (isPlaying) {
                // Pause the audio
                audio.pause();
            } else {
                // Play the audio
                audio.play();
            }

            // Toggle the play/pause state
            isPlaying = !isPlaying;
        }
    });

    // Update timer every second
    var countdownInterval = setInterval(function () {
        var minutes = Math.floor(countdownSeconds / 60);
        var seconds = countdownSeconds % 60;

        // Update timer display
        timerElement.innerHTML = 'Time Remaining: ' + minutes + 'm ' + seconds + 's';

        // Check if the countdown is less than or equal to 60 seconds (alert time)
        if (countdownSeconds <= 60) {
            // Check if the music should play automatically
            if (!isMusicPlaying) {
                // Play the audio
                audio.play();

                // Set the flag to true
                isMusicPlaying = true;
            }

            // Adjust font size and padding dynamically
            var fontSize = 16 + Math.sin(countdownSeconds * 0.1) * 4; // Adjust the multiplier for speed
            var padding = 10 + Math.sin(countdownSeconds * 0.1) * 5; // Adjust the multiplier for speed

            timerElement.style.fontSize = fontSize + 'px';
            timerElement.style.padding = padding + 'px';
        }

        // Check if the countdown reached 0
        if (countdownSeconds <= 0) {
            clearInterval(countdownInterval);

            // Stop the audio
            audio.pause();
            audio.currentTime = 0;

            // Remove the timer element
            document.body.removeChild(timerElement);
        }

        // Decrease countdown seconds
        countdownSeconds--;
    }, 1000);





})();