// ==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);
})();