Skip to content

Commit

Permalink
feat: webpage toggle, sound notification, fix evga links (#52)
Browse files Browse the repository at this point in the history
Co-authored-by: Evan Gentis <evan.gentis@gmail.com>
Co-authored-by: Jef LeCompte <jeffreylec@gmail.com>
  • Loading branch information
3 people committed Sep 19, 2020
1 parent 25643c4 commit a217409
Show file tree
Hide file tree
Showing 11 changed files with 89 additions and 5 deletions.
2 changes: 2 additions & 0 deletions .env.example
Expand Up @@ -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 changes: 4 additions & 0 deletions .gitignore
Expand Up @@ -6,3 +6,7 @@ node_modules/

.env
success-*.png

*.wav
*.mp3
*.flac
4 changes: 4 additions & 0 deletions README.md
Expand Up @@ -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** |
Expand Down
15 changes: 15 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Expand Up @@ -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"
Expand Down
8 changes: 6 additions & 2 deletions src/config.ts
Expand Up @@ -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 = {
Expand All @@ -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
};
6 changes: 5 additions & 1 deletion src/index.ts
Expand Up @@ -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);
}

Expand Down
5 changes: 5 additions & 0 deletions src/notification/index.ts
Expand Up @@ -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) {
Expand All @@ -18,4 +19,8 @@ export default function sendNotification(cartUrl: string) {
sendSMS(cartUrl);
}
}

if (Config.notifications.playSound) {
playSound();
}
}
25 changes: 25 additions & 0 deletions src/notification/sound.ts
@@ -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}`);
}
});
});
}
23 changes: 21 additions & 2 deletions src/store/evga.ts
Expand Up @@ -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 change: 1 addition & 0 deletions src/types/play-sound.d.ts
@@ -0,0 +1 @@
declare module 'play-sound';

0 comments on commit a217409

Please sign in to comment.