Advertisement
EldiraSesto

Mikrokomp skripta

Dec 16th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.55 KB | None | 0 0
  1. // ==UserScript==
  2. // @name TISS Quick Registration Script
  3. // @namespace http://www.manuelgeier.com/
  4. // @version 1.6.0
  5. // @description Script to help you to get into the group you want. Opens automatically the right panel, registers automatically and confirms your registration automatically. If you don't want the script to do everything automatically, the focus is already set on the right button, so you only need to confirm. There is also an option available to auto refresh the page, if the registration button is not available yet, so you can open the site and watch the script doing its work. You can also set a specific time when the script should reload the page and start.
  6. // @match https://tiss.tuwien.ac.at/*
  7. // @copyright 2012+, Manuel Geier, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  8. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
  9. // ==/UserScript==
  10.  
  11. /*
  12. Changelog:
  13. v.1.6.0 [28.11.2018]
  14. + Added: exam-registration support (Thanks to @XtomtomX, #11)
  15. v1.5.3 [29.02.2016]
  16. ~ Added: .gitignore
  17. ~ Fix: missing reference to 'options' object
  18. ~ Fix: wrong option name ('semesterCheckEnabled' instead of 'lvaSemesterCheckEnabled')
  19. ~ String/Number compare with === instead of ==, and !== instead of !=
  20. ~ Fix #9: id no longer available for wrapper element. replace it by element itself and adjust selectors.
  21. ~ Fix: toggle for groups (now without id selector)
  22. ~ Fix: group name selector now matches the exact name and not only if it contains the name
  23. v1.5.2 [?]
  24. - went missing :P
  25. v1.5.1 [09.10.2015]
  26. ~ Fix: adjusts group label selector
  27. ~ Fix: Remove leading zero for month which leads to unintended octal interpretation
  28. v1.5 [04.10.2015]
  29. + allow to enter a study code, if you have multiple ones
  30. + add flags to en-/disable checks
  31. ~ Code cleanup
  32. v1.4 [07.09.2013]
  33. + show or hide logoutput on screen (option: showLog [true/false])
  34. + many improvements
  35. ~ Code refactoring
  36. v1.3 [01.03.2013]
  37. + Feature: automatically presses the Ok button at the final info page
  38. ~ Code refactoring
  39. v1.2 [27.02.2013]
  40. + Feature: ability to register to a LVA; just set 'isGroupRegistration' to 'false'
  41. + Feature: selected group label is now marked with light green
  42. ~ Bugfix/Quickfix: overflow in setTimeout causes an constant refresh of the page; now the page gets refreshed at least often if the specific start time is in the future
  43. v1.1
  44. + Feature: Let the script start at a specific time.
  45. v1.0 (2012)
  46. Initial release
  47. */
  48.  
  49. (function TissQuickRegistrationClass() {
  50. var self = this;
  51.  
  52. ///////////////////////////////////////////////////////////////////////
  53. // Configurate the script here
  54. //
  55.  
  56. var options = {
  57. // global option to enable or disable the script [true,false]
  58. scriptEnabled: true,
  59.  
  60. // define here the type of registration [lva,group,exam]
  61. registrationType: "group",
  62.  
  63. // name of you the group you want to join (only for registrationType 'group') [String]
  64. nameOfGroup: "E-Klausur 23.1. T1",
  65.  
  66. // name of the exam which you want to join (only for registrationType 'exam') [String]
  67. nameOfExam: "",
  68.  
  69. dateOfExam: '', // not used yet
  70.  
  71. // checks if you are at the correct lva page
  72. lvaCheckEnabled: true,
  73.  
  74. // only if the number is right, the script is enabled [String]
  75. lvaNumber: "384.173",
  76.  
  77. // if you have multiple study codes, enter here the study code number you want
  78. // to register for eg. '123456' (no blanks). Otherwise leave empty. [String]
  79. studyCode: '',
  80.  
  81. // autoGoToLVA: true, // coming soon
  82.  
  83. // checks if you are at the correct semester
  84. lvaSemesterCheckEnabled: true,
  85.  
  86. // only if the semester is right, the script is enabled [String]
  87. lvaSemester: "2019W",
  88.  
  89. // autoGoToSemester: true, // coming soon
  90.  
  91. // automatically opens the detail panel of a group [true,false]
  92. openPanel: true,
  93.  
  94. // automatically presses the register button if it is available [true,false]
  95. autoRegister: true,
  96.  
  97. // automatically presses the confirm button for your registration [true,false]
  98. autoConfirm: true,
  99.  
  100. // continuously refresh the page until the script can register you [true,false]
  101. autoRefresh: true,
  102.  
  103. // automatically presses the ok button on the confirmation info page [true,false]
  104. autoOkPressAtEnd: true,
  105.  
  106. // a delay on the confirm info page, until the ok button gets pressed
  107. // this is useful if you want to continuously cycle through the registration process
  108. // until you are registered and with this parameter you can define a "cycle delay" at the end.
  109. // This could happen, if (for some reason) you are not on the whitelist for this course.
  110. // [Integer]
  111. okPressAtEndDelayInMs: 1000,
  112.  
  113. // let the script start at a specific time [true,false]
  114. startAtSpecificTime: true,
  115.  
  116. // define the specific time the script should start [Date]
  117. // new Date(year, month, day, hours, minutes, seconds, milliseconds)
  118. // note: months start with 0
  119. specificStartTime: new Date(2019, 11,16, 12,0, 0, 0),
  120.  
  121. // if a specific time is defined, the script will refresh some ms sooner to adjust a delay [Integer]
  122. delayAdjustmentInMs: 300,
  123.  
  124. // show log output of the script on screen [true,false]
  125. showLog: true
  126. };
  127.  
  128. //
  129. // End of configuration
  130. ///////////////////////////////////////////////////////////////////////
  131.  
  132.  
  133. self.init = function () {
  134. self.extendJQuery();
  135. self.tissQuickRegistration();
  136. };
  137.  
  138. self.extendJQuery = function () {
  139. jQuery.fn.justtext = function () {
  140. return $(this).clone()
  141. .children()
  142. .remove()
  143. .end()
  144. .text().trim();
  145. };
  146. };
  147.  
  148. self.tissQuickRegistration = function () {
  149. if (options.scriptEnabled) {
  150. self.pageLog("TISS Quick Registration Script enabled");
  151. self.pageLog("LVA Number: " + self.getLVANumber());
  152. self.pageLog("LVA Name: " + self.getLVAName());
  153. self.pageLog("Selected Tab: " + self.getSelectedTab());
  154.  
  155. if (options.registrationType === "lva") {
  156. options.nameOfGroup = "LVA-Anmeldung";
  157. }
  158.  
  159. // test if the lva and group exists
  160. if (!options.lvaCheckEnabled || self.doLvaCheck()) {
  161. if (!options.lvaSemesterCheckEnabled || self.doSemesterCheck()) {
  162. if(options.registrationType !== "exam") { // own code
  163. var groupLabel = self.doGroupCheck();
  164. if (groupLabel !== null) {
  165. self.highlight(groupLabel);
  166. }
  167. } else {
  168. var examLabel = self.doExamCheck();
  169. if (examLabel !== null) {
  170. self.highlight(examLabel);
  171. }
  172. }
  173. }
  174. }
  175.  
  176. if (options.startAtSpecificTime) {
  177. self.pageLog("Scripts starts at: " + self.getFormatedDate(options.specificStartTime));
  178. self.pageLog("Delay adjustment in ms: " + options.delayAdjustmentInMs);
  179. self.startTimer(options.specificStartTime.getTime() - options.delayAdjustmentInMs);
  180. } else {
  181. self.analysePage();
  182. }
  183.  
  184. } else {
  185. self.pageLog("TISS Quick Registration Script disabled");
  186. }
  187. };
  188.  
  189. self.startTimer = function (startTime) {
  190. var offset = startTime - new Date().getTime();
  191. if (offset > 0) {
  192. self.startRefreshTimer(startTime);
  193. } else {
  194. self.analysePage();
  195. }
  196. };
  197.  
  198. self.startRefreshTimer = function (startTime) {
  199. self.printTimeToStart(startTime);
  200.  
  201. var maxMillis = 2147483647;
  202. var offset = startTime - new Date().getTime();
  203.  
  204. // prevent an overflow
  205. if (offset > maxMillis) {
  206. offset = maxMillis;
  207. }
  208.  
  209. window.setTimeout(self.refreshPage, offset);
  210. };
  211.  
  212. self.printTimeToStart = function (startTime) {
  213. var offset = (startTime - new Date().getTime()) / 1000;
  214. var out = "Refresh in: " + offset + " seconds";
  215. self.log(out);
  216.  
  217. self.pageCountdown(out);
  218.  
  219. window.setTimeout(function () {
  220. self.printTimeToStart(startTime);
  221. }, 1000);
  222. };
  223.  
  224. self.refreshPage = function () {
  225. location.reload();
  226. };
  227.  
  228. self.analysePage = function () {
  229.  
  230. var tab = self.getSelectedTab();
  231. var confirmButton = self.getConfirmButton();
  232. var okButton = self.getOkButton();
  233. var studyCodeSelect = self.getStudyCodeSelect();
  234.  
  235. self.log("tab: " + tab);
  236. self.log("confirmButton: " + confirmButton);
  237. self.log("okButton: " + okButton);
  238.  
  239. if (tab === "LVA-Anmeldung") {
  240. self.onLVAPage();
  241. } else if (tab === "Gruppen") {
  242. self.onGroupPage();
  243. } else if (tab === "Prüfungen") {
  244. self.onExamPage();
  245. } else if (studyCodeSelect.length > 0) {
  246. self.onStudyCodeSelectPage();
  247. } else if (confirmButton.length > 0) {
  248. self.onConfirmPage();
  249. } else if (okButton.length > 0) {
  250. self.onConfirmInfoPage();
  251. }
  252. };
  253.  
  254. self.getLVANumber = function () {
  255. return $('#contentInner').find('h1 span:first').text().trim();
  256. };
  257.  
  258. self.getLVAName = function () {
  259. return $('#contentInner').find('h1').justtext();
  260. };
  261.  
  262. self.getSemester = function () {
  263. return $('#contentInner').find('h1 select').val();
  264. };
  265.  
  266. self.getSelectedTab = function () {
  267. return $('li.ui-tabs-selected').text().trim();
  268. };
  269.  
  270. self.getSubHeader = function () {
  271. return $('#contentInner').find('#subHeader').text().trim();
  272. };
  273.  
  274. self.onLVAPage = function () {
  275. self.onGroupPage();
  276. };
  277.  
  278. self.onGroupPage = function () {
  279. if (options.lvaCheckEnabled && !self.doLvaCheck()) {
  280. return;
  281. }
  282.  
  283. if (options.lvaSemesterCheckEnabled && !self.doSemesterCheck()) {
  284. return;
  285. }
  286.  
  287. var groupLabel = self.doGroupCheck();
  288. if (groupLabel === null) {
  289. return;
  290. }
  291. self.highlight(groupLabel);
  292.  
  293. var groupWrapper = groupLabel.closest('.groupWrapper');
  294.  
  295. // open the panel if the option is activated
  296. if (options.openPanel) {
  297. groupWrapper.children().show();
  298. // for some reason, we have to wait some time here and try it again :/
  299. setTimeout(function () {
  300. groupWrapper.children().show();
  301. }, 100);
  302. }
  303.  
  304. // search for the registration button
  305. var regButton = self.getRegistrationButton(groupWrapper);
  306. self.log('regButton: ' + regButton);
  307.  
  308.  
  309. // push the button
  310. if (regButton.length > 0) {
  311.  
  312. self.highlight(regButton);
  313. regButton.focus();
  314.  
  315. if (options.autoRegister) {
  316. regButton.click();
  317. }
  318. } else {
  319. if (self.getGroupCancelButton(groupWrapper).length > 0) {
  320. self.pageOut('you are registered in group: ' + options.nameOfGroup);
  321. } else {
  322. // Only refresh the page if the option is set and if the registration is not yet completed.
  323. if (options.autoRefresh) {
  324. refreshPage();
  325. }
  326. self.pageOut('no registration button found');
  327. }
  328. }
  329. };
  330.  
  331. self.onExamPage = function () {
  332. if (options.lvaCheckEnabled && !self.doLvaCheck()) {
  333. return;
  334. }
  335.  
  336. if (options.lvaSemesterCheckEnabled && !self.doSemesterCheck()) {
  337. return;
  338. }
  339.  
  340. var examLabel = self.doExamCheck();
  341. if (examLabel === null) {
  342. return;
  343. }
  344. self.highlight(examLabel);
  345.  
  346. var examWrapper = examLabel.closest('.groupWrapper');
  347.  
  348. // open the panel if the option is activated
  349. if (options.openPanel) {
  350. examWrapper.children().show();
  351. // for some reason, we have to wait some time here and try it again :/
  352. setTimeout(function () {
  353. examWrapper.children().show();
  354. }, 100);
  355. }
  356.  
  357. // search for the registration button
  358. var regButton = self.getRegistrationButton(examWrapper);
  359. self.log('regButton: ' + regButton);
  360.  
  361.  
  362. // push the button
  363. if (regButton.length > 0) {
  364.  
  365. self.highlight(regButton);
  366. regButton.focus();
  367.  
  368. if (options.autoRegister) {
  369. regButton.click();
  370. }
  371. } else {
  372. if (self.getGroupCancelButton(examWrapper).length > 0) {
  373. self.pageOut('you are registered in exam: ' + options.nameOfExam);
  374. } else {
  375. // Only refresh the page if the option is set and if the registration is not yet completed.
  376. if (options.autoRefresh) {
  377. refreshPage();
  378. }
  379. self.pageOut('no registration button found');
  380. }
  381. }
  382. };
  383.  
  384. self.onStudyCodeSelectPage = function () {
  385. var studyCodeSelect = self.getStudyCodeSelect();
  386. var confirmButton = self.getConfirmButton();
  387. self.highlight(confirmButton);
  388. if (options.studyCode !== undefined && options.studyCode.length > 0) {
  389. self.setSelectValue(studyCodeSelect, options.studyCode);
  390. }
  391. confirmButton.focus();
  392. if (options.autoConfirm) {
  393. confirmButton.click();
  394. }
  395. };
  396.  
  397. self.onConfirmPage = function () {
  398. var confirmButton = self.getConfirmButton();
  399. self.highlight(confirmButton);
  400. confirmButton.focus();
  401. if (options.autoConfirm) {
  402. confirmButton.click();
  403. }
  404. };
  405.  
  406. self.onConfirmInfoPage = function () {
  407. var okButton = self.getOkButton();
  408. self.highlight(okButton);
  409. if (options.autoOkPressAtEnd) {
  410. setTimeout(function () {
  411. var okButton = self.getOkButton();
  412. okButton.click();
  413. }, options.okPressAtEndDelayInMs);
  414. }
  415. };
  416.  
  417. self.pageOut = function (text) {
  418. var out = self.getOutputField();
  419. out.text(text);
  420. };
  421.  
  422. self.pageCountdown = function (text) {
  423. var out = self.getCountdownField();
  424. out.text(text);
  425. };
  426.  
  427. self.pageLog = function (text) {
  428. self.appendToLogField(text);
  429. };
  430.  
  431. self.getOutputField = function () {
  432. var outputField = $('#TQRScriptOutput');
  433. if (outputField.length === 0) {
  434. self.injectOutputField();
  435. outputField = self.getOutputField();
  436. }
  437. return outputField;
  438. };
  439.  
  440. self.getCountdownField = function () {
  441. var countdownField = $('#TQRScriptCountdown');
  442. if (countdownField.length === 0) {
  443. self.injectCountdownField();
  444. countdownField = self.getCountdownField();
  445. }
  446. return countdownField;
  447. };
  448.  
  449. self.getLogField = function () {
  450. var logField = $('#TQRScriptLog');
  451. if (logField.length === 0) {
  452. self.injectLogField();
  453. logField = self.getLogField();
  454. if (options.showLog) {
  455. logField.show();
  456. } else {
  457. logField.hide();
  458. }
  459. }
  460. return logField;
  461. };
  462.  
  463. self.injectOutputField = function () {
  464. var el = $('#contentInner');
  465. var log = $('#TQRScriptLog');
  466. if (log.length) {
  467. el = log;
  468. }
  469. el.before('<div id="TQRScriptOutput" style="color: red; font-weight: bold; font-size: 14pt; padding: 8px 0px;"></div>');
  470. };
  471.  
  472. self.injectCountdownField = function () {
  473. var el = $('#contentInner');
  474. var log = $('#TQRScriptLog');
  475. if (log.length) {
  476. el = log;
  477. }
  478. el.before('<div id="TQRScriptCountdown" style="color: blue; font-weight: bold; font-size: 14pt; padding: 8px 0px;"></div>');
  479. };
  480.  
  481. self.injectLogField = function () {
  482. $('#contentInner').before('<div id="TQRScriptLog" style="color: black; background-color: #FFFCD9; font-size: 10pt;"><b>Information Log:</b></div>');
  483. };
  484.  
  485. self.appendToLogField = function (text) {
  486. var log = self.getLogField();
  487. var newText = log.html() + "<br />" + text;
  488. log.html(newText);
  489. };
  490.  
  491. self.getRegistrationButton = function (groupWrapper) {
  492. var regButton;
  493. if (options.registrationType === "group") {
  494. regButton = $(groupWrapper).find("input:submit[value='Anmelden']");
  495. if (regButton.length === 0) {
  496. regButton = $(groupWrapper).find("input:submit[value='Voranmelden']");
  497. if (regButton.length === 0) {
  498. regButton = $(groupWrapper).find("input:submit[value='Voranmeldung']");
  499. }
  500. }
  501. } else if (options.registrationType === "exam") {
  502. regButton = $(groupWrapper).find("input:submit[value='Anmelden']");
  503. } else if (options.registrationType === "lva") {
  504. regButton = $(groupWrapper).find("input:submit[value='Anmelden']");
  505. } else {
  506. self.pageLog("registrationType Error: unknown type '" + options.registrationType + "'");
  507. }
  508. return regButton;
  509. };
  510.  
  511. self.getGroupCancelButton = function (groupWrapper) {
  512. var unregButton = null;
  513. if (options.registrationType === "group") {
  514. unregButton = $(groupWrapper).find("input:submit[value='Abmelden']");
  515. } else if (options.registrationType === "exam") {
  516. unregButton = $(groupWrapper).find("input:submit[value='Abmelden']");
  517. } else if (options.registrationType === "lva") {
  518. unregButton = $(groupWrapper).find("input:submit[value='Abmelden']").filter(function (index) {
  519. return $(this).attr("id") !== 'registrationForm:confirmOkBtn';
  520. });
  521. } else {
  522. self.pageLog("registrationType Error: unknown type '" + options.registrationType + "'");
  523. }
  524. return unregButton;
  525. };
  526.  
  527. self.getConfirmButton = function () {
  528. var confirmButton = $("form#regForm input:submit[value='Anmelden']");
  529. if (confirmButton.length === 0) {
  530. confirmButton = $("form#regForm input:submit[value='Voranmelden']");
  531. if (confirmButton.length === 0) {
  532. confirmButton = $("form#regForm input:submit[value='Voranmeldung']");
  533. }
  534. }
  535. return confirmButton;
  536. };
  537.  
  538. self.getOkButton = function () {
  539. return $("form#confirmForm input:submit[value='Ok']");
  540. };
  541.  
  542. self.getStudyCodeSelect = function () {
  543. return $("#regForm").find("select");
  544. };
  545.  
  546. self.getGroupLabel = function (nameOfGroup) {
  547. return $(".groupWrapper .header_element span").filter(function () {
  548. return $(this).text().trim() === nameOfGroup;
  549. });
  550. };
  551.  
  552. self.getExamLabel = function (nameOfExam) {
  553. return $(".groupWrapper .header_element span").filter(function () {
  554. var tmp = $(this).text().trim();
  555. return tmp.match(nameOfExam);
  556. });
  557. };
  558.  
  559. self.getExamDate = function (dateOfExam) {
  560. return $(".groupWrapper .header_element").filter(function () {
  561. return $(this).text().trim() === dateOfExam;
  562. });
  563. };
  564.  
  565. self.highlight = function (object) {
  566. object.css("background-color", "lightgreen");
  567. };
  568.  
  569. self.isCorrectSemester = function () {
  570. return self.getSubHeader().contains(options.lvaSemester);
  571. };
  572.  
  573. self.setSelectValue = function ($element, value) {
  574. $element.find('option').removeAttr('selected');
  575. $element.find('option[value="' + value + '"]').attr('selected', 'selected');
  576. };
  577.  
  578. self.doGroupCheck = function () {
  579. var groupLabel = self.getGroupLabel(options.nameOfGroup);
  580. if (groupLabel.length === 0) {
  581. self.pageOut('group not found error: ' + options.nameOfGroup);
  582. return null;
  583. } else {
  584. return groupLabel;
  585. }
  586. };
  587.  
  588. self.doLvaCheck = function () {
  589. var lvaNumber = self.getLVANumber();
  590. lvaNumber = lvaNumber.replace(/[^\d]/, '');
  591. var optionsLvaNumber = options.lvaNumber.replace(/[^\d]/, '');
  592. if (lvaNumber !== optionsLvaNumber) {
  593. self.pageOut('wrong lva number error: expected: ' + optionsLvaNumber + ', got: ' + lvaNumber);
  594. return false;
  595. }
  596. return true;
  597. };
  598.  
  599. self.doSemesterCheck = function () {
  600. var subheader = self.getSubHeader();
  601. if (subheader.indexOf(options.lvaSemester) === -1) {
  602. self.pageOut('wrong semester error: expected: ' + options.lvaSemester + ', got: ' + subheader.substring(0, 5));
  603. return false;
  604. }
  605. return true;
  606. };
  607.  
  608. self.doExamCheck = function () {
  609. var examLabel = self.getExamLabel(options.nameOfExam);
  610. var examDate = self.getExamDate(options.dateOfExam);
  611. if (examLabel.length === 0) {
  612. self.pageOut('exam not found error: ' + options.nameOfExam);
  613. return null;
  614. } else {
  615. return examLabel;
  616. }
  617. };
  618.  
  619. self.getFormatedDate = function (date) {
  620. return "" + date.getDate() + "." + (date.getMonth() + 1) + "." + date.getFullYear() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + ":" + date.getMilliseconds();
  621. };
  622.  
  623. self.log = function (message) {
  624. console.log(message);
  625. };
  626.  
  627.  
  628. // Initialize the script
  629. self.init();
  630. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement