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;