20240502.1 (yes, im lazy)

This commit is contained in:
Egor Guslyancev 2024-05-02 07:57:09 -03:00
parent c957539877
commit f8088142c0
GPG Key ID: D7E709AA465A55F9
3 changed files with 91 additions and 41 deletions

View File

@ -1,5 +1,7 @@
# Сори, упс…
Сориупс (SorryOps) — рограмма для помощи в решение тестов на платформе ОРИОКС.
Программа предоставляется на условиях **"КАК ЕСТЬ"**, разработчики не дают каких-либо гарантий. Не стоит использовать программу как спасательный круг от отчисления. Если вы не изучаете материал, посыпетесь на экзамене.
## Установка
@ -64,6 +66,6 @@ javascript:document.querySelectorAll('input[type="checkbox"],input[type="radio"]
### Автопродолжение и автоперезапуск
Две опасные опции, которые отключаются спустя час после включения. Помогают полностью автоматизировать сбор отчётов на тестах с бесконечным числом попыток.
Две опасные опции, которые отключаются спустя час после включения. Помогают полностью автоматизировать сбор отчётов на тестах с бесконечным числом попыток. Рекомендуется для отправки отчётов прорешивать только один тест в одно время.
[Исходный код](source)

View File

@ -17,7 +17,7 @@ import timeout as tmo
# Simple config
GET_ONLY_FOR_VIP = True
POST_ONLY_FOR_VIP = True
VERSION = "20240501.4"
VERSION = "20240502.1"
CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
@ -125,8 +125,9 @@ def resolve_logs(tries = 3, backup = True, backup_name = None):
db.write(f"tests.{test}.logs", logs + new_logs)
db.write(f"tests.{test}.correct", correct)
db.write(f"tests.{test}.incorrect", incorrect)
except:
except Exception as e:
print("Something really bad happend. Recovering from backup")
print(e)
if backup_name is not None:
db.load(backup_name)
resolve_logs(tries - 1, False, backup_name)
@ -195,8 +196,9 @@ def parse_request(r):
except json.decoder.JSONDecodeError:
print("Bad request")
return 400
except:
except Exception as e:
print("Something bad happend")
print(e)
return 400
class S(BaseHTTPRequestHandler):
@ -212,7 +214,8 @@ class S(BaseHTTPRequestHandler):
self_path, params = sp[:2]
for p in params.split('&'):
p = p.split('=')
parameters[p[0]] = p[1]
if len(p) > 1:
parameters[p[0]] = p[1]
match self_path:
case "/":
self._set_response(200)
@ -292,7 +295,7 @@ class S(BaseHTTPRequestHandler):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length).decode('utf-8')
self._set_response(parse_request(post_data))
# self.wfile.write(f"POST request for {self.path}".encode('utf-8'))
self.wfile.write(f"POST request for {self.path}".encode('utf-8'))
def run_resolver():
p2_tmo = tmo.Timeout(2 * 60)

115
user.js
View File

