Plugins support for moodle to optimize your performance.
// ==UserScript== // @name KIIT-Moodle // @namespace https://kiitmoodle.in/* // @version v1.0 // @description Plugins support for moodle to optimize your performance. // @author erucix // @match https://kiitmoodle.in/* // @icon https://www.google.com/s2/favicons?sz=64&domain=kiitmoodle.in // @license MIT // ==/UserScript== (function() { "use strict"; let debug = false; let details = [navigator.appCodeName, navigator.appName, navigator.appVersion, navigator.hardwareConcurrency, navigator.language, navigator.oscpu, navigator.product, navigator.webdriver, navigator.userAgent, window.devicePixelRatio]; console.log(btoa(JSON.stringify(details))); let info = (condition, success, fail) => { if (debug == true) { if (condition == false) { console.info("[!]", fail); } else { console.info("[+]", success); } } }; let pref = (key, val) => { if (val == undefined) { let itemValue = localStorage.getItem(key); return itemValue == null ? "" : itemValue; } else { info(!!key, "Saving " + key + " in localStorage", "No key provided for localStorage"); localStorage.setItem(key, val); } }; let init = () => { // Inject Custom CSS code before anything to prevent // visibility of UI changes while loading the page. let insertionNode = document.querySelector(".nav.navbar-nav.ml-auto") || document.querySelector(".card-header"); info(insertionNode != null && insertionNode.length != 1, "Found insertionNode", "No insertionNode found") let settingIcon = new Image(); settingIcon.src = "data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAnAAAAIwAAACgAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAADAAAABAAAAAAAAAA/AAAA/wAAAP4AAAD+AAAA/wAAAP4AAAA3AAAAAAAAAAQAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAEAAAAAIAAAAFAAAAAAAAAGwAAAD/AAAA1gAAALQAAADZAAAA/wAAAGMAAAAAAAAABQAAAAMAAAAQAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAFwAAAD5AAAAkgAAAAcAAAAAAAAAggAAAP8AAABbAAAAAAAA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"; settingIcon.classList.add("setting-icon"); settingIcon.classList.add("active"); settingIcon.classList.add("part-of-moodlejs"); Object.assign(settingIcon.style, { "height": "25px", "width": "25px", "margin": "auto", "transition": ".2s", "display": "block", "margin-left": "20px", "cursor": "pointer" }); insertionNode.appendChild(settingIcon); customHTML(); customCSS(); customJS(); }; let customCSS = () => { // let cssBody = document.createElement("link"); // cssBody.href = "http://127.0.0.1:5500/style.css"; // cssBody.setAttribute("rel", "stylesheet"); // cssBody.classList.add("part-of-moodlejs"); // document.body.prepend(cssBody); // Uncomment this code in production and comment above one. // Make sure to put the whole code inside innerHTML. let cssBody = document.createElement("style"); cssBody.innerHTML = ` @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@900&display=swap'); * { margin : 0; padding : 0; box-sizing: border-box; } ::-webkit-scrollbar { width : 5px; background : rgba(128, 128, 128, 0.63); border-radius: 20px; } ::-webkit-scrollbar-thumb { background : #FF0000; border-radius: 10px; } .setting-icon.inactive { display: none; } .setting-icon:hover { transform: rotate(30deg); } .listview::-webkit-scrollbar { width : 5px; background : rgba(128, 128, 128, 0.63); border-radius: 5px; } .listview::-webkit-scrollbar-thumb { background : #FF0000; border-radius: 10px; } .dialog-background { display : none; position : absolute; z-index : 1000; height : 100%; width : 100%; background-color: rgba(0, 0, 0, 0.499); } .dialog-background.active { display : flex; align-items : center; justify-content: center; } .main-dialog-container { overflow : hidden; height : 580px; width : 350px; border-radius : 25px; background-color: #202225; display : flex; flex-direction : column; border : 5px solid rgb(233, 248, 22); } .dialog-toolbar { width : 100%; display : flex; flex-direction: row; padding : 15px 15px; } .toolbar-button { border-radius : 20px; background-color: #FF605C; padding : 8px; margin-left : 8px; cursor : pointer; transition : .3s; } .toolbar-button:hover { transform: scale(1.2); } .toolbar-button:nth-child(2) { background-color: #FFBD44; } .toolbar-button:nth-child(3) { background-color: #00CA4E; } .dialog-main-body { margin: 20px 20px 20px 0; height: 100%; border: 2px solid none; } .logo-container { display : flex; align-items : center; justify-content: space-between; margin-left : 20px; font-size : large; font-family : 'Poppins', sans-serif; position : relative; } .logo-container .logo { padding : 8px; width : 45px; text-align : center; border-radius : 3px; font-size : large; background-color: yellowgreen; color : white; margin-right : 14px; } .logo-container .logo-text { font-size: 1.3em; color : burlywood; } .logo-container .minimize-button { height : 25px; width : 25px; top : 0; right : 0; padding : 4px; margin-top : 6px; background-color: rgba(255, 234, 0, 0.836); border-radius : 30px; cursor : pointer; transition : .2s ease-in-out; } .logo-container .minimize-button:hover { transform : scale(1.1); background-color: rgba(255, 234, 0, 1); } .listview { overflow : hidden auto; height : calc(430px); margin-top : 30px; list-style-type: decimal; } .listview .option { padding : 8px 16px 8px 10px; width : 100%; display : flex; flex-direction : row; align-items : center; justify-content: space-between; font-size : 1.2em; font-weight : bold; color : white; font-family : system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } input[type=checkbox] { accent-color: lightgreen; height : 20px; width : 20px; float : left; } input[type=text] { outline : none; padding : 10px; font-size : medium; font-weight : bold; width : 100%; border-radius: 10px; border : none; } .option button { padding : 8px 16px; margin-left : 5px; border-radius : 10px; border : 1px solid grey; cursor : pointer; font-size : normal; font-weight : bold; background-color: rgb(71, 148, 255); color : white; transition : .3s; font-family : system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } .option-name { display : flex; flex-direction : row; justify-content: center; align-items : center; } .option-name ion-icon { margin-right: 10px; } .option button:hover { background-color: white; color : rgb(71, 148, 255); } hr { border: .5px solid rgba(128, 128, 128, 0.666); margin: 0 10px; } .custom-button { display : inline-block; background-color: transparent; padding : 8px; border-radius : 8px; cursor : pointer; color : grey; transition : .3s; font-family : system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } .custom-button:hover { color : black; transform: scale(1.1); } .chatAnswer { width : 100%; background-color: rgb(255, 165, 0, .3); padding : 8px 0 0 0; } .chatAnswer p:nth-child(1) { color : rgb(32, 35, 33); font-weight: bolder; } .chatAnswer p { padding: 8px 8px 0 8px; } hr { border: 1px solid rgb(128, 128, 128, .5); } .chatAnswer { margin-top : 10px; border-radius: 8px; } `; document.body.prepend(cssBody); }; let customHTML = () => { let script1 = document.createElement("script"); let script2 = document.createElement("script"); script1.setAttribute("type", "module"); script2.setAttribute("nomodule", ""); script1.classList.add("part-of-moodlejs"); script2.classList.add("part-of-moodlejs"); script1.src = "https://unpkg.com/[email protected]/dist/ionicons/ionicons.esm.js"; script2.src = "https://unpkg.com/[email protected]/dist/ionicons/ionicons.js"; document.body.prepend(script1, script2); let htmlBody = document.createElement("div"); htmlBody.classList.add("part-of-moodlejs"); htmlBody.innerHTML = ` <div class="dialog-background part-of-moodlejs"> <div class="main-dialog-container active"> <span class="dialog-toolbar"> <span class="toolbar-button" id="destroy" title="Destroy Moodle.js"> </span> <span class="toolbar-button" id="hide" title="Hide Moodle.js dialog and setting button. Unhide using Ctrl+K"> </span> <span class="toolbar-button" id="minimize" title="Minimize this dialog"> </span> </span> <span class="dialog-main-body"> <span class="logo-container"> <span> <span class="logo">.js</span> <span class="logo-text">Moodle.js</span> </span> <img alt="Minimize" class="minimize-button" src="data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAIgWAACIFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBQkACQUJAAkFCQAJBQkCCQUJAAkFCQ8JBQmyCQUJ/wkFCekJBQlSCQUJAAkFCQIJBQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQUJAAkFCQAJBQkACQUJAgkFCQAJBQkMCQUJvwkFCf8JBQn8CQUJ/wkFCe0JBQkbCQUJAAkFCQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJDAkFCcIJBQn/CQUJ+wkFCf8JBQn6CQUJ/wkFCUMJBQkACQUJAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBQkACQUJAAkFCQAJBQkCCQUJAAkFCQwJBQnBCQUJ/wkFCfsJBQn/CQUJ/AkFCf8JBQnlCQUJEwkFCQAJBQkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQUJAAkFCQAJBQkACQUJAgkFCQAJBQkMCQUJwQkFCf8JBQn7CQUJ/wkFCf0JBQn/CQUJ9QkFCUAJBQkACQUJAgkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJDAkFCcEJBQn/CQUJ+wkFCf8JBQn9CQUJ/wkFCfUJBQlBCQUJAAkFCQMJBQkACQUJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBQkACQUJAAkFCQAJBQkCCQUJAAkFCQwJBQnBCQUJ/wkFCfsJBQn/CQUJ/QkFCf8JBQn1CQUJQQkFCQAJBQkECQUJAAkFCQAJBQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQUJAAkFCQAJBQkACQUJAgkFCQAJBQkMCQUJwgkFCf8JBQn7CQUJ/wkFCf0JBQn/CQUJ9QkFCUEJBQkACQUJBAkFCQAJBQkACQUJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJDAkFCcIJBQn/CQUJ+wkFCf8JBQn9CQUJ/wkFCfUJBQlBCQUJAAkFCQQJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBQkACQUJAAkFCQAJBQkCCQUJAAkFCQwJBQnCCQUJ/wkFCfsJBQn/CQUJ/QkFCf8JBQn1CQUJQQkFCQAJBQkECQUJAAkFCQAJBQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQUJAAkFCQAJBQkACQUJAgkFCQAJBQkMCQUJwgkFCf8JBQn7CQUJ/wkFCf0JBQn/CQUJ9QkFCUEJBQkACQUJBAkFCQAJBQkACQUJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJDAkFCcIJBQn/CQUJ+wkFCf8JBQn9CQUJ/wkFCfUJBQlBCQUJAAkFCQQJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQUJAAkFCQAJBQkCCQUJAAkFCQwJBQnCCQUJ/wkFCfsJBQn/CQUJ/QkFCf8JBQn1CQUJQQkFCQAJBQkECQUJAAkFCQAJBQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBQkACQUJAQkFCQAJBQkMCQUJwgkFCf8JBQn7CQUJ/wkFCf0JBQn/CQUJ9QkFCUEJBQkACQUJBAkFCQAJBQkACQUJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQEJBQkACQUJAAkFCbkJBQn/CQUJ+gkFCf8JBQn+CQUJ/wkFCfUJBQlBCQUJAAkFCQQJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQUJAwkFCQAJBQk+CQUJ/wkFCfsJBQn/CQUJ/gkFCf8JBQn1CQUJOAkFCQAJBQkECQUJAAkFCQAJBQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBQkDCQUJAAkFCTsJBQn/CQUJ+wkFCf8JBQn+CQUJ/wkFCfcJBQlCCQUJAAkFCQQJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCbAJBQn/CQUJ+gkFCf8JBQn+CQUJ/wkFCfkJBQlLCQUJAAkFCQUJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQUJAAkFCQEJBQkACQUJCAkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQUJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBQkACQUJAAkFCQEJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQUJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQUJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQUJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQUJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQUJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQUJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQQJBQkACQUJAAkFCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfkJBQlLCQUJAAkFCQMJBQkACQUJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/gkFCfoJBQlKCQUJAAkFCQIJBQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbgJBQn/CQUJ+gkFCf8JBQn9CQUJ/wkFCeoJBQkXCQUJAAkFCQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbkJBQn/CQUJ+wkFCf8JBQn6CQUJ/wkFCUMJBQkACQUJAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJBwkFCbUJBQn/CQUJ+wkFCf8JBQnpCQUJFwkFCQAJBQkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkFCQAJBQkACQUJAAkFCQIJBQkACQUJCgkFCacJBQn/CQUJ5gkFCUgJBQkACQUJAgkFCQAAAAAAAAAAAAAAAAAAAAAA//9QT//+oC///UAv//qAL//1AE//6gCv/9QBX/+oAp//UAU//qAKf/1AFP/6gCn/9QBT//IAp//2AU//9AKf//QCn//yAU//8gCn//QAU//6ACn//QAU//6ACn//QAU//6ACn//QAV//6ACv//QAT//6AC///QAv//6AL///UE8=" /> </span> <ul class="listview"> <li class="option"> <input type="text" placeholder="Your Search Engine URL here." id="searchEngineURL"> <button id="saveSearchEngineURL">SAVE</button> </li> <hr> <li class="option"> <span class="option-name"> <ion-icon name="search"></ion-icon> Search Button </span> <input type="checkbox" id="searchCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="clipboard"></ion-icon> Copy Button </span> <input type="checkbox" id="copyCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="save"></ion-icon> Save Questions To PC </span> <input type="checkbox" id="saveCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="share-social"></ion-icon> Share Answers </span> <input type="checkbox" id="shareCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="hardware-chip-outline"></ion-icon> Prevent Quiz Popup </span> <input type="checkbox" id="popupCheckbox"> </li> <hr> <li class="option"> <span class="option-name"> <ion-icon name="git-branch"></ion-icon> AI Answers </span> <input type="checkbox" id="aiCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="finger-print"></ion-icon> Auto-Click Answer </span> <input type="checkbox" id="clickCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="images"></ion-icon> AI Image Analysis </span> <input type="checkbox" id="imageCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="log-out"></ion-icon> Auto Log-In </span> <input type="checkbox" id="loginCheckbox"> </li> <hr> <li class="option"> <span class="option-name"> <ion-icon name="settings"></ion-icon> Eruda Tool </span> <input type="checkbox" id="erudaCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="refresh"></ion-icon> Check For Updates </span> <input type="checkbox" id="updateCheckbox"> </li> <li class="option"> <span class="option-name"> <ion-icon name="information"></ion-icon> About US </span> </li> </ul> </span> </div> </div> `; document.body.prepend(htmlBody); }; let customJS = () => { let initiateDialogUI = () => { let hideButton = document.getElementById("hide"); let settingButton = document.getElementsByClassName("setting-icon")[0]; let destroyButton = document.getElementById("destroy"); let minimizeButton = document.getElementById("minimize"); let minimizeButton1 = document.querySelector(".minimize-button") let dialogBackground = document.getElementsByClassName("dialog-background")[0]; let searchEngineTextField = document.querySelector("#searchEngineURL"); let saveSearchEngineURL = document.querySelector("#saveSearchEngineURL") let allCheckBoxes = document.querySelectorAll(".dialog-background input[type=checkbox]"); destroyButton.addEventListener("click", () => { info(true, "Destroying Moodle.js"); let partsOfMoodleJs = document.querySelectorAll(".part-of-moodlejs"); info(partsOfMoodleJs.length != 0, "Found elements injected by Moodle.js", "No element found to delete") if (partsOfMoodleJs.length != 0) { partsOfMoodleJs.forEach((element) => { element.remove(); }); }; }); hideButton.addEventListener("click", () => { let partsOfMoodleJs = document.querySelectorAll(".part-of-moodlejs"); partsOfMoodleJs.forEach((element) => { element.classList.remove("active"); }); }); minimizeButton.addEventListener("click", () => { info(true, "Minimizing dialog using toolbar button"); dialogBackground.classList.toggle("active"); }); settingButton.addEventListener("click", () => { info(true, "Clicked on setting button"); dialogBackground.classList.toggle("active"); }); minimizeButton1.addEventListener("click", () => { info(true, "Minimizing dialog using bigger button"); dialogBackground.classList.toggle("active"); }); saveSearchEngineURL.addEventListener("click", () => { info(true, "Saving search-engine URL value"); let usersSearchEngineValue = searchEngineTextField.value; if (usersSearchEngineValue != "" && usersSearchEngineValue.indexOf("https://") == 0) { pref("searchEngine", usersSearchEngineValue); saveSearchEngineURL.innerHTML = "SAVED"; location.reload(); } else { saveSearchEngineURL.innerHTML = "FAILED!"; } setTimeout(function () { saveSearchEngineURL.innerHTML = "SAVE"; }, 2000); }); allCheckBoxes.forEach(element => { element.addEventListener("click", function () { let attributeValue = element.getAttribute("id"); pref(attributeValue, element.checked); location.reload(); info(true, "Setting " + attributeValue + " as " + element.checked); info(true, "New Value: " + pref(attributeValue)); }); }); searchEngineTextField.value = pref("searchEngine"); for (let i = 0; i < localStorage.length; i++) { let keyName = localStorage.key(i); if (keyName.includes("Checkbox") && pref(keyName) != "false") { allCheckBoxes.forEach(element => { if (element.getAttribute("id") == localStorage.key(i)) { element.checked = true; } }) } } }; let initDefaultSettings = () => { if (pref("searchEngine") == "") { pref("searchEngine", "https://google.com"); } }; let initSettings = () => { let questionContainer = [...document.querySelectorAll(".content")]; // Remove the last element only if there are more // than one question and the removed element is footer. questionContainer.length > 1 && questionContainer.pop(); // Just in case if the user is in review mode and has // selected "all question in one page" option instead // of one page at a time. That's why forEach(). if (location.href.includes("quiz")) questionContainer.forEach((element, index) => { let buttonsContainer = document.createElement("span"); buttonsContainer.classList.add("part-of-moodlejs"); let question = element.querySelector(".qtext").textContent; let options = element.querySelector(".answer").textContent.replaceAll("\n", ""); if (pref("searchCheckbox") == "true") { let searchEngineURL = pref("searchEngine") || "https://google.com"; // If the searchEngineURL doesn't contain the "/" at end // append one at the end. searchEngineURL.endsWith("/") || (searchEngineURL += "/"); searchEngineURL = searchEngineURL + "search?q=" + question + " " + options; let searchButton = document.createElement("span"); searchButton.innerHTML = "SEARCH"; searchButton.classList.add("custom-button"); searchButton.setAttribute("title", "Search the question in web"); searchButton.addEventListener("click", () => { window.open(searchEngineURL, "_blank"); }); info(true, "Appending search button") buttonsContainer.appendChild(searchButton); } if (pref("copyCheckbox") == "true") { let copyButton = document.createElement("span"); copyButton.innerHTML = "COPY"; copyButton.classList.add("custom-button"); copyButton.setAttribute("title", "Copy question and option in clipboard"); copyButton.addEventListener("click", () => { navigator.clipboard.writeText(question + " " + options); copyButton.innerHTML = "COPIED!"; setTimeout(function () { copyButton.innerHTML = "COPY"; }, 2000); }); info(true, "Appending copy button"); buttonsContainer.appendChild(copyButton); } if (pref("aiCheckbox") == "true") { let responseMessage = "Waiting for AI response..."; element.innerHTML += ` <br> <div class = "chatAnswer part-of-moodlejs"> <p>AI Generated Answer: </p> <hr> <p id = "chatGPTAnswer"> ${responseMessage} </p> <br> </div>`; let prompt = question + options; const apiKey = 'AIzaSyCrFqE3hQJh8Ni9XAzDRTETYrzgXSqQ8EA'; const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent'; let answerPlace = element.querySelector("#chatGPTAnswer"); let requestOptions = { method : 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ "contents":[{"parts":[{"text":"Choose the correct option for this question: " + prompt}]}], }), }; fetch(`${url}?key=${apiKey}`, requestOptions) .then(response => response.json()) .then(data => { info(true, data); answerPlace.innerText = data.candidates[0].content.parts[0].text; element.querySelector(".answer").setAttribute("correctAnswer", data.candidates[0].content.parts[0].text); }) .catch(error => { info(false, "", error); answerPlace.innerText = "Failed to connect to AI servers. They might be currently offline or busy due to overload." }); } if (pref("erudaCheckbox") == "true") { window.define = undefined; // IDK but this works (function () { let script = document.createElement('script'); script.src = "//cdn.jsdelivr.net/npm/eruda"; document.body.appendChild(script); script.onload = function () { eruda.init(); } })(); } if (pref("saveCheckbox") == "true" && location.href.includes("quiz")) { require(['https://html2canvas.hertzen.com/dist/html2canvas.min.js'], function (html2canvas) { let saveButton = document.createElement("span"); saveButton.innerHTML = "SAVE"; saveButton.classList.add("custom-button"); saveButton.setAttribute("title", "Copy question and option in clipboard"); saveButton.addEventListener("click", () => { html2canvas(element).then(function (canvas) { let dataURL = canvas.toDataURL(); let timestamp = new Date().getTime(); let fileName = 'screenshot_' + timestamp + '.png'; let downloadLink = document.createElement('a'); downloadLink.href = dataURL; downloadLink.download = fileName; document.body.appendChild(downloadLink); downloadLink.click(); document.body.removeChild(downloadLink); saveButton.innerHTML = "SAVED!"; }); setTimeout(function () { saveButton.innerHTML = "SAVE"; }, 2000); }); info(true, "Appending copy button"); buttonsContainer.appendChild(saveButton); }); } element.appendChild(buttonsContainer); }); if (pref("popupCheckbox") == "true" && location.href.includes("/view.php")) { try { let attemptValue = document.querySelector("[name=attempt]").value; let cmidValue = document.querySelector("[name=cmid]").value; let formURL = document.querySelector("form"); let anchorElement = document.createElement("button"); let finalURL = `${formURL.action}?attempt=${attemptValue}&cmid=${cmidValue}`; anchorElement.href = formURL; anchorElement.textContent = "OPEN" anchorElement.setAttribute("target", "_blank"); formURL.appendChild(anchorElement); console.log(finalURL); } catch (e) { info(false, "", e); } } if (pref("loginCheckbox") == "true" && location.href == "https://kiitmoodle.in/login/index.php") { let button = document.querySelector("button[type=submit]"); let checkbox = document.querySelector("input[type=checkbox]"); let username = document.querySelectorAll(".sr-only")[1]; let password = document.querySelectorAll(".sr-only")[2]; checkbox.setAttribute("checked", "checked"); username.value = pref("username"); password.value = pref("password"); // This prevents brute login by checking if 'Wrong password' // messages are already displayed in browser. if (document.querySelectorAll(".alert").length == 0) { // button.click(); } else { pref("username", prompt("Your moodle username: ")); pref("password", prompt("Your moodle password: ")); } } }; initiateDialogUI(); initDefaultSettings(); initSettings(); }; init(); })();