// ==UserScript==
// @name Formify
// @version 4.1
// @description Let AI solve your google forms
// @author rohitaryal
// @license MIT
// @grant GM_addElement
// @grant GM_addStyle
// @grant unsafeWindow
// @namespace https://docs.google.com/
// @match https://docs.google.com/forms/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=docs.google.com
// ==/UserScript==
const css = `body.hidden {
overflow: hidden;
}
.dialog-container * {
margin: 0;
padding: 0;
font-family: system-ui;
box-sizing: border-box;
}
.dialog-container {
position: fixed;
top: 0;
left: 0;
height: 100vh;
width: 100vw;
background-color: rgba(0, 0, 0, 0.836);
z-index: 999;
display: none;
}
.dialog-container .dialog {
z-index: 1000;
position: relative;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 80%;
width: 30rem;
background-color: white;
border-radius: .5rem;
overflow: hidden;
display: flex;
align-items: center;
flex-direction: column;
}
.dialog-container.active {
display: block;
}
.dialog-container .dialog .formify-header {
display: flex;
width: 100%;
padding: .5rem 1rem .5rem .5rem;
gap: 1rem;
align-items: center;
font-size: xx-large;
font-family: system-ui;
border-bottom: 4px solid rgba(0, 0, 255, 0.45);
}
.dialog-container .dialog .formify-header .formify-text {
flex: 1;
}
.dialog-container .dialog .formify-header .formify-text b {
font-weight: 600;
font-size: 1.2em;
background-clip: text;
color: transparent;
background-image: linear-gradient(to right, #159957, #155799, rgb(81, 81, 255));
animation: animateheader 2s linear infinite;
}
@keyframes animateheader {
0%,
100% {
filter: hue-rotate(0deg);
}
100% {
filter: hue-rotate(360deg);
}
}
.dialog-container .dialog .formify-header .close {
cursor: pointer;
transition-duration: .2s;
}
.dialog-container .dialog .formify-header .close:hover {
opacity: .5;
}
.dialog-container .dialog .formify-header .close {
font-size: 2.5rem;
}
.dialog-container .dialog .formify-header .close:active {
transform: scale(1.1);
}
.dialog-container .dialog .form-body {
flex: 1;
width: 100%;
overflow-y: auto;
}
.dialog-container .dialog .form-body ul {
list-style-type: none;
}
.dialog-container .dialog .form-body ul li {
font-size: large;
padding: 1rem;
display: flex;
align-items: center;
border-bottom: 1px solid rgba(0, 0, 255, 0.192);
}
.dialog-container .dialog .form-body ul li code {
background-color: rgba(128, 128, 128, 0.084);
padding: .2em;
border-radius: 5px;
color: rgb(21, 21, 21);
}
.dialog-container .dialog .form-body ul label {
flex: 1;
font-size: 1.2rem;
padding: .5rem 0;
}
.dialog-container .dialog .form-body ul input,
.dialog-container .dialog .form-body ul select {
outline: none;
border: 2px solid rgba(0, 0, 255, 0.192);
font-size: 1.2rem;
padding: .5rem;
width: 60%;
border-radius: .5rem;
background-color: transparent;
}
.dialog-container .dialog .form-footer {
width: 100%;
display: flex;
padding: .1rem .5rem;
gap: .5rem;
align-items: center;
border-top: 2px solid rgba(0, 0, 0, 0.107);
}
.dialog-container .dialog .form-footer img {
cursor: pointer;
text-decoration: none;
}
.dialog-container .dialog .form-footer a {
text-decoration: none;
color: #155799;
}
.ai-container {
overflow: hidden;
display: flex;
flex-direction: column;
height: fit-content;
margin: .5rem;
border-radius: 1rem;
box-shadow: rgba(0, 0, 0, 0.15) 0px 2px 8px;
}
.ai-container.inactive {
display: none;
}
.ai-container .container-header {
display: flex;
padding: .5rem 1rem;
align-items: center;
background-color: rgba(0, 0, 255, 0.192);
justify-content: space-between;
border-bottom: 1px solid rgba(0, 0, 0, 0.201);
}
.ai-container .container-header .buttons button {
border: none;
cursor: pointer;
padding: .5rem;
border-radius: .3rem;
background-color: transparent;
}
.ai-container .container-header .buttons button:hover {
color: white;
background-color: rgba(0, 0, 0, 0.322);
}
.ai-container .container-body {
padding: 1rem;
color: rgb(20, 20, 34);
}
.aiChatDialog {
position: fixed; /* Stay in place on the screen */
top: 0; /* stick to the top */
right: 0; /* stick to the right */
transform: translate(0,0); /* Reset transform properties, crucial */
background-color: #f9f9f9;
border: 1px solid #ccc;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
width: 300px;
height: 400px;
display: none;
flex-direction: column;
border-radius: 5px;
overflow: hidden;
z-index: 1000;
left: auto; /* Add this to ensure it doesn't try to be on the left */
}
.dialogHeader {
background-color: #ddd;
padding: 10px;
cursor: move;
display: flex;
justify-content: space-between;
align-items: center;
}
.closeButton {
cursor: pointer;
font-size: 16px;
}
.chatHistory {
flex-grow: 1;
padding: 10px;
overflow-y: auto;
}
.chatInputArea {
padding: 10px;
border-top: 1px solid #ccc;
display: flex;
outline: none;
align-items: center;
}
.messageInput {
flex-grow: 1;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
margin-right: 5px;
}
.sendButton {
padding: 8px 12px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.message {
margin-bottom: 5px;
padding: 8px;
border-radius: 5px;
}
.userMessage {
background-color: #DCF8C6;
text-align: right;
}
.aiMessage {
background-color: #ECE5DD;
text-align: left;
}
@media(max-width: 600px) {
.dialog-container .dialog {
width: 25rem;
}
}
`;
const js = `const overlay = document.querySelector(".dialog-container");
const dialog = document.querySelector(".dialog-container .dialog");
const closeButton = document.querySelector(".dialog-container .dialog .formify-header .close");
const apiField = document.querySelector('.dialog-container .dialog input#apikey');
const modelSelect = document.querySelector('.dialog-container .dialog select#ai-model');
const searchEngineSelect = document.querySelector('.dialog-container .dialog select#search-engine');
const customPromptField = document.querySelector('.dialog-container .dialog input#custom-prompt');
const setItem = (key, value) => {
const storage = localStorage.getItem('formify');
const parsedStorage = JSON.parse(storage || '{}');
parsedStorage[key] = value;
localStorage.setItem('formify', JSON.stringify(parsedStorage));
}
const getItem = (key) => {
const storage = localStorage.getItem('formify');
const parsedStorage = JSON.parse(storage || '{}');
return parsedStorage[key];
}
const apiKey = getItem('apiKey');
const model = getItem('model');
const searchEngine = getItem('searchURL');
const customPrompt = getItem('customPrompt');
if (!model)
setItem('model', "gemini-2.0-flash-lite");
if (!searchEngine)
setItem('searchURL', "https://www.google.com/search?q=");
if (!customPrompt)
setItem("customPrompt", "Your answer must include one of the options i provided here and please answer shortly and no markdown like response allowed, plain text and write the full answer, provide short description if possible");
// Re-assigning values to the fields
apiField.value = getItem('apiKey');
modelSelect.value = getItem('model');
searchEngineSelect.value = getItem('searchURL');
customPromptField.value = getItem('customPrompt');
overlay.addEventListener('click', (e) => {
if (
e.target === overlay ||
e.target === closeButton
) {
overlay.classList.toggle("active");
}
});
apiField.addEventListener('input', (e) => {
const apiKey = e.target.value;
setItem('apiKey', apiKey);
});
modelSelect.addEventListener('change', (e) => {
const selectedModel = e.target.value;
setItem('model', selectedModel);
});
searchEngineSelect.addEventListener('change', (e) => {
const selectedEngine = e.target.value;
setItem('searchURL', selectedEngine);
});
customPromptField.addEventListener('input', (e) => {
const promptValue = e.target.value;
setItem('customPrompt', promptValue);
});`;
// src/utils/parsers/HTMLFormParser.ts
var formHeaderParser = (form) => {
const formContentContainer = form.querySelector(".lrKTG");
if (!formContentContainer)
throw new Error("[!] Form content not found. Are you sure you are providing correct form?");
const formHeader = formContentContainer.querySelector(".m7w29c.O8VmIc.tIvQIf");
if (!formHeader)
console.warn("[W] Form header was not found");
const formTitleContainer = formHeader?.querySelector(".ahS2Le");
const formDescriptionContainer = formHeader?.querySelector(".cBGGJ.OIC90c");
return {
formTitle: formTitleContainer?.textContent || document.title,
formDescription: formDescriptionContainer?.textContent || ""
};
};
var formQuestionParser = (form) => {
if (!(form instanceof HTMLFormElement))
throw new Error("[!] I strictly require HTMLFormElement to parse header");
const questionContainer = form.querySelector(".o3Dpx[role='list']");
if (!questionContainer)
throw new Error("Question container is missing. Are you sure you are providing correct form?");
const questionList = questionContainer.querySelectorAll(".Qr7Oae[role='listitem']");
if (!questionList.length)
console.warn("[W] No questions found.");
const parsedQuestions = [...questionList]?.map((questionContainer2) => {
const infoContainerDiv = questionContainer2.querySelector("div[jsmodel='CP1oW']");
const dataParams = infoContainerDiv?.getAttribute("data-params");
const betterDataParams = dataParams?.replace("%.@.", "[").replace(/"/g, "'");
const question = JSON.parse(betterDataParams || "[]")[0];
if (!question) {
return {
title: "",
moreInfo: "",
type: -1,
id: "",
required: false,
options: []
};
}
const questionTitle = question[1];
const extraInformation = question[9] || null;
const questionType = question[3];
const submitID = question[4][0][0];
const isRequiredQuestion = question[4][0][2];
const options = question[4][0][1]?.map((option) => {
return {
value: option[0],
moreInfo: option[5] || null
};
});
return {
title: questionTitle,
moreInfo: extraInformation,
type: questionType,
id: submitID,
required: isRequiredQuestion,
options
};
});
return parsedQuestions;
};
var parse = () => {
const form = document.querySelector("form#mG61Hd");
if (!form) {
throw new Error("Form element not found");
}
const { formDescription, formTitle } = formHeaderParser(form);
const parsedQuestionList = formQuestionParser(form);
return {
title: formTitle,
description: formDescription,
questions: parsedQuestionList
};
};
// src/utils/Utils.ts
var groupedLog = (title, ...args) => {
console.groupCollapsed(title);
args.forEach((arg) => console.log(arg));
console.groupEnd();
};
// src/utils/StorageUtils.ts
var getItem = (key) => {
const storage = localStorage.getItem("formify");
try {
const parsedStorage = JSON.parse(storage || "{}");
return parsedStorage[key] || null;
} catch (err) {
groupedLog("Failed to parse JSON from localStorage", err);
return null;
}
};
var setItem = (key, value) => {
const storage = localStorage.getItem("formify");
let parsedStorage = {};
try {
parsedStorage = JSON.parse(storage || "{}");
} catch (err) {
groupedLog("Failed to parse JSON from localStorage", err);
}
parsedStorage[key] = value;
localStorage.setItem("formify", JSON.stringify(parsedStorage));
};
// src/utils/NetworkUtils.ts
var request = async (requestURL, requestOption = {
method: "GET"
}) => {
if (requestOption.method == "GET" && requestOption.body) {
groupedLog("Removing body from GET request.", requestURL, requestOption);
delete requestOption.body;
}
try {
const response = await fetch(requestURL, requestOption);
const responseBody = await response.text();
if (response.status != 200) {
groupedLog(`Server responded with status ${response.status}`, requestURL, requestOption, responseBody);
} else {
groupedLog("Server responded successfully", requestURL, requestOption, responseBody);
}
return {
success: response.status == 200,
response: responseBody,
statusText: response.statusText
};
} catch (err) {
groupedLog("Failed to send request.", requestURL, requestOption, err);
return {
success: false,
statusText: "ERROR",
response: err instanceof Error ? err.message : String(err)
};
}
};
// src/utils/AIUtils.ts
var getAIResponse = async (prompt2) => {
const model = getItem("model") || "gemini-2.0-flash";
if (model == "gemini-2.0-flash" || model == "gemini-2.0-pro-experimental" || model == "gemini-2.0-flash-lite" || model == "gemini-2.0-pro-exp-02-05") {
return getGeminiResponse(prompt2);
} else {
return "Model not supported for now: " + model;
}
};
var getGeminiResponse = async (prompt2) => {
const model = getItem("model") || "gemini-2.0-flash";
const apiKey = getItem("apiKey") || "";
const response = await request(`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`, {
headers: new Headers({
"Content-Type": "application/json"
}),
method: "POST",
body: JSON.stringify({
contents: [{
parts: [
{
text: prompt2.prompt
}
]
}]
})
});
if (!response.success) {
return "Failed to fetch: " + response.statusText;
}
try {
const parsedContent = JSON.parse(response.response);
return parsedContent?.candidates?.[0]?.content?.parts?.[0]?.text;
} catch (err) {
return "Failed to parse response: " + err.message;
}
};
// src/utils/DOMUtils.ts
var answerModal = ({ options, question, answer }) => {
const div = document.createElement("div");
div.classList.add("ai-container");
const header = document.createElement("span");
header.classList.add("container-header");
const modelNameSpan = document.createElement("span");
modelNameSpan.classList.add("model-name");
modelNameSpan.textContent = `\uD83E\uDD95 ${getItem("model") || "gemini-2.0-flash"}`;
const buttons = document.createElement("span");
buttons.classList.add("buttons");
const body = document.createElement("span");
body.classList.add("container-body");
body.textContent = answer;
const option = options?.map((option2) => option2.value)?.join(" ") || "";
const buttonConfigs = [
{
id: "copy",
title: "Copy answer to clipboard",
text: "Copy",
onclick: (e) => {
e.preventDefault();
navigator.clipboard.writeText(answer);
e.target.textContent = "Copied";
setTimeout(() => {
e.target.textContent = "Copy";
}, 2000);
}
},
{
id: "regenerate",
title: "Re-generate answer",
text: "Re-generate",
onclick: async (e) => {
e.preventDefault();
body.textContent = "Re-generating answer... \uD83E\uDD95";
const response = await getAIResponse({
prompt: getItem("customPrompt") + `
` + question + option
});
body.textContent = response;
}
},
{
id: "open-chat",
title: "Open this question in chat",
text: "Open in Chat",
onclick: (e) => {
e.preventDefault();
openAIChat();
sendMessage(getItem("customPrompt") + `
` + question + option);
}
},
{
id: "search",
title: "Search this question",
text: "Search",
onclick: (e) => {
const anchor = document.createElement("a");
anchor.href = (getItem("searchURL") || "https://www.google.com/search?q=") + question + option;
anchor.target = "_blank";
anchor.click();
}
}
];
buttonConfigs.forEach(({ id, title, text, onclick }) => {
const button = document.createElement("button");
button.setAttribute("type", "button");
button.id = id;
button.title = title;
button.textContent = text;
buttons.appendChild(button);
button.addEventListener("click", onclick);
});
header.appendChild(modelNameSpan);
header.appendChild(buttons);
div.appendChild(header);
div.appendChild(body);
return div;
};
var toggleDialog = (force) => {
const dialog = document.querySelector(".dialog-container");
if (!dialog) {
groupedLog("Dialog container not found");
return;
}
if (force === true) {
dialog.classList.remove("hidden");
} else if (force === false) {
dialog.classList.add("active");
} else {
dialog.classList.toggle("active");
}
};
var toggleAnswers = (force) => {
const aiResponse = document.querySelectorAll(".ai-container");
aiResponse.forEach((response) => {
if (force === true) {
response.classList.remove("inactive");
} else if (force === false) {
response.classList.add("inactive");
} else {
response.classList.toggle("inactive");
}
});
};
var dialogWidth = "300px";
var dialogHeight = "400px";
var aiChatDialog = null;
var chatHistory;
var messageInput;
var isDragging = false;
var offsetX;
var offsetY;
function addMessage(text, isUser) {
const messageElement = document.createElement("div");
messageElement.classList.add("message");
messageElement.classList.add(isUser ? "userMessage" : "aiMessage");
messageElement.textContent = text;
chatHistory.appendChild(messageElement);
chatHistory.scrollTop = chatHistory.scrollHeight;
}
async function sendMessage(msg = "") {
const message = messageInput.value.trim() || msg;
if (message) {
addMessage(message, true);
messageInput.value = "";
try {
const aiResponse = await getAIResponse({ prompt: message });
addMessage(aiResponse, false);
} catch (error) {
addMessage("Error: Could not get AI response.", false);
console.error("Error fetching AI response:", error);
}
}
}
function createAIChatDialog() {
aiChatDialog = document.createElement("div");
aiChatDialog.id = "aiChatDialog";
aiChatDialog.style.width = dialogWidth;
aiChatDialog.style.height = dialogHeight;
const dialogHeader = document.createElement("div");
dialogHeader.id = "dialogHeader";
const headerText = document.createTextNode("Formify");
dialogHeader.appendChild(headerText);
const closeButton = document.createElement("span");
closeButton.id = "closeButton";
const closeText = document.createTextNode("×");
closeButton.appendChild(closeText);
chatHistory = document.createElement("div");
chatHistory.id = "chatHistory";
const chatInputArea = document.createElement("div");
chatInputArea.id = "chatInputArea";
messageInput = document.createElement("input");
messageInput.type = "text";
messageInput.id = "messageInput";
messageInput.placeholder = "Type your message...";
const sendButton = document.createElement("button");
sendButton.id = "sendButton";
const sendText = document.createTextNode("Send");
sendButton.appendChild(sendText);
dialogHeader.appendChild(closeButton);
chatInputArea.appendChild(messageInput);
chatInputArea.appendChild(sendButton);
aiChatDialog.appendChild(dialogHeader);
aiChatDialog.appendChild(chatHistory);
aiChatDialog.appendChild(chatInputArea);
closeButton.addEventListener("click", closeAIChat);
sendButton.addEventListener("click", () => sendMessage());
messageInput.addEventListener("keydown", (event) => {
if (event.key === "Enter") {
sendMessage();
}
});
dialogHeader.addEventListener("mousedown", (e) => {
isDragging = true;
offsetX = e.clientX - aiChatDialog.offsetLeft;
offsetY = e.clientY - aiChatDialog.offsetTop;
});
document.addEventListener("mouseup", () => {
isDragging = false;
});
document.addEventListener("mousemove", (e) => {
if (!isDragging)
return;
let newX = e.clientX - offsetX;
let newY = e.clientY - offsetY;
const maxX = window.innerWidth - aiChatDialog.offsetWidth;
const maxY = window.innerHeight - aiChatDialog.offsetHeight;
newX = Math.max(0, Math.min(newX, maxX));
newY = Math.max(0, Math.min(newY, maxY));
aiChatDialog.style.left = newX + "px";
aiChatDialog.style.top = newY + "px";
aiChatDialog.style.right = "auto";
});
aiChatDialog.classList.add("aiChatDialog");
dialogHeader.classList.add("dialogHeader");
closeButton.classList.add("closeButton");
chatHistory.classList.add("chatHistory");
chatInputArea.classList.add("chatInputArea");
messageInput.classList.add("messageInput");
sendButton.classList.add("sendButton");
document.body.appendChild(aiChatDialog);
addMessage("Starting conversation...", false);
return aiChatDialog;
}
function closeAIChat() {
if (aiChatDialog) {
aiChatDialog.style.display = "none";
}
}
function openAIChat() {
if (!aiChatDialog) {
createAIChatDialog();
}
aiChatDialog.style.display = "flex";
}
var ready = () => {
const dialogContainer = document.createElement("div");
dialogContainer.className = "dialog-container";
const dialog = document.createElement("div");
dialog.className = "dialog";
const header = document.createElement("span");
header.className = "formify-header";
const logo = document.createElement("img");
logo.alt = "F is for Formify";
logo.height = 40;
logo.src = "data:image/png;base64,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";
const headerText = document.createElement("span");
headerText.className = "formify-text";
const boldText = document.createElement("b");
boldText.innerText = "Formify";
headerText.appendChild(boldText);
const closeBtn = document.createElement("span");
closeBtn.className = "close";
closeBtn.innerText = "×";
header.appendChild(logo);
header.appendChild(headerText);
header.appendChild(closeBtn);
const formBody = document.createElement("span");
formBody.className = "form-body";
const ul = document.createElement("ul");
const listItems = [
{ label: "API Key", type: "text", id: "apikey", placeholder: "Paste API key here" },
{
label: "AI Model",
type: "select",
id: "ai-model",
options: [
{ value: "gemini-2.0-pro-exp-02-05", text: "Gemini 2.0 Pro Experimental" },
{ value: "gemini-2.0-flash", text: "Gemini 2.0 Flash" },
{ value: "gemini-2.0-flash-lite", text: "Gemini 2.0 Flash-Lite" },
{ value: "gemini-1.5-pro", text: "Gemini 1.5 Pro" },
{ value: "gpt-4.5-preview", text: "gpt-4.5-preview" },
{ value: "gpt-4o-mini", text: "gpt-4o-mini" }
]
},
{
label: "Search Engine",
type: "select",
id: "search-engine",
options: [
{ value: "https://www.google.com/search?q=", text: "Google" },
{ value: "https://chatgpt.com/?q=", text: "ChatGPT Search" },
{ value: "https://www.bing.com/search?q=", text: "Bing" },
{ value: "https://search.yahoo.com/search?p=", text: "Yahoo" },
{ value: "https://duckduckgo.com/?q=", text: "DuckDuckGo" },
{ value: "https://www.baidu.com/s?wd=", text: "Baidu" },
{ value: "https://www.yandex.com/search/?text=", text: "Yandex" },
{ value: "https://www.ecosia.org/search?q=", text: "Ecosia" },
{ value: "https://www.ask.com/web?q=", text: "Ask" },
{ value: "https://www.startpage.com/do/search?q=", text: "Startpage" },
{ value: "https://search.brave.com/search?q=", text: "Brave Search" }
]
},
{ label: "Custom Prompt", type: "text", id: "custom-prompt", placeholder: "Custom prompt to feed the model" },
{ label: "Dialog Shortcuts", type: "code", value: "ALT + K" },
{ label: "AI Response hide/unhide", type: "code", value: "ALT + M" }
];
listItems.forEach((item) => {
const li = document.createElement("li");
const label = document.createElement("label");
label.innerText = item.label;
if (item.type === "text") {
const input = document.createElement("input");
input.type = "text";
input.setAttribute("name", item.id || "");
input.setAttribute("id", item.id || "");
input.setAttribute("placeholder", item.placeholder || "");
li.appendChild(label);
li.appendChild(input);
} else if (item.type === "select") {
const select = document.createElement("select");
select.setAttribute("name", item.id || "");
select.setAttribute("id", item.id || "");
item.options.forEach((optionData) => {
const option = document.createElement("option");
option.setAttribute("value", optionData.value);
option.textContent = optionData.text;
select.appendChild(option);
});
li.appendChild(label);
li.appendChild(select);
} else if (item.type === "code") {
const code = document.createElement("code");
code.textContent = item.value || "";
li.appendChild(label);
li.appendChild(code);
}
ul.appendChild(li);
});
formBody.appendChild(ul);
const formFooter = document.createElement("span");
formFooter.className = "form-footer";
const footerLinks = [
{ href: "https://github.com/rohitaryal/formify", text: "Submit a bug ↗" },
{ href: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", text: "Hmm ↗" }
];
footerLinks.forEach((linkData) => {
const link = document.createElement("a");
link.target = "_blank";
link.href = linkData.href;
link.innerText = linkData.text;
formFooter.appendChild(link);
});
dialog.appendChild(header);
dialog.appendChild(formBody);
dialog.appendChild(formFooter);
dialogContainer.appendChild(dialog);
document.body.appendChild(dialogContainer);
};
// src/index.ts
(async function() {
GM_addStyle(css);
ready();
GM_addElement("script", {
textContent: js
});
let apiKey = getItem("apiKey");
if (!apiKey) {
apiKey = prompt("Please paste your API key, you can generate free api key from: https://aistudio.google.com/apikey");
if (apiKey) {
setItem("apiKey", apiKey);
} else {
alert("API key is required to interact with the AI model.");
}
}
document.addEventListener("keydown", (e) => {
if (e.altKey && e.key == "k" || e.key == "Escape") {
toggleDialog();
}
if (e.key == "m" && e.altKey) {
toggleAnswers();
}
});
let scrapedContent = parse();
const questionContainers = document.querySelectorAll(".Qr7Oae[role='listitem']");
for (let i = 0;i < questionContainers.length; i++) {
const questionContainer = questionContainers[i];
const question = scrapedContent.questions[i];
const prompt2 = getItem("customPrompt") + `
` + question.title + (question.options?.map((option) => option.value + ", ") || "");
const aiAnswer = await getAIResponse({ prompt: prompt2 });
const options = questionContainer.querySelectorAll("label");
for (const option of options || []) {
const betterOptionText = option.textContent?.trim();
const betterAiAnswer = aiAnswer.trim();
if (betterAiAnswer.includes(betterOptionText)) {
if (question.type == 2 || question.type == 4) {
option.click();
if (question.type == 2) {
break;
}
}
}
}
const answer = answerModal({
question: question.title,
options: question.options,
answer: aiAnswer
});
questionContainer.appendChild(answer);
}
})();