notif-visa-ext/scripts/content.js

216 lines
7.0 KiB
JavaScript
Raw Normal View History

2024-04-21 04:03:26 +00:00
async function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
const pathnameRegex = /^\/\w{2}-\w{2}\/n?iv/;
2024-04-21 06:50:49 +00:00
const MAX_SIGNIN_ATTEMPTS = 1;
2024-04-21 04:03:26 +00:00
const PAGE_WAIT_TIME = 5000;
let config = {
activate: null,
username: null,
password: null,
frequency: null,
countdown: null,
};
let minute = 60;
let signin_attempts = 0;
2024-04-21 06:50:49 +00:00
let isRunning = false;
2024-04-21 04:03:26 +00:00
function isSignInPage() {
return window.location.pathname.match(/^\/\w{2}-\w{2}\/n?iv\/users\/sign_in/);
}
function isLoggedOutPage() {
return window.location.pathname.match(/^\/\w{2}-\w{2}\/n?iv$/);
}
function isDashboardPage() {
return window.location.pathname.match(/^\/\w{2}-\w{2}\/n?iv\/groups\/\d+/);
}
function isAppointmentPage() {
return window.location.pathname.match(/^\/\w{2}-\w{2}\/n?iv\/schedule\/\d+\/appointment$/);
}
function isConfirmationPage() {
return window.location.pathname.match(/^\/\w{2}-\w{2}\/n?iv\/schedule\/\d+\/appointment\/instructions$/);
}
function isNotEnglishPage() {
return (isSignInPage()
|| isLoggedOutPage()
|| isDashboardPage()
|| isAppointmentPage()
|| isConfirmationPage()
) && !window.location.pathname.match(/^\/en-/);
}
async function switchToEnglishPage() {
2024-04-21 06:50:49 +00:00
console.log('Changing page to English');
2024-04-21 04:03:26 +00:00
await chrome.storage.local.set({ "__status": "switching to English" });
window.location.href(window.location.pathname.replace(/^\/\w{2}-{2}/, '/en-us'));
2024-04-21 06:50:49 +00:00
await delay(PAGE_WAIT_TIME);
2024-04-21 04:03:26 +00:00
// Should be on English page
}
async function goToSignInPage() {
2024-04-21 06:50:49 +00:00
console.log('Going to sign in page')
2024-04-21 04:03:26 +00:00
await chrome.storage.local.set({ "__status": "going to sign in page" });
document.querySelector(".homeSelectionsContainer a[href*='/sign_in']").click();
2024-04-21 06:50:49 +00:00
await delay(PAGE_WAIT_TIME);
2024-04-21 04:03:26 +00:00
// Should be on sign in page
}
async function enterCredentials() {
2024-04-21 06:50:49 +00:00
if (signin_attempts >= MAX_SIGNIN_ATTEMPTS) {
2024-04-21 04:03:26 +00:00
await chrome.storage.local.set({ "__status": "too many sign in attempts" });
return;
}
2024-04-21 06:50:49 +00:00
console.log('Signing in');
2024-04-21 04:03:26 +00:00
await chrome.storage.local.set({ "__status": "signing in" });
document.getElementById("user_email").value = config.username;
document.getElementById("user_password").value = config.password;
2024-04-21 06:50:49 +00:00
let policyConfirmed = document.querySelector('[for="policy_confirmed"]');
if (!policyConfirmed.getElementsByTagName('input')[0].checked) {
policyConfirmed.click();
}
2024-04-21 04:03:26 +00:00
document.querySelector("#sign_in_form input[type=submit]").click();
signin_attempts += 1;
2024-04-21 06:50:49 +00:00
await delay(PAGE_WAIT_TIME);
if (!isDashboardPage()) {
console.log('Sign in failed');
await chrome.storage.local.set({ "__status": "sign in failed" });
return;
}
2024-04-21 04:03:26 +00:00
}
2024-04-20 05:14:53 +00:00
async function checkDates() {
2024-04-21 06:50:49 +00:00
console.log('checkDates start');
2024-04-20 05:14:53 +00:00
config.countdown = config.frequency * minute;
await chrome.storage.local.set({ "__countdown": config.countdown });
2024-04-21 06:50:49 +00:00
console.log('checkDates done');
2024-04-20 05:14:53 +00:00
}
async function runner() {
2024-04-21 06:50:49 +00:00
if (isRunning) {
return;
}
isRunning = true;
// console.log('runner start');
2024-04-21 04:03:26 +00:00
page = window.location.pathname;
let isSignIn = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/users\/sign_in/)
let isLoggedOut = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv$/)
let isDashboard = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/groups\/\d{1,}/)
let isAppointment = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/schedule\/\d{1,}\/appointment$/)
let isConfirmation = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/schedule\/\d{1,}\/appointment\/instructions$/)
let isNotEnglish = (isSignIn || isLoggedOut || isDashboard || isAppointment || isConfirmation) && !page.match(/^\/en-/)
2024-04-20 05:14:53 +00:00
let prev_config = Object.assign({}, config);
let result = await new Promise(resolve => chrome.storage.local.get(null, resolve));
config.activate = result['__activate'] || false;
config.username = result['__username'] || "";
config.password = result['__password'] || "";
config.frequency = result['__frequency'] || 1;
config.countdown = result['__countdown'] || 0;
if (prev_config.activate === null) {
2024-04-21 06:50:49 +00:00
console.log('Reading config: ' + JSON.stringify(config));
isRunning = false;
2024-04-20 05:14:53 +00:00
return;
}
let configChanged = false;
for (let key in config) {
if (config.hasOwnProperty(key) && config[key] !== prev_config[key]) {
2024-04-21 06:50:49 +00:00
console.log(`Config change: ${key}, ${prev_config[key]} => ${config[key]}`);
2024-04-20 05:14:53 +00:00
configChanged = true;
2024-04-21 04:03:26 +00:00
2024-04-20 05:14:53 +00:00
// reduce countdown if frequency is reduced
if (key === 'frequency') {
let max_countdown = config[key] * minute;
if (config.countdown > max_countdown) {
config.countdown = max_countdown;
await chrome.storage.local.set({ "__countdown": config.countdown });
}
}
2024-04-21 04:03:26 +00:00
if (key === 'activate') {
if (config[key]) {
2024-04-21 06:50:49 +00:00
console.log('Activating extension');
2024-04-21 04:03:26 +00:00
config.countdown = 5;
await chrome.storage.local.set({ "__countdown": config.countdown });
} else {
2024-04-21 06:50:49 +00:00
console.log('Deactivating extension');
2024-04-21 04:03:26 +00:00
// reset countdown when deactivating the extension
config.countdown = 0;
await chrome.storage.local.set({ "__countdown": config.countdown });
await chrome.storage.local.set({ "__status": "inactive" });
}
}
// clear signin attempts when credentials are changed
if (key === 'username' && config[key]
|| key === 'password' && config[key]) {
signin_attempts = 0;
}
2024-04-20 05:14:53 +00:00
}
}
if (configChanged) {
// print whole config
2024-04-21 06:50:49 +00:00
console.log(JSON.stringify(config));
2024-04-20 05:14:53 +00:00
}
if (!config.activate) {
2024-04-21 06:50:49 +00:00
isRunning = false;
2024-04-20 05:14:53 +00:00
return;
}
if (config.username === "" || config.password === "") {
2024-04-21 06:50:49 +00:00
console.log('Username or password is empty');
2024-04-21 04:03:26 +00:00
await chrome.storage.local.set({ "__status": "missing credentials" });
2024-04-21 06:50:49 +00:00
isRunning = false;
2024-04-20 05:14:53 +00:00
return;
}
if (config.frequency <= 0) {
2024-04-21 06:50:49 +00:00
console.log('Frequency is 0 or negative');
2024-04-21 04:03:26 +00:00
await chrome.storage.local.set({ "__status": "invalid frequency" });
2024-04-21 06:50:49 +00:00
isRunning = false;
2024-04-20 05:14:53 +00:00
return;
}
if (config.countdown > 0) {
config.countdown -= 1;
2024-04-21 06:50:49 +00:00
console.log(`Countdown: ${config.countdown}`);
2024-04-20 05:14:53 +00:00
await chrome.storage.local.set({ "__countdown": config.countdown });
2024-04-21 04:03:26 +00:00
await chrome.storage.local.set({ "__status": `waiting, ${config.countdown}s` });
2024-04-21 06:50:49 +00:00
isRunning = false;
2024-04-20 05:14:53 +00:00
return;
}
2024-04-21 04:03:26 +00:00
if (isNotEnglish) {
await switchToEnglishPage();
}
2024-04-20 05:14:53 +00:00
2024-04-21 04:03:26 +00:00
if (isLoggedOut) {
await goToSignInPage();
} else if (isSignIn) {
await enterCredentials()
} else if (isDashboard) {
signin_attempts = 0;
await checkDates();
}
2024-04-20 05:14:53 +00:00
2024-04-21 06:50:49 +00:00
// console.log('runner done');
isRunning = false;
2024-04-20 05:14:53 +00:00
}
setInterval(runner, 1000);