Wait server response, text answer hints

This commit is contained in:
Egor Guslyancev 2024-05-01 06:23:23 -03:00
parent a709261f58
commit 7634c148e9
GPG Key ID: D7E709AA465A55F9
2 changed files with 199 additions and 124 deletions

View File

@ -17,7 +17,7 @@ import timeout as tmo
# Simple config
GET_ONLY_FOR_VIP = True
POST_ONLY_FOR_VIP = True
VERSION = "20240430.3"
VERSION = "20240501.1"
CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

321
user.js
View File

@ -2,7 +2,7 @@
// @name Sorryops
// @name:ru Сориупс
// @namespace https://git.disroot.org/electromagneticcyclone/sorryops
// @version 20240430.3
// @version 20240501.1
// @description Collect and reuse ORIOKS test answers
// @description:ru Скрипт для сбора и переиспользования ответов на тесты ОРИОКС
// @icon https://orioks.miet.ru/favicon.ico
@ -20,12 +20,12 @@
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @connect sorryops.ru
// @run-at document-start
// @downloadURL https://update.greasyfork.org/scripts/481036/Sorryops.user.js
// @updateURL https://update.greasyfork.org/scripts/481036/Sorryops.meta.js
// @downloadURL https://update.greasyfork.org/scripts/481036/Sorryops.user.js
// @updateURL https://update.greasyfork.org/scripts/481036/Sorryops.meta.js
// ==/UserScript==
/* Version */
const VERSION = "20240430.3";
const VERSION = "20240501.1";
/* End Version */
/* Charset */
@ -42,6 +42,7 @@ const all_labels = {
show_user_id: "Show user ID",
user_id: "User ID (keep private)",
server: "Sync answers with server (leave blank to disable)",
wait_server_response: "Wait server response",
auto_answer: "Auto answer",
auto_answer_no: "No",
auto_answer_first: "First",
@ -66,6 +67,7 @@ const all_labels = {
show_user_id: "Показать индетификатор пользователя",
user_id: "Индетификатор (держать в секрете)",
server: "Синхронизировать ответы с сервером (оставить пустым для отключения)",
wait_server_response: "Ждать ответа сервера",
auto_answer: "Автовыбор ответа",
auto_answer_no: "Нет",
auto_answer_first: "Первый",
@ -129,14 +131,19 @@ var config = new GM_config({
save: false,
default: '',
},
valid_user_id: {
type: 'hidden',
default: '',
},
server: {
label: labels.server,
type: 'text',
default: '',
},
valid_user_id: {
type: 'hidden',
default: '',
wait_server_response: {
label: labels.wait_server_response,
type: 'checkbox',
default: true,
},
auto_answer: {
label: labels.auto_answer,
@ -323,8 +330,8 @@ if (GM_getValue('stop_timer', true)) {
pbox.parentNode.remove();
document.getElementsByTagName('hr')[0].remove();
var injectFakeTimer = function(window) {
window.setInterval = (f, t) => {
return window.setInterval(f, 10^999);
window.setInterval = (f, t, its_me = false) => {
return window.setInterval(f, its_me ? t : 10^999);
};
}
var scriptFakeTimer = document.createElement('script');
@ -358,7 +365,10 @@ window.onkeydown = (e) => {
// const success = -1487162948;
var answers = [];
var sorted_objects_value = [];
var variant, hash, type, correct, incorrect, version;
var prev_new_answer_f = false;
var new_answer_f = false;
var testID = (() => {
var url = document.URL;
url = url.slice(url.indexOf("idKM=") + 5);
@ -503,17 +513,20 @@ function update_variant() {
}
}
}
new_answer_f = true;
if (version != VERSION && version !== undefined) {
status = "<span style='color: red;'>Скрипт устарел</span>";
GM_setValue('fetched_data', {});
} else if (version === undefined) {
status = "<span style='color: red;'>Нет соединения</span>";
location.reload();
} else if (chosen_answer == correct) {
status = "<span style='color: green;'>Верно</span>";
new_answer_f = false;
} else if (incorrect.includes(chosen_answer)) {
status = "<span style='color: red;'>Неверно</span>";
new_answer_f = false;
}
GM_setValue('new_answer_f', prev_new_answer_f || new_answer_f);
var pboxes = document.getElementsByTagName('p');
const display_answer = config.get('display_answer');
for (i = 0; i < pboxes.length; i++) {
@ -545,13 +558,86 @@ function update_variant() {
}
}
/* End Functions */
function auto_answer() {
var answer, sorry_val, correct_element, incorrect_element;
const auto_answer = config.get('auto_answer');
if (correct != undefined) {
switch (type) {
case 'radio': {
for (answer in answers) {
if (answers[answer].sorry_value == correct) {
if (!answers[answer].sorry_colored) {
correct_element = answers[answer].parentNode;
sorry_val = answers[answer].sorry_value;
correct_element.innerHTML = "<span style='color: green;'>" + correct_element.innerHTML + "</span>";
answers[answer] = correct_element.getElementsByTagName('input')[0];
answers[answer].sorry_value = sorry_val;
answers[answer].sorry_colored = true;
}
answers[answer].click();
}
}
} break;
case 'checkbox': {
for (answer in answers) {
if (correct.includes(answers[answer].sorry_value)) {
if (!answers[answer].sorry_colored) {
correct_element = answers[answer].parentNode;
sorry_val = answers[answer].sorry_value;
correct_element.innerHTML = "<span style='color: green;'>" + correct_element.innerHTML + "</span>";
answers[answer] = correct_element.getElementsByTagName('input')[0];
answers[answer].sorry_value = sorry_val;
answers[answer].sorry_colored = true;
}
answers[answer].click();
}
}
} break;
case 'text': {
var corr = correct.slice(1, correct.length - 1).split('][');
for (i = 0; (i < answers.leght) && (i < corr.length); i++) {
answers[i].placeholder = corr[i];
}
} break;
}
} else if (auto_answer == labels.auto_answer_random) {
switch (type) {
case 'radio': {
var possible_answers = [];
for (answer in answers) {
if (incorrect.includes(answers[answer].sorry_value) == false) {
possible_answers.push(answer);
} else {
if (!answers[answer].sorry_colored) {
incorrect_element = answers[answer].parentNode;
sorry_val = answers[answer].sorry_value;
incorrect_element.innerHTML = "<span style='color: red;'>" + incorrect_element.innerHTML + "</span>";
answers[answer] = incorrect_element.getElementsByTagName('input')[0];
answers[answer].sorry_value = sorry_val;
answers[answer].sorry_colored = true;
}
}
}
var chosen_answer;
chosen_answer = Math.floor(Math.random() * possible_answers.length);
answers[possible_answers[chosen_answer]].click();
} break;
case 'checkbox': {
var combs = comb(charset.slice(0, answers.length), incorrect);
var pick = combs[Math.floor(Math.random() * combs.length)];
for (i = 0; i < answers.length; i++) {
if(pick.includes(answers[i].sorry_value)) {
answers[i].click();
}
}
} break;
}
} else if (auto_answer == labels.auto_answer_first) {
Object.values(sorted_objects_value)[0].click();
}
}
/* Handlers */
function test_form_handler(server_data) {
var i, key, answer, sorry_val;
var complicated_hash_f = false;
function parse_server_data(server_data) {
version = server_data.version;
if (version !== VERSION && version !== undefined) {
console.warn("Sorryops is outdated");
@ -559,6 +645,65 @@ function test_form_handler(server_data) {
GM_openInTab("https://greasyfork.org/en/scripts/481036-sorryops");
config.set('auto_continue', false);
}
if (server_data.hasOwnProperty('correct')) {
correct = server_data.correct;
if (correct === undefined) {
correct = undefined;
} else if (correct.hasOwnProperty(hash)) {
correct = correct[hash];
} else {
correct = undefined;
}
} else {
correct = undefined;
}
if (server_data.hasOwnProperty('incorrect')) {
incorrect = server_data.incorrect;
if (incorrect === undefined) {
incorrect = [];
} else if (incorrect.hasOwnProperty(hash)) {
incorrect = incorrect[hash];
} else {
incorrect = [];
}
} else {
incorrect = [];
}
}
function auto_continue() {
var old_time, cur_time;
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();
}
}
}
function auto_restart() {
var old_time, cur_time;
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();
}
}
}
/* End Functions */
/* Handlers */
function test_form_handler() {
var i, key, answer, sorry_val;
var complicated_hash_f = false;
var boxes = [];
var sorted_objects;
var objects_hash = new Object();
@ -595,7 +740,7 @@ function test_form_handler(server_data) {
return obj;
}, {}
);
const sorted_objects_value = Object.keys(objects_value).sort().reduce(
sorted_objects_value = Object.keys(objects_value).sort().reduce(
(obj, key) => {
obj[key] = objects_value[key];
return obj;
@ -608,30 +753,6 @@ function test_form_handler(server_data) {
form.appendChild(sorted_objects[key].parentNode);
}
calculate_variant_hash();
if (server_data.hasOwnProperty('correct')) {
correct = server_data.correct;
if (correct === undefined) {
correct = undefined;
} else if (correct.hasOwnProperty(hash)) {
correct = correct[hash];
} else {
correct = undefined;
}
} else {
correct = undefined;
}
if (server_data.hasOwnProperty('incorrect')) {
incorrect = server_data.incorrect;
if (incorrect === undefined) {
incorrect = [];
} else if (incorrect.hasOwnProperty(hash)) {
incorrect = incorrect[hash];
} else {
incorrect = [];
}
} else {
incorrect = [];
}
for (key in sorted_objects) {
sorted_objects[key].sorry_value = charset[i++];
var span = document.createElement('span');
@ -657,61 +778,13 @@ function test_form_handler(server_data) {
form.appendChild(sorted_objects_value[key].parentNode);
}
}
const auto_answer = config.get('auto_answer');
if (correct != undefined) {
for (answer in answers) {
if (answers[answer].sorry_value == correct) {
var correct_element = answers[answer].parentNode;
sorry_val = answers[answer].sorry_value;
correct_element.innerHTML = "<span style='color: green;'>" + correct_element.innerHTML + "</span>";
answers[answer] = correct_element.getElementsByTagName('input')[0];
answers[answer].sorry_value = sorry_val;
answers[answer].click();
break;
}
}
} else if (auto_answer == labels.auto_answer_random) {
if (type === 'radio') {
var possible_answers = [];
for (answer in answers) {
if (incorrect.includes(answers[answer].sorry_value) == false) {
possible_answers.push(answer);
} else {
var incorrect_element = answers[answer].parentNode;
sorry_val = answers[answer].sorry_value;
incorrect_element.innerHTML = "<span style='color: red;'>" + incorrect_element.innerHTML + "</span>";
answers[answer] = incorrect_element.getElementsByTagName('input')[0];
answers[answer].sorry_value = sorry_val;
answers[answer] = incorrect_element.getElementsByTagName('input')[0];
}
}
var chosen_answer;
chosen_answer = Math.floor(Math.random() * possible_answers.length);
answers[possible_answers[chosen_answer]].click();
} else if (type === 'checkbox') {
var combs = comb(charset.slice(0, answers.length), incorrect);
var pick = combs[Math.floor(Math.random() * combs.length)];
for (i = 0; i < answers.length; i++) {
if(pick.includes(answers[i].sorry_value)) {
answers[i].click();
}
}
}
} else if (auto_answer == labels.auto_answer_first) {
Object.values(sorted_objects_value)[0].click();
}
} break;
case 'text': {
answers = boxes;
calculate_variant_hash();
if (server_data.hasOwnProperty('correct')) {
correct = server_data.correct[hash];
}
if (server_data.hasOwnProperty('correct')) {
incorrect = server_data.incorrect[hash];
}
} break;
}
auto_answer();
update_variant();
for (i = 0; i < answers.length; i++) {
answers[i].addEventListener('change', update_variant);
@ -720,11 +793,11 @@ function test_form_handler(server_data) {
function result_page_handler() {
var i;
var correct = variant.slice(variant.indexOf("Число верных ответов: ") + 22);
var all = variant.slice(variant.indexOf("Число неверных ответов: ") + 24);
correct = correct.slice(0, correct.indexOf("\n")).trim();
all = all.slice(0, all.indexOf("\n")).trim();
all = (parseInt(all) + parseInt(correct)).toString();
var correct_num = variant.slice(variant.indexOf("Число верных ответов: ") + 22);
var all_num = variant.slice(variant.indexOf("Число неверных ответов: ") + 24);
correct_num = correct_num.slice(0, correct_num.indexOf("\n")).trim();
all_num = all_num.slice(0, all_num.indexOf("\n")).trim();
all_num = (parseInt(all_num) + parseInt(correct_num)).toString();
var test = GM_getValue('tests', new Object())[testID];
if (test === undefined) {
return;
@ -738,7 +811,7 @@ function result_page_handler() {
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;
printer += correct_num;
if (config.get('copy_answers')) {
GM_setClipboard(printer);
}
@ -765,47 +838,49 @@ function result_page_handler() {
}
}
set_to_clear(testID, () => {
send_to_server({
type: "test_results",
uid: config.get('user_id'),
id: testID,
answers: sorted_test,
correct: correct,
all: all,
});
if (GM_getValue('new_answer_f')) {
send_to_server({
type: "test_results",
uid: config.get('user_id'),
id: testID,
answers: sorted_test,
correct: correct_num,
all: all_num,
});
}
GM_setValue('fetched_data', {});
GM_setValue('new_answer_f', false);
});
}
/* End Handlers */
function main() {
var old_time, cur_time;
variant = document.getElementById('w0').parentNode.textContent;
prev_new_answer_f = !!GM_getValue('new_answer_f');
if (variant.includes("Вопрос:")) {
fetch_from_server(testID, (server_response) => {
DB_cleaner();
test_form_handler(server_response);
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();
}
parse_server_data(server_response);
test_form_handler();
if (config.get('wait_server_response')) {
window.setInterval(() => {fetch_from_server(testID, (server_response) => {
if (version === undefined) {
parse_server_data(server_response);
update_variant();
if (version === VERSION) {
press_continue_btn();
auto_continue();
}
}
})}, 3000, true);
} else {
auto_continue();
}
auto_continue();
});
} 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();
}
}
auto_restart();
}
}