// ==UserScript== // @name Khan Academy Problem Solver // @version 1.2 // @description Here is a Khan Solver! // @author Logzilla6 // @match https://www.khanacademy.org/* // @grant none // @namespace https://greasyfork.org/users/783447 // @downloadURL none // ==/UserScript== (function () { 'use strict'; window.loaded = false; alert("Solver Will Say Answers For Problem 1 and 2,"+"\n"+ "then after solving problem 1, Solver Will then give answer to 3, then 4 and so on."); 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"; } log() { const answer = this.body; const style = "color: coral; -webkit-text-stroke: .5px black; font-size:24px; font-weight:bold;"; answer.map(ans => { if (typeof ans == "string") { if (ans.includes("web+graphie")) { this.body[this.body.indexOf(ans)] = ""; this.printImage(ans); } else { answer[answer.indexOf(ans)] = ans.replaceAll("$", ""); } } }); const text = answer.join("\n"); if (text) { console.log(`${text.trim()}`, style); } } printImage(ans) { const url = ans.replace("![](web+graphie", "https").replace(")", ".svg"); const image = new Image(); image.src = url; image.onload = () => { const imageStyle = [ 'font-size: 1px;', 'line-height: ', this.height % 2, 'px;', 'padding: ', this.height * .5, 'px ', this.width * .5, 'px;', 'background-size: ', this.width, 'px ', this.height, 'px;', 'background: url(', url, ');' ].join(' '); console.log('', imageStyle); }; } } 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("%c An error occurred", "color: red; font-weight: bolder; font-size: 20px;"); } } if (!question) return; Object.keys(question.widgets).map(widgetName => { switch (widgetName.split(" ")[0]) { case "numeric-input": return freeResponseAnswerFrom(question).log(); case "radio": return multipleChoiceAnswerFrom(question).log(); case "expression": return expressionAnswerFrom(question).log(); case "dropdown": return dropdownAnswerFrom(question).log(); } }); }); } if (!window.loaded) { console.clear(); console.log("%c Color Picker ", "color: mediumvioletred; -webkit-text-stroke: .5px black; font-size:40px; font-weight:bolder; padding: .2rem;"); console.log("%c Created by Logzilla6", "color: white; -webkit-text-stroke: .5px black; font-size:15px; font-weight:bold;"); window.loaded = true; } 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") { return alert("Answer: If it is really long, just paste the whole thing in!"+"\n"+answer.value); } }); } }).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) { return alert("Answer:"+"\n"+choice.content); } }); } }).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")) { return alert("Answer:"+"\n"+answer.value); } }); } }).flat(); return new Answer(answer, "expression"); } function dropdownAnswerFrom(question) { const answer = Object.values(question.widgets).map((widget) => { if (widget.options?.choices) { return widget.options.choices.map(choice => { if (choice.correct) { return alert("Answer:"+"\n"+choice.content); } }); } }).flat(); return new Answer(answer, "dropdown"); } })();