20240502.1 (yes, im lazy)
This commit is contained in:
parent
c957539877
commit
f8088142c0
3 changed files with 91 additions and 41 deletions
|
@ -1,5 +1,7 @@
|
|||
# Сори, упс…
|
||||
|
||||
Сориупс (SorryOps) — рограмма для помощи в решение тестов на платформе ОРИОКС.
|
||||
|
||||
Программа предоставляется на условиях **"КАК ЕСТЬ"**, разработчики не дают каких-либо гарантий. Не стоит использовать программу как спасательный круг от отчисления. Если вы не изучаете материал, посыпетесь на экзамене.
|
||||
|
||||
## Установка
|
||||
|
@ -64,6 +66,6 @@ javascript:document.querySelectorAll('input[type="checkbox"],input[type="radio"]
|
|||
|
||||
### Автопродолжение и автоперезапуск
|
||||
|
||||
Две опасные опции, которые отключаются спустя час после включения. Помогают полностью автоматизировать сбор отчётов на тестах с бесконечным числом попыток.
|
||||
Две опасные опции, которые отключаются спустя час после включения. Помогают полностью автоматизировать сбор отчётов на тестах с бесконечным числом попыток. Рекомендуется для отправки отчётов прорешивать только один тест в одно время.
|
||||
|
||||
[Исходный код](source)
|
||||
|
|
13
server.py
13
server.py
|
@ -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
115
user.js
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue