Sorryops

Skip the half of the fun!

当前为 2024-04-21 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Sorryops
  3. // @namespace sorryops
  4. // @version 20240421.1
  5. // @description Skip the half of the fun!
  6. // @icon https://orioks.miet.ru/favicon.ico
  7. // @author electromagneticcyclone & angelbeautifull
  8. // @license Unlicense
  9. // @supportURL https://git.disroot.org/electromagneticcyclone/sorryops
  10. // @match https://orioks.miet.ru/student/student/test*
  11. // @grant GM_getValue
  12. // @grant GM_setValue
  13. // @grant GM_addStyle
  14. // @grant GM_registerMenuCommand
  15. // @require https://openuserjs.org/src/libs/sizzle/GM_config.js
  16. // @run-at document-start
  17. // ==/UserScript==
  18.  
  19. var config = new GM_config({
  20. id: 'config',
  21. title: 'Script Settings',
  22. fields: {
  23. auto_answer: {
  24. label: "Auto answer",
  25. type: 'select',
  26. options: [ 'No', 'First', 'Random' ],
  27. default: 'No',
  28. },
  29. display_answer: {
  30. label: "Display answer near variant",
  31. type: 'checkbox',
  32. default: true,
  33. },
  34. },
  35. });
  36.  
  37. var answers = [];
  38. var variant, hash;
  39. var testID = (() => {
  40. var url = document.URL;
  41. url = url.slice(url.indexOf("idKM=") + 5);
  42. url = url.slice(0, url.indexOf("&"));
  43. return url;
  44. })();
  45.  
  46. GM_registerMenuCommand('Script Settings', () => {
  47. config.open();
  48. });
  49.  
  50. window.addEventListener('load', actionFunction);
  51.  
  52. // https://stackoverflow.com/a/15710692
  53. function hashCode(s) {
  54. return s.split("").reduce(function(a, b) {
  55. a = ((a << 5) - a) + b.charCodeAt(0);
  56. return a & a;
  57. }, 0);
  58. }
  59.  
  60. function update_variant() {
  61. var i;
  62. var chosen_answer = "";
  63. for (i = 0; i < answers.length; i++) {
  64. chosen_answer += answers[i].checked ? answers[i].value : "";
  65. }
  66. chosen_answer = chosen_answer.split('').sort().join('');
  67. var pboxes = document.getElementsByTagName('p');
  68. const display_answer = config.get('display_answer');
  69. for (i = 0; i < pboxes.length; i++) {
  70. var pbox = pboxes[i];
  71. if (pbox.textContent.includes("Вопрос:")) {
  72. pbox.innerHTML = "<i>(Вариант <input onfocus='this.select();' id='variant' value='" + hash + (display_answer == true ? (" " + chosen_answer) : "") + "' readonly>)</i><br>Вопрос:";
  73. break;
  74. }
  75. }
  76. var tests = GM_getValue('tests', new Object());
  77. if (tests[testID] === undefined) {
  78. tests[testID] = new Object();
  79. }
  80. tests[testID][hash] = chosen_answer;
  81. GM_setValue('tests', tests);
  82. }
  83.  
  84. function test_form_handler() {
  85. var i;
  86. var objects = new Object();
  87. var boxes = document.getElementsByTagName('input');
  88. var form = document.getElementById('testform-answer');
  89. for (i = 0; i < boxes.length; i++) {
  90. if (boxes[i].type === 'checkbox' | boxes[i].type === 'radio') {
  91. // answers.push(boxes[i]);
  92. var span = document.createElement('span');
  93. span.innerHTML =
  94. boxes[i].type === 'radio' && boxes[i].value == "1"
  95. ? "<b>" + boxes[i].value + ")</b> "
  96. : boxes[i].value + ") ";
  97. boxes[i].parentNode.insertBefore(span, boxes[i]);
  98. objects[boxes[i].value] = boxes[i];
  99. }
  100. }
  101. const sorted_objects = Object.keys(objects).sort().reduce(
  102. (obj, key) => {
  103. obj[key] = objects[key];
  104. return obj;
  105. }, {}
  106. );
  107. for (var key in sorted_objects) {
  108. sorted_objects[key].parentNode.remove();
  109. form.appendChild(sorted_objects[key].parentNode);
  110. answers.push(sorted_objects[key]);
  111. }
  112. const auto_answer = config.get('auto_answer');
  113. var answer;
  114. if (auto_answer == 'Random') {
  115. if (answers[0].type === 'radio') {
  116. var chosen_answer = Math.floor(Math.random() * answers.length);
  117. answers[chosen_answer].click();
  118. } else {
  119. var pick = Math.floor(Math.random() * (Math.pow(2, answers.length) - 1)) + 1;
  120. for (i = 0; i < answers.length; i++) {
  121. if(pick & Math.pow(2, i)) {
  122. answers[i].click();
  123. }
  124. }
  125. }
  126. } else if (auto_answer == 'First') {
  127. answers[0].click();
  128. }
  129. variant = document.getElementById('w0').parentNode.textContent;
  130. variant = variant.slice(variant.indexOf("Вопрос:"));
  131. console.log(variant);
  132. hash = hashCode(variant);
  133. update_variant();
  134. form.addEventListener('click', update_variant);
  135. }
  136.  
  137. function result_page_handler() {
  138. var correct = variant.slice(variant.indexOf("Число верных ответов: ") + 22);
  139. correct = correct.slice(0, variant.indexOf("\n"));
  140. }
  141.  
  142. function actionFunction() {
  143. variant = document.getElementById('w0').parentNode.textContent;
  144. if (variant.includes("Вопрос:")) {
  145. test_form_handler();
  146. }
  147. if (variant.includes("Результат прохождения теста:")) {
  148. result_page_handler();
  149. }
  150. }