// ==UserScript== // @name Khan Academy Problem Solver // @version 3.1 // @description Here is a Khan Academy Solver! // @author Logzilla6 // @match https://www.khanacademy.org/* // @grant none // @namespace https://greasyfork.org/users/783447 // @downloadURL none // ==/UserScript== (function () { let overlayHTML = `

KhanHack

` function get(x) { return document.getElementById(x); } let overlay = document.createElement("div"); overlay.innerHTML = overlayHTML; document.body.appendChild(overlay); let acc = get("accordian"), darkToggle = get("darkToggle"), ansbutton = get("inputans"), ansbutton2 = get("inputans2") acc.onclick = function() { let panel = get("box2"); let acc = get("accordian") if (panel.style.display == "grid") panel.style.display = "none"; else { panel.style.display = "grid";} } document.addEventListener('keydown', (event) => { if (event.key === 'm') { let panel = get("box2"); if (panel.style.display == "grid") panel.style.display = "none"; else { panel.style.display = "grid"; } } }); 'use strict'; window.loaded = false; class Answer { constructor(answer, type) { this.body = answer; this.type = type; } get isMultiChoice() { return this.type == "multiple_choice"; } get isFreeResponse() { return this.type == "free_response"; } get isExpression() { return this.type == "expression"; } get isDropdown() { return this.type == "dropdown"; } } const originalFetch = window.fetch; window.fetch = function () { return originalFetch.apply(this, arguments).then((res) => { if (res.url.includes("/getAssessmentItem")) { const clone = res.clone(); clone.json().then(json => { let item, question; try { item = json.data.assessmentItem.item.itemData; question = JSON.parse(item).question; } catch { let errorIteration = () => { return localStorage.getItem("error_iter") || 0; } localStorage.setItem("error_iter", errorIteration() + 1); if (errorIteration() < 4) { return location.reload(); } else { return alert("An error occurred"); } } if (!question) return; Object.keys(question.widgets).map(widgetName => { switch (widgetName.split(" ")[0]) { case "numeric-input": return freeResponseAnswerFrom(question); case "radio": return multipleChoiceAnswerFrom(question); case "expression": return expressionAnswerFrom(question); case "dropdown": return dropdownAnswerFrom(question); } }); }); } return res; }) } function freeResponseAnswerFrom(question) { const answer = Object.values(question.widgets).map((widget) => { if (widget.options?.answers) { return widget.options.answers.map(answer => { if (answer.status == "correct") { //alert('freeresponse') var ans1 = document.getElementById('ans1').innerHTML var ans2 = document.getElementById('ans2').innerHTML document.getElementById('ans2').innerHTML = (answer.value) document.getElementById('ans1').innerHTML = (ans2) } }); } }).flat().filter((val) => { return val !== undefined; }); return new Answer(answer, "free_response"); } function multipleChoiceAnswerFrom(question) { const answer = Object.values(question.widgets).map((widget) => { if (widget.options?.choices) { return widget.options.choices.map(choice => { if (choice.correct) { //alert('multichoice') var ans1 = document.getElementById('ans1').innerHTML var ans2 = document.getElementById('ans2').innerHTML document.getElementById('ans2').innerHTML = (choice.content) document.getElementById('ans1').innerHTML = (ans2) } }); } }).flat().filter((val) => { return val !== undefined; }); return new Answer(answer, "multiple_choice"); } function expressionAnswerFrom(question) { const answer = Object.values(question.widgets).map((widget) => { if (widget.options?.answerForms) { return widget.options.answerForms.map(answer => { if (Object.values(answer).includes("correct")) { //alert('expression') ansbutton.style.display = "grid" ansbutton2.style.display = "grid" var ans1 = document.getElementById('ans1').innerHTML var ans2 = document.getElementById('ans2').innerHTML var ans1val = document.getElementById('ans1').value document.getElementById('ans2').innerHTML = (answer.value) document.getElementById('ans1').innerHTML = (ans2) ansbutton.onclick = function() { prompt("Copy and paste this into the answer box", (document.getElementById('ans1').innerHTML)) } ansbutton2.onclick = function() { prompt("Copy and paste this into the answer box", (document.getElementById('ans2').innerHTML)) } } }); } }).flat(); return new Answer(answer, "expression"); ansbutton.style.display = "none" ansbutton2.style.display = "none" } function dropdownAnswerFrom(question) { const answer = Object.values(question.widgets).map((widget) => { if (widget.options?.choices) { return widget.options.choices.map(choice => { if (choice.correct) { //alert('dropdown') var ans1 = document.getElementById('ans1').innerHTML var ans2 = document.getElementById('ans2').innerHTML var ans3 = document.getElementById('ans3').innerHTML var ans4 = document.getElementById('ans4').innerHTML var ans5 = document.getElementById('ans5').innerHTML document.getElementById('ans2').innerHTML = (choice.content) document.getElementById('ans1').innerHTML = (ans2) document.getElementById('ans5').innerHTML = (choice.content) document.getElementById('ans4').innerHTML = (ans5) document.getElementById('ans3').innerHTML = (ans4) } }); } }).flat(); return new Answer(answer, "dropdown"); } })();