Wait server response, text answer hints
This commit is contained in:
parent
a709261f58
commit
7634c148e9
|
@ -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
321
user.js
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue