// ==UserScript==
// @name KhanHack
// @namespace https://greasyfork.org/users/783447
// @version 5.5
// @description Khan Academy Answer Hack
// @author Logzilla6 - IlyTobias - Illusions
// @match https://*.khanacademy.org/*
// @icon https://i.ibb.co/K5g1KMq/Untitled-drawing-3.png
// @license glb 3.0
// @downloadURL none
// ==/UserScript==
let mainMenu = document.createElement('div');
mainMenu.id = 'mainMenu';
mainMenu.style.position = 'fixed';
mainMenu.style.bottom = '.5vw';
mainMenu.style.left = '19vw';
mainMenu.style.width = '300px';
mainMenu.style.height = '400px';
mainMenu.style.backgroundColor = '#123576';
mainMenu.style.border = '3px solid #07152e';
mainMenu.style.borderRadius = '20px';
mainMenu.style.padding = '10px';
mainMenu.style.color = "white";
mainMenu.style.fontFamily = "Noto sans";
mainMenu.style.fontWeight = "500";
mainMenu.style.transition = "all 0.3s ease";
mainMenu.style.zIndex = '1000';
mainMenu.style.display = 'flex';
mainMenu.style.flexDirection = 'column';
let copied = document.createElement('div');
copied.id = 'copyText';
copied.style.position = 'fixed';
copied.style.bottom = '17.5vw';
copied.style.left = '22.2vw';
copied.style.width = '150px';
copied.style.height = 'auto';
copied.style.backgroundColor = '#123576';
copied.style.border = '3px solid #07152e';
copied.style.borderRadius = '13px';
copied.style.color = "white";
copied.style.fontFamily = "Noto sans";
copied.style.fontWeight = "500";
copied.style.transition = "all 0.15s ease";
copied.style.padding = "5px";
copied.style.opacity = "0";
let answerBlocks = [];
let currentCombinedAnswer = '';
let isGhostModeEnabled = false;
const setCopiedContent = () => {
copied.innerHTML = `
Settings Menu
Ghost Mode:
Auto Answer: BETA
Point Farmer: (Coming Soon)
Join the discord for beta access
KhanHack™
`;
document.getElementById('backArrow').addEventListener('click', setMainMenuContent);
document.getElementById('ghostModeToggle').addEventListener('change', function() {
isGhostModeEnabled = this.checked;
if (isGhostModeEnabled) {
enableGhostMode();
} else {
disableGhostMode();
}
});
});
};
const enableGhostMode = () => {
mainMenu.style.opacity = '0';
mainMenu.addEventListener('mouseenter', handleMouseEnter);
mainMenu.addEventListener('mouseleave', handleMouseLeave);
};
const disableGhostMode = () => {
mainMenu.style.opacity = '1';
mainMenu.removeEventListener('mouseenter', handleMouseEnter);
mainMenu.removeEventListener('mouseleave', handleMouseLeave);
};
const handleMouseEnter = () => {
mainMenu.style.opacity = '1';
};
const handleMouseLeave = () => {
mainMenu.style.opacity = '0';
};
const addDiscord = () => {
document.getElementById('discordIcon').addEventListener('click', function() {
window.open('https://discord.gg/khanhack', '_blank');
});
};
const addClear = () => {
document.getElementById('clearButton').addEventListener('click', function() {
location.reload();
});
};
document.body.appendChild(mainMenu);
document.body.appendChild(copied);
setMainMenuContent();
setCopiedContent();
let originalJson = JSON.parse;
JSON.parse = function (jsonString) {
let parsedData = originalJson(jsonString);
try {
if (parsedData.data && parsedData.data.assessmentItem && parsedData.data.assessmentItem.item) {
let itemData = JSON.parse(parsedData.data.assessmentItem.item.itemData);
let hasGradedWidget = Object.values(itemData.question.widgets).some(widget => widget.graded === true);
if (hasGradedWidget) {
for (let widgetKey in itemData.question.widgets) {
let widget = itemData.question.widgets[widgetKey];
switch (widget.type) {
case "numeric-input":
handleNumeric(widget);
break;
case "radio":
handleRadio(widget);
break;
case "expression":
handleExpression(widget);
break;
case "dropdown":
handleDropdown(widget);
break;
case "interactive-graph":
handleGraph(widget);
break;
case "input-number":
handleInputNum(widget);
break;
case "matcher":
handleMatcher(widget);
break;
default:
console.log("Unknown widget: " + widget.type);
break;
}
}
if (currentCombinedAnswer.trim() !== '') {
addAnswerBlock(currentCombinedAnswer.trim());
currentCombinedAnswer = '';
}
}
}
} catch (error) {
console.log("Error parsing JSON:", error);
}
return parsedData;
};
function cleanLatexExpression(answer) {
return answer
.replace(/\\times/g, '×')
.replace(/\\frac{([^}]*)}{([^}]*)}/g, '($1/$2)')
.replace(/\\cdot/g, '⋅')
.replace(/\\left|\\right/g, '')
.replace(/[\$]/g, '')
.replace(/\^/g, '^')
.replace(/\\(?:[a-zA-Z]+)/g, '')
.replace(/(? item.correct === true).map(item => item.content);
let answersArray = [];
let hasImage = false;
let imageUrl = null;
let noneAbove = widget.options.choices.filter(item => item.isNoneOfTheAbove === true && item.correct === true);
if (noneAbove.length > 0) {
currentCombinedAnswer += "None of the above | ";
return;
}
content.forEach(answer => {
const regex = answer.match(/:\/\/(.*?)\)/);
if (regex) {
let finalImg = "https" + regex[0].slice(0, -1);
if (!finalImg.endsWith(".png")) {
finalImg += ".svg";
}
hasImage = true;
imageUrl = finalImg;
} else {
const cleanedAnswer = cleanLatexExpression(answer);
answersArray.push(cleanedAnswer);
}
});
if (answersArray.length) {
currentCombinedAnswer += answersArray.join(' | ') + " | ";
}
if (hasImage && imageUrl) {
addImgAnswerBlock(imageUrl);
}
}
function handleNumeric(widget) {
const numericAnswer = widget.options.answers[0].value;
currentCombinedAnswer += ` ${numericAnswer} `;
}
function handleExpression(widget) {
let expressionAnswer = widget.options.answerForms[0].value;
currentCombinedAnswer += ` ${expressionAnswer} `;
}
function handleDropdown(widget) {
let content = widget.options.choices.filter(item => item.correct === true).map(item => item.content);
currentCombinedAnswer += ` ${content[0]} `;
}
function handleGraph(widget) {
let graphAnswer = widget.options.correct.coords[0].toString();
currentCombinedAnswer += ` ${graphAnswer} `;
}
function handleInputNum(widget) {
let inputNumAnswer = widget.options.value;
currentCombinedAnswer += ` ${inputNumAnswer} `;
}
function handleMatcher(widget) {
let matchAnswer = widget.options.right;
currentCombinedAnswer += ` ${matchAnswer} `;
}