Yet another big update

This commit is contained in:
Egor Guslyancev 2024-04-22 13:32:46 -03:00
parent 2c28602683
commit 9b43b5c143
GPG Key ID: D7E709AA465A55F9
1 changed files with 181 additions and 9 deletions

190
user.js
View File

@ -1,7 +1,7 @@
// ==UserScript==
// @name Sorryops
// @namespace sorryops
// @version 20240421.1
// @version 20240422.1
// @description Skip the half of the fun!
// @icon https://orioks.miet.ru/favicon.ico
// @author electromagneticcyclone & angelbeautifull
@ -12,6 +12,7 @@
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_registerMenuCommand
// @grant GM_setClipboard
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @run-at document-start
// @downloadURL https://update.greasyfork.org/scripts/481036/Sorryops.user.js
@ -33,6 +34,67 @@ var config = new GM_config({
type: 'checkbox',
default: true,
},
register_keyboard_keys: {
label: "Continue by pressing Enter",
type: 'checkbox',
default: true,
},
copy_answers: {
label: "Copy answers to the clipboard",
type: 'checkbox',
default: false,
},
append_question_number: {
label: "Show question numbers in the final report",
type: 'checkbox',
default: true,
},
accumulator_enable: {
label: "Accumulate test results in one field",
type: 'checkbox',
default: false,
},
accumulator_prefix: {
label: "Accumulated results prefix (test number)",
type: 'text',
default: "",
},
auto_continue: {
label: "Auto continue (DANGEROUS!!! Will be disabled after an hour. Press `d` to disable)",
type: 'checkbox',
default: false,
},
auto_continue_time: {
type: 'hidden',
default: 0,
},
auto_restart: {
label: "Auto restart (DANGEROUS!!! Will be disabled after an hour. Press `d` to disable. Make sure you have infinite attempts)",
type: 'checkbox',
default: false,
},
auto_restart_time: {
type: 'hidden',
default: 0,
},
},
events: {
init: function() {
if (this.get('auto_continue') && (this.get('auto_answer') == "No")) {
this.set('auto_continue', false);
}
if (this.get('accumulator_enable') == false) {
GM_setValue('accumulated_answers', "");
}
},
save: function(forgotten) {
this.set('auto_continue_time', Date.now());
this.set('auto_restart_time', Date.now());
if (this.isOpen && this.get('auto_continue') && (this.get('auto_answer') == "No")) {
this.set('auto_continue', false);
alert("Can't automatically continue without answer.");
}
},
},
});
@ -50,6 +112,16 @@ GM_registerMenuCommand('Script Settings', () => {
});
window.addEventListener('load', actionFunction);
window.onkeydown = (e) => {
if ((e.key == "Enter") && config.get('register_keyboard_keys')) {
press_continue_btn();
}
if (e.key == "d") {
config.set('auto_continue', false);
config.set('auto_restart', false);
config.save();
}
};
// https://stackoverflow.com/a/15710692
function hashCode(s) {
@ -60,7 +132,7 @@ function hashCode(s) {
}
function update_variant() {
var i;
var i, pbox;
var chosen_answer = "";
for (i = 0; i < answers.length; i++) {
chosen_answer += answers[i].checked ? answers[i].value : "";
@ -69,17 +141,25 @@ function update_variant() {
var pboxes = document.getElementsByTagName('p');
const display_answer = config.get('display_answer');
for (i = 0; i < pboxes.length; i++) {
var pbox = pboxes[i];
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 question_num = undefined;
for (i = 0; i < pboxes.length; i++) {
pbox = pboxes[i];
if (pbox.textContent.includes("Текущий вопрос: ")) {
question_num = pbox.textContent.slice(variant.indexOf("Текущий вопрос: ") + 16);
break;
}
}
var tests = GM_getValue('tests', new Object());
if (tests[testID] === undefined) {
tests[testID] = new Object();
}
tests[testID][hash] = chosen_answer;
tests[testID][hash] = [question_num, chosen_answer];
GM_setValue('tests', tests);
}
@ -90,7 +170,6 @@ function test_form_handler() {
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"
@ -130,23 +209,116 @@ function test_form_handler() {
}
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 i;
var correct = variant.slice(variant.indexOf("Число верных ответов: ") + 22);
correct = correct.slice(0, variant.indexOf("\n"));
correct = correct.slice(0, correct.indexOf("\n"));
var test = GM_getValue('tests', new Object())[testID];
if (test === undefined) {
return;
}
var printer = "";
var sorted_test = [];
for (var hash in test) {
sorted_test.push([hash].concat(test[hash]));
}
sorted_test.sort((a, b) => {return a[1] - b[1]});
console.log(sorted_test);
for (i = 0; i < sorted_test.length; i++) {
printer += (config.get('append_question_number') ? (sorted_test[i][1] + ") ") : "") + sorted_test[i][0] + " " + sorted_test[i][2] + "\n";
}
printer += correct;
if (config.get('copy_answers')) {
GM_setClipboard(printer);
}
if (config.get('accumulator_enable')) {
var acc = GM_getValue('accumulated_answers', "");
if (acc != "") {
acc += "\n\n";
}
var prefix = config.get('accumulator_prefix');
if (prefix != "") {
acc += prefix + "\n";
}
acc += printer;
GM_setValue('accumulated_answers', acc);
printer = acc;
}
printer = "<textarea readonly style='resize:none; width:fit-content; height:fit-content' rows='" + String(Object.keys(test).length + 1) + "' cols='50' onfocus='this.select();' id='answers'>" + printer + "</textarea>";
var pboxes = document.getElementsByTagName('p');
for (i = 0; i < pboxes.length; i++) {
var pbox = pboxes[i];
if (pbox.textContent.includes("Попытка ")) {
pbox.outerHTML += printer;
break;
}
}
var clear = GM_getValue('clear_tests', new Object());
clear[testID] = true;
GM_setValue('clear_tests', clear);
}
function DB_cleaner() {
var clear = GM_getValue('clear_tests', new Object());
var tests = GM_getValue('tests', new Object());
for (var test in clear) {
delete tests[test];
}
GM_setValue('tests', tests);
GM_setValue('clear_tests', new Object());
}
function press_continue_btn() {
var i;
var buttons = document.getElementsByTagName('button');
var button = undefined;
for (i = 0; i < buttons.length; i++) {
var btn = buttons[i];
if (btn.textContent.includes("Пройти") || btn.textContent.includes("Продолжить")) {
button = btn;
break;
}
}
if (button === undefined) {
return;
}
if (button.textContent.includes("Пройти")) {
window.location.replace(button.parentNode.href);
} else if (button.textContent.includes("Продолжить")) {
button.click();
}
}
function actionFunction() {
var old_time, cur_time;
variant = document.getElementById('w0').parentNode.textContent;
if (variant.includes("Вопрос:")) {
DB_cleaner();
test_form_handler();
}
if (variant.includes("Результат прохождения теста:")) {
if (config.get('auto_continue')) {
old_time = config.get('auto_continue_time');
cur_time = Date.now();
if (cur_time - old_time > 60 * 60 * 1000) {
config.set('auto_continue', false);
} else {
press_continue_btn();
}
}
} else if (variant.includes("Результат прохождения теста:")) {
result_page_handler();
if (config.get('auto_restart')) {
old_time = config.get('auto_restart_time');
cur_time = Date.now();
if (cur_time - old_time > 60 * 60 * 1000) {
config.set('auto_restart', false);
} else {
press_continue_btn();
}
}
}
}