diff --git a/popup/popup.html b/popup/popup.html index 73922b6..277083a 100644 --- a/popup/popup.html +++ b/popup/popup.html @@ -55,7 +55,7 @@
- +
diff --git a/scripts/content.js b/scripts/content.js index 67f7eeb..d2230c9 100644 --- a/scripts/content.js +++ b/scripts/content.js @@ -5,6 +5,7 @@ const pathnameRegex = /^\/\w{2}-\w{2}\/n?iv/; const MAX_SIGNIN_ATTEMPTS = 1; const PAGE_WAIT_TIME = 3792; const MINUTE = 60; +const RANDOM_JITTER = 0.1; const SOFT_BAN_TIMEOUT = 27; const NOTIF_CHANNEL = "snegov_test" @@ -44,11 +45,15 @@ function getRandomInt(max) { return Math.floor(Math.random() * Math.floor(max)); } + +function getJitter(frequency) { + return frequency * MINUTE * RANDOM_JITTER; +} + function getFutureDate(minutes, maxRandomSeconds = 0) { // return date some amount of minutes in future plus random amount of seconds let futureDate = new Date(); - futureDate.setMinutes(futureDate.getMinutes() + minutes); - futureDate.setSeconds(futureDate.getSeconds() + getRandomInt(maxRandomSeconds)); + futureDate.setSeconds(futureDate.getSeconds() + minutes * MINUTE + getRandomInt(maxRandomSeconds)); return futureDate.toISOString(); } @@ -195,7 +200,7 @@ async function getConsulates() { "isSelected": option.selected, "bestDate": null, "currentDate": null, - "nextCheckAt": getFutureDate(0, config.frequency * MINUTE), + "nextCheckAt": getFutureDate(0, getJitter(config.frequency)), "autobook": false, }; } @@ -247,7 +252,7 @@ async function runner() { config.activate = result['__activate'] || false; config.username = result['__username'] || ""; config.password = result['__password'] || ""; - config.frequency = parseInt(result['__frequency'] || 1); + config.frequency = parseFloat(result['__frequency'] || 1); config.signinAttempts = result['__signinAttempts'] || 0; config.apptId = result['__apptId'] || null; config.currentAppt = result['__currentAppt'] || { consulate: null, date: null }; @@ -278,7 +283,7 @@ async function runner() { if (key === 'frequency') { let wasChanged = false; for (let consulate in config.consulates) { - let newNextCheckAt = getFutureDate(config.frequency, 10); + let newNextCheckAt = getFutureDate(config.frequency, getJitter(config.frequency)); if (config.consulates[consulate].nextCheckAt > newNextCheckAt) { config.consulates[consulate].nextCheckAt = newNextCheckAt; wasChanged = true; @@ -508,7 +513,7 @@ async function runner() { console.log(msg); await chrome.storage.local.set({ "__status": msg }); let availDates = await getAvailableDates(config.consulates[consulate].id); - config.consulates[consulate].nextCheckAt = getFutureDate(config.frequency, 10); + config.consulates[consulate].nextCheckAt = getFutureDate(config.frequency, getJitter(config.frequency)); if (!availDates) { msg = `Failed to fetch available dates in ${consulate}`; @@ -530,7 +535,7 @@ async function runner() { // Only set SOFT_BAN_TIMEOUT if it's not the first 5 minutes of 23pm UTC if (!(currentHourUTC === 23 && currentMinuteUTC < 5)) { - config.consulates[consulate].nextCheckAt = getFutureDate(SOFT_BAN_TIMEOUT, 10); + config.consulates[consulate].nextCheckAt = getFutureDate(SOFT_BAN_TIMEOUT, getJitter(config.frequency)); } continue;