@ -2,7 +2,7 @@
// @name Sorryops
// @name:ru Сориупс
// @namespace https://git.disroot.org/electromagneticcyclone/sorryops
// @version 20240501.4
// @version 20240502.1
// @description Collect and reuse ORIOKS test answers
// @description:ru Скрипт для сбора и переиспользования ответов на тесты ОРИОКС
// @icon https://orioks.miet.ru/favicon.ico
@ -25,7 +25,7 @@
// ==/UserScript==
/* Version */
const VERSION = "20240501.4";
const VERSION = "20240502.1";
/* End Version */
/* Charset */
@ -47,6 +47,7 @@ const all_labels = {
auto_answer_no: "No",
auto_answer_first: "First",
auto_answer_random: "Random",
auto_answer_not_greedy: "Pick known answers until all of them will be found",
display_values: "Answers variant",
display_values_ori: "ORIOKS",
display_values_sorry: "Sorry",
@ -72,6 +73,7 @@ const all_labels = {
auto_answer_no: "Нет",
auto_answer_first: "Первый",
auto_answer_random: "Случайный",
auto_answer_not_greedy: "Выбирать известные ответы пока все не будут найдены",
display_values: "Вариант отображения ответов",
display_values_ori: "ОРИОКС",
display_values_sorry: "Сори",
@ -155,6 +157,11 @@ var config = new GM_config({
],
default: labels.auto_answer_no,
},
auto_answer_not_greedy: {
label: labels.auto_answer_not_greedy,
type: 'checkbox',
default: false,
},
display_values: {
label: labels.display_values,
type: 'select',
@ -292,9 +299,14 @@ function fetch_from_server(path, func) {
GM_xmlhttpRequest({
method: 'GET',
url: 'https://' + server + '/' + path + '?uid=' + config.get('user_id'),
timeout: 1000,
onload: function (response) {
var text = response.responseText;
if (!text.includes("{")) {
if (response.status == 404) {
fetched_data = {version: VERSION};
GM_setValue('fetched_data', fetched_data);
func(fetched_data);
} else if (!text.includes("{")) {
func({});
} else {
fetched_data = JSON.parse(text);
@ -303,6 +315,7 @@ function fetch_from_server(path, func) {
}
},
onerror: function (e) {
console.log(e);
func({});
},
onabort: function (e) {
@ -562,28 +575,36 @@ function update_variant() {
}
}
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 && (version !== undefined)) {
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();
function color_answers() {
var answer, correct_element, incorrect_element, sorry_val;
switch (type) {
case 'radio': {
for (answer in answers) {
if (answers[answer].sorry_value == correct) {
if (!answers[answer].sorry_colored && (version !== undefined)) {
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;
}
}
} break;
case 'checkbox': {
for (answer in answers) {
if (incorrect.includes(answers[answer].sorry_value)) {
if (!answers[answer].sorry_colored && (version !== undefined)) {
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;
}
}
}
} break;
case 'checkbox': {
for (answer in answers) {
if (correct != undefined) {
if (correct.includes(answers[answer].sorry_value)) {
if (!answers[answer].sorry_colored && (version !== undefined)) {
correct_element = answers[answer].parentNode;
@ -593,17 +614,45 @@ function auto_answer() {
answers[answer].sorry_value = sorry_val;
answers[answer].sorry_colored = true;
}
}
}
}
} break;
}
}
function auto_answer() {
var answer, chosen_answer, sorry_val, correct_element, incorrect_element;
const auto_answer = config.get('auto_answer');
function pick_answer(picked) {
switch (type) {
case 'radio': {
for (answer in answers) {
if (answers[answer].sorry_value == picked) {
answers[answer].click();
}
}
} break;
case 'checkbox': {
for (answer in answers) {
if (picked.includes(answers[answer].sorry_value)) {
answers[answer].click();
}
}
} break;
case 'text': {
var corr = correct.slice(1, correct.length - 1).split('][');
var corr = picked.slice(1, picked.length - 1).split('][');
for (i = 0; (i < answers.leght) && (i < corr.length); i++) {
answers[i].placeholder = corr[i];
}
} break;
}
}
if (correct != undefined) {
pick_answer(correct);
} else if ((incorrect.length != 0) && config.get('auto_answer_not_greedy')) {
chosen_answer = Math.floor(Math.random() * incorrect.length);
pick_answer(incorrect[chosen_answer]);
} else if (auto_answer == labels.auto_answer_random) {
switch (type) {
case 'radio': {
@ -611,18 +660,8 @@ function auto_answer() {
for (answer in answers) {
if (incorrect.includes(answers[answer].sorry_value) == false) {
possible_answers.push(answer);
} else {
if (!answers[answer].sorry_colored && (version !== undefined)) {
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;
@ -789,6 +828,7 @@ function test_form_handler(server_response) {
calculate_variant_hash();
} break;
}
color_answers();
auto_answer();
update_variant();
for (i = 0; i < answers.length; i++) {
@ -852,6 +892,8 @@ function result_page_handler() {
correct: correct_num,
all: all_num,
});
} else {
config.set('auto_answer_not_greedy', false);
}
GM_setValue('fetched_data', {});
GM_setValue('new_answer_f', false);
@ -871,7 +913,10 @@ function main() {
window.setInterval(() => {fetch_from_server(testID, (server_response) => {
if (version === undefined) {
parse_server_data(server_response);
auto_answer();
color_answers();
if (config.get('auto_continue')) {
auto_answer();
}
update_variant();
if (version === VERSION) {
auto_continue();