Yet another big update
This commit is contained in:
parent
2c28602683
commit
9b43b5c143
190
user.js
190
user.js
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue