Skip the half of the fun!
当前为
// ==UserScript==
// @name Sorryops
// @namespace sorryops
// @version 20240421.1
// @description Skip the half of the fun!
// @icon https://orioks.miet.ru/favicon.ico
// @author electromagneticcyclone & angelbeautifull
// @license Unlicense
// @supportURL https://git.disroot.org/electromagneticcyclone/sorryops
// @match https://orioks.miet.ru/student/student/test*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_registerMenuCommand
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @run-at document-start
// ==/UserScript==
var config = new GM_config({
id: 'config',
title: 'Script Settings',
fields: {
auto_answer: {
label: "Auto answer",
type: 'select',
options: [ 'No', 'First', 'Random' ],
default: 'No',
},
display_answer: {
label: "Display answer near variant",
type: 'checkbox',
default: true,
},
},
});
var answers = [];
var variant, hash;
var testID = (() => {
var url = document.URL;
url = url.slice(url.indexOf("idKM=") + 5);
url = url.slice(0, url.indexOf("&"));
return url;
})();
GM_registerMenuCommand('Script Settings', () => {
config.open();
});
window.addEventListener('load', actionFunction);
// https://stackoverflow.com/a/15710692
function hashCode(s) {
return s.split("").reduce(function(a, b) {
a = ((a << 5) - a) + b.charCodeAt(0);
return a & a;
}, 0);
}
function update_variant() {
var i;
var chosen_answer = "";
for (i = 0; i < answers.length; i++) {
chosen_answer += answers[i].checked ? answers[i].value : "";
}
chosen_answer = chosen_answer.split('').sort().join('');
var pboxes = document.getElementsByTagName('p');
const display_answer = config.get('display_answer');
for (i = 0; i < pboxes.length; i++) {
var pbox = pboxes[i];
if (pbox.textContent.includes("Вопрос:")) {
pbox.innerHTML = "<i>(Вариант <input onfocus='this.select();' id='variant' value='" + hash + (display_answer == true ? (" " + chosen_answer) : "") + "' readonly>)</i><br>Вопрос:";
break;
}
}
var tests = GM_getValue('tests', new Object());
if (tests[testID] === undefined) {
tests[testID] = new Object();
}
tests[testID][hash] = chosen_answer;
GM_setValue('tests', tests);
}
function test_form_handler() {
var i;
var objects = new Object();
var boxes = document.getElementsByTagName('input');
var form = document.getElementById('testform-answer');
for (i = 0; i < boxes.length; i++) {
if (boxes[i].type === 'checkbox' | boxes[i].type === 'radio') {
// answers.push(boxes[i]);
var span = document.createElement('span');
span.innerHTML =
boxes[i].type === 'radio' && boxes[i].value == "1"
? "<b>" + boxes[i].value + ")</b> "
: boxes[i].value + ") ";
boxes[i].parentNode.insertBefore(span, boxes[i]);
objects[boxes[i].value] = boxes[i];
}
}
const sorted_objects = Object.keys(objects).sort().reduce(
(obj, key) => {
obj[key] = objects[key];
return obj;
}, {}
);
for (var key in sorted_objects) {
sorted_objects[key].parentNode.remove();
form.appendChild(sorted_objects[key].parentNode);
answers.push(sorted_objects[key]);
}
const auto_answer = config.get('auto_answer');
var answer;
if (auto_answer == 'Random') {
if (answers[0].type === 'radio') {
var chosen_answer = Math.floor(Math.random() * answers.length);
answers[chosen_answer].click();
} else {
var pick = Math.floor(Math.random() * (Math.pow(2, answers.length) - 1)) + 1;
for (i = 0; i < answers.length; i++) {
if(pick & Math.pow(2, i)) {
answers[i].click();
}
}
}
} else if (auto_answer == 'First') {
answers[0].click();
}
variant = document.getElementById('w0').parentNode.textContent;
variant = variant.slice(variant.indexOf("Вопрос:"));
console.log(variant);
hash = hashCode(variant);
update_variant();
form.addEventListener('click', update_variant);
}
function result_page_handler() {
var correct = variant.slice(variant.indexOf("Число верных ответов: ") + 22);
correct = correct.slice(0, variant.indexOf("\n"));
}
function actionFunction() {
variant = document.getElementById('w0').parentNode.textContent;
if (variant.includes("Вопрос:")) {
test_form_handler();
}
if (variant.includes("Результат прохождения теста:")) {
result_page_handler();
}
}