chore(misc): normalize logs (#242)

This commit is contained in:
Jef LeCompte
2020-09-23 14:20:06 -04:00
committed by GitHub
parent 8466f9f398
commit 7c50e2b5aa
21 changed files with 239 additions and 183 deletions
+23 -22
View File
@@ -1,8 +1,8 @@
import {Browser, Page, Response} from 'puppeteer';
import {Link, Store} from './model';
import {Logger, Print} from '../logger';
import {closePage, delay, getSleepTime} from '../util';
import {Config} from '../config';
import {Logger} from '../logger';
import {includesLabels} from './includes-labels';
import open from 'open';
import {sendNotification} from '../notification';
@@ -69,27 +69,12 @@ async function lookup(browser: Browser, store: Store) {
}
async function lookupCard(browser: Browser, store: Store, page: Page, link: Link) {
const givenWaitFor = store.customWaitFor ? store.customWaitFor : 'networkidle0';
const givenWaitFor = store.waitUntil ? store.waitUntil : 'networkidle0';
const response: Response | null = await page.goto(link.url, {waitUntil: givenWaitFor});
const graphicsCard = `${link.brand} ${link.model}`;
if (await lookupCardInStock(store, page)) {
Logger.info(`🚀🚀🚀 [${store.name}] ${graphicsCard} IN STOCK 🚀🚀🚀`);
Logger.info(link.url);
if (Config.page.inStockWaitTime) {
inStock[store.name] = true;
setTimeout(() => {
inStock[store.name] = false;
}, 1000 * Config.page.inStockWaitTime);
}
if (Config.page.capture) {
Logger.debug(' saving screenshot');
link.screenshot = `success-${Date.now()}.png`;
await page.screenshot({path: link.screenshot});
}
let givenUrl = link.cartUrl ? link.cartUrl : link.url;
Logger.info(`${Print.inStock(link, store)}\n${givenUrl}`);
if (Config.browser.open) {
if (link.openCartAction === undefined) {
@@ -99,22 +84,38 @@ async function lookupCard(browser: Browser, store: Store, page: Page, link: Link
}
}
sendNotification(givenUrl, link);
sendNotification(link, store);
if (Config.page.inStockWaitTime) {
inStock[store.name] = true;
setTimeout(() => {
inStock[store.name] = false;
}, 1000 * Config.page.inStockWaitTime);
}
if (Config.page.capture) {
Logger.debug(' saving screenshot');
link.screenshot = `success-${Date.now()}.png`;
await page.screenshot({path: link.screenshot});
}
return;
}
if (await lookupPageHasCaptcha(store, page)) {
Logger.warn(`✖ [${store.name}] CAPTCHA from: ${graphicsCard}. Waiting for a bit with this store...`);
Logger.warn(Print.captcha(link, store));
await delay(getSleepTime());
return;
}
if (response && response.status() === 429) {
Logger.warn(`✖ [${store.name}] Rate limit exceeded: ${graphicsCard}`);
Logger.warn(Print.rateLimit(link, store));
return;
}
Logger.info(`✖ [${store.name}] still out of stock: ${graphicsCard}`);
Logger.info(Print.outOfStock(link, store));
}
async function lookupCardInStock(store: Store, page: Page) {
+2 -2
View File
@@ -1,7 +1,6 @@
import {Store} from './store';
export const BestBuyCa: Store = {
customWaitFor: 'domcontentloaded',
labels: {
inStock: {
container: '#root',
@@ -22,5 +21,6 @@ export const BestBuyCa: Store = {
url: 'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3080-trinity-10gb-gddr6x-video-card/14953249?intl=nosplash'
}
],
name: 'bestbuy-ca'
name: 'bestbuy-ca',
waitUntil: 'domcontentloaded'
};
+22 -11
View File
@@ -55,26 +55,29 @@ export function generateSetupAction() {
const page = await browser.newPage();
Logger.info('[nvidia] creating cart/session token...');
let response: Response | null;
try {
Logger.debug('creating cart/session token...');
response = await page.goto(nvidiaSessionUrl(nvidiaLocale), {waitUntil: 'networkidle0'});
if (response === null) {
throw new Error('NvidiaAccessTokenUnavailable');
}
const data = await response.json() as NvidiaSessionTokenJSON;
const accessToken = data.access_token;
Logger.info('[nvidia] you can log into your cart now...');
const cartUrl = checkoutUrl(drLocale, accessToken);
Logger.info(cartUrl);
Logger.debug(cartUrl);
if (Config.browser.open) {
Logger.info(' opening browser for user to login');
await open(cartUrl);
}
} catch (error) {
Logger.debug(error);
Logger.error('✖ [nvidia] cannot generate cart/session token, continuing without, auto-"add to cart" may not work...');
Logger.error('✖ [nvidia] cannot generate cart/session token, continuing without; auto "add to cart" may not work', error);
}
await page.close();
@@ -84,11 +87,14 @@ export function generateSetupAction() {
export function generateOpenCartAction(id: number, nvidiaLocale: string, drLocale: string, cardName: string) {
return async (browser: Browser) => {
const page = await browser.newPage();
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, starting auto add to cart... 🚀🚀🚀`);
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, starting auto add to cart 🚀🚀🚀`);
let response: Response | null;
let cartUrl: string;
try {
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, getting access token... 🚀🚀🚀`);
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, getting access token 🚀🚀🚀`);
response = await page.goto(nvidiaSessionUrl(nvidiaLocale), {waitUntil: 'networkidle0'});
if (response === null) {
throw new Error('NvidiaAccessTokenUnavailable');
@@ -97,16 +103,21 @@ export function generateOpenCartAction(id: number, nvidiaLocale: string, drLocal
const data = await response.json() as NvidiaSessionTokenJSON;
const accessToken = data.access_token;
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, adding to cart... 🚀🚀🚀`);
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, adding to cart 🚀🚀🚀`);
response = await page.goto(addToCartUrl(id, drLocale, accessToken), {waitUntil: 'networkidle0'});
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, opening checkout page... 🚀🚀🚀`);
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, opening checkout page 🚀🚀🚀`);
cartUrl = checkoutUrl(drLocale, accessToken);
Logger.info(cartUrl);
await open(cartUrl);
} catch (error) {
Logger.debug(error);
Logger.error(`✖ [nvidia] ${cardName} could not automatically add to cart, opening page`);
Logger.error(`✖ [nvidia] ${cardName} could not automatically add to cart, opening page`, error);
cartUrl = fallbackCartUrl(nvidiaLocale);
await open(cartUrl);
}
+1 -2
View File
@@ -47,8 +47,7 @@ for (const name of Config.store.stores) {
}
}
const logString = `Selected stores: ${Array.from(list.keys()).join(', ')}`;
Logger.info(logString);
Logger.info(` selected stores: ${Array.from(list.keys()).join(', ')}`);
export const Stores = Array.from(list.values()) as Store[];
+9 -9
View File
@@ -1,11 +1,11 @@
import {Browser, LoadEvent} from 'puppeteer';
export interface Element {
export type Element = {
container: string;
text: string[];
}
};
export interface Link {
export type Link = {
series: string;
brand: string;
model: string;
@@ -13,17 +13,17 @@ export interface Link {
cartUrl?: string;
openCartAction?: (browser: Browser) => Promise<string>;
screenshot?: string;
}
};
export interface Labels {
export type Labels = {
captcha?: Element;
inStock: Element;
}
};
export interface Store {
export type Store = {
links: Link[];
labels: Labels;
name: string;
setupAction?: (browser: Browser) => void;
customWaitFor?: LoadEvent;
}
waitUntil?: LoadEvent;
};