feat: webpage toggle, sound notification, fix evga links (#52)

Co-authored-by: Evan Gentis <evan.gentis@gmail.com>
Co-authored-by: Jef LeCompte <jeffreylec@gmail.com>
This commit is contained in:
Evan Gentis
2020-09-19 10:42:40 -04:00
committed by GitHub
parent 25643c4870
commit a21740942b
11 changed files with 89 additions and 5 deletions
+2
View File
@@ -8,4 +8,6 @@ SLACK_TOKEN="slack-token"
STORES="bestbuy,bandh,nvidia"
PHONE_NUMBER="1234567890"
PHONE_CARRIER="tmobile"
OPEN_BROWSER="true"
PLAY_SOUND="false"
SCREENSHOT="true"
+4
View File
@@ -6,3 +6,7 @@ node_modules/
.env
success-*.png
*.wav
*.mp3
*.flac
+4
View File
@@ -74,10 +74,14 @@ First, you're going to need to copy the `.env.example` to `.env`. The current op
| `SLACK_CHANNEL` | Slack channel for posting (e.g., `update`); optional |
| `SLACK_TOKEN` | Slack API token; optional
| `STORES` | List of [stores](#Supported-stores) you want to be scraped; optional, default: `nvidia` |
| `OPEN_BROWSER` | Toggle for whether or not the browser should open when item is found, default: `true` |
| `PLAY_SOUND` | Play this sound notification if a card is found.; optional |
| `SCREENSHOT` | Capture screenshot of page on successful hit; optional, default `true` |
> :point_right: If you have multi-factor authentication (MFA), you will need to create an [app password](https://myaccount.google.com/apppasswords) and use this instead of your Gmail password.
> :point_right: Free sounds available [here](https://freesound.org/home/). Place sounds into `resources/sounds/`
#### Supported stores
| **Store name** | **Store name environment variable** |
+15
View File
@@ -2721,6 +2721,12 @@
"pkg-dir": "^4.1.0"
}
},
"find-exec": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/find-exec/-/find-exec-1.0.1.tgz",
"integrity": "sha512-4o6QkGkpg3xK5s/47rdK9LDZRsE4JR1mrXnaAOXBngG6UKeIDJXfwtNCAkljgyy6VRh75D3FFaB0tii9vDEtIA==",
"dev": true
},
"find-root": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
@@ -4643,6 +4649,15 @@
"find-up": "^4.0.0"
}
},
"play-sound": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/play-sound/-/play-sound-1.1.3.tgz",
"integrity": "sha512-lqEzgtNAdfg2VUXItOtu5bTyWcqeFmnJmgvc8iHEeEOBEJdurqiGYfmCOzIpSBcwrs7XeSpvHv+Rw9dzRPc4aw==",
"dev": true,
"requires": {
"find-exec": "1.0.1"
}
},
"plur": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz",
+1
View File
@@ -32,6 +32,7 @@
"@types/node": "^14.11.1",
"@types/nodemailer": "^6.4.0",
"@types/puppeteer": "^3.0.2",
"play-sound": "^1.1.3",
"rimraf": "^3.0.2",
"typescript": "^4.0.2",
"xo": "^0.33.1"
+6 -2
View File
@@ -23,7 +23,8 @@ const notifications = {
channel: process.env.SLACK_CHANNEL ?? '',
token: process.env.SLACK_TOKEN ?? ''
},
test: process.env.NOTIFICATION_TEST ?? 'false'
test: process.env.NOTIFICATION_TEST ?? 'false',
playSound: process.env.PLAY_SOUND ?? 'false'
};
const page = {
@@ -38,9 +39,12 @@ const rateLimitTimeout = Number(process.env.RATE_LIMIT_TIMEOUT) ?? 5000;
const stores = process.env.STORES ?? 'nvidia';
const openBrowser = process.env.OPEN_BROWSER ?? 'true';
export const Config = {
notifications,
rateLimitTimeout,
page,
stores
stores,
openBrowser
};
+5 -1
View File
@@ -67,7 +67,11 @@ async function lookup(store: Store) {
}
const givenUrl = store.cartUrl ? store.cartUrl : link.url;
await open(givenUrl);
if (Config.openBrowser === 'true') {
await open(givenUrl);
}
sendNotification(givenUrl);
}
+5
View File
@@ -2,6 +2,7 @@ import {Config} from '../config';
import sendEmail from './email';
import sendSlaskMessage from './slack';
import sendSMS from './sms';
import playSound from './sound';
export default function sendNotification(cartUrl: string) {
if (Config.notifications.email.username && Config.notifications.email.password) {
@@ -18,4 +19,8 @@ export default function sendNotification(cartUrl: string) {
sendSMS(cartUrl);
}
}
if (Config.notifications.playSound) {
playSound();
}
}
+25
View File
@@ -0,0 +1,25 @@
import playerLib = require('play-sound');
import {Config} from '../config';
import {Logger} from '../logger';
import * as fs from 'fs';
const notificationSound = './resources/sounds/' + Config.notifications.playSound;
const player = playerLib();
export default function playSound() {
// Check if file exists
fs.access(notificationSound, fs.constants.F_OK, err => {
if (err) {
Logger.error(`error opening sound file: ${err.message}`);
return;
}
player.play(notificationSound, (err: string) => {
Logger.info('✔ playing sound');
if (err) {
Logger.error(`error playing sound: ${err}`);
}
});
});
}
+21 -2
View File
@@ -5,10 +5,29 @@ export const Evga: Store = {
links: [
{
brand: 'evga',
model: 'ftw3, xc3 black, xc3 gaming, xc3 ultra gaming',
url: 'https://www.evga.com/products/productlist.aspx?type=0&family=GeForce+30+Series+Family&chipset=RTX+3080',
model: 'xc3 black',
url: 'https://www.evga.com/products/product.aspx?pn=10G-P5-3881-KR',
oosLabels: ['out of stock']
},
{
brand: 'evga',
model: 'ftw3',
url: 'https://www.evga.com/products/product.aspx?pn=10G-P5-3897-KR',
oosLabels: ['out of stock']
},
{
brand: 'evga',
model: 'xc3 gaming',
url: 'https://www.evga.com/products/product.aspx?pn=10G-P5-3883-KR',
oosLabels: ['out of stock']
},
{
brand: 'evga',
model: 'xc3 ultra gaming',
url: 'https://www.evga.com/products/product.aspx?pn=10G-P5-3885-KR',
oosLabels: ['out of stock']
}
],
name: 'evga'
};
+1
View File
@@ -0,0 +1 @@
declare module 'play-sound';