zybooks.user.js
edited
1// ==UserScript==
2// @name zyBooks Autoplay animations
3// @version 0.3
4// @description One click to speed up the boring parts
5// @author Evanito
6// @match https://learn.zybooks.com/zybook/*
7// @namespace https://github.com/Evanito/zyBAuto
8// @run-at document-idle
9// ==/UserScript==
10// TO USE: Click Autocomplete! on a zyBooks page <-----
11
12// ==== SETTINGS ====
13var autoRun = true;
14// == END SETTINGS ==
15
16// Do not edit below this line!
17// ==========================================
18(function() {
19 console.log(timeString() + " [zBA] Begin zyBooks Autocomplete by Evanito.");
20 if (autoRun) {
21 run();
22 } else {
23 (function repeat() {
24 try {
25 document.getElementsByClassName('right-buttons')[0].innerHTML = '<button id="zbaButton" type="button">Autocomplete!</button>' + document.getElementsByClassName('right-buttons')[0].innerHTML;
26 document.getElementById("zbaButton").addEventListener ("click", zBAStartButton, false);
27 } catch (error) {
28 setTimeout(() => {
29 repeat()
30 }, 1000)
31 }})()
32 }
33})();
34
35
36function zBAStartButton (zEvent) {
37 console.log(timeString() + " [zBA] Running...");
38 run();
39}
40
41function run() {
42 //click_speeds();
43 click_plays();
44 click_starts();
45 click_2x_speeds();
46 setTimeout(function(){ run(); }, 1000);
47}
48
49function click_speeds() { // Checks speed boxes. Doesn't work but isn't a necessary feature.
50 var speed = document.getElementsByClassName("speed-control");
51 for (var i = 0; i < speed.length; i++) {
52 if ((speed[i].innerHTML).includes("false")) {
53 //speed[i].click();
54 speed[i].getElementsByClassName("zb-checkbox")[0].innerHTML = "\n<input type=\"checkbox\" value=\"true\" aria-label=\"2x speed\">\n<label aria-hidden=\"true\">2x speed</label>\n"
55 console.log(timeString() + " Checked a speed box.");
56 }
57 }
58}
59
60function click_plays() { // Clicks all Play buttons
61 var plays = document.getElementsByClassName("play-button");
62 for (var i = 0; i < plays.length; i++) {
63 if (!(plays[i].classList).contains("rotate-180")){
64 plays[i].click();
65 console.log(timeString() + " Clicked a play button.");
66 }
67 }
68}
69
70function click_starts() { // Clicks all Start buttons
71 var starts = document.getElementsByClassName("start-button");
72 for (var i = 0; i < starts.length; i++) {
73 starts[i].click();
74 console.log(timeString() + " Clicked a start button.");
75 }
76}
77
78function click_2x_speeds() {
79 var speeds = document.getElementsByClassName("speed-control");
80 for (var i = 0; i < speeds.length; i++) {
81 var inputs = speeds[i].getElementsByTagName("input");
82 if (inputs.length > 0) {
83 var input = inputs[0];
84 if (!input.checked) { // Only click if not already checked
85 input.click();
86 console.log(new Date().toLocaleTimeString() + " Clicked a speed button.");
87 } else {
88 console.log(new Date().toLocaleTimeString() + " Speed button already selected.");
89 }
90 }
91 }
92}
93
94function timeString() {
95 let d = new Date();
96 let h = (d.getHours()<10?'0':'') + d.getHours();
97 let m = (d.getMinutes()<10?'0':'') + d.getMinutes();
98 let s = (d.getSeconds()<10?'0':'') + d.getSeconds();
99 let dstr = h + ':' + m + ":" + s;
100 return dstr;
101}