mirror of
https://github.com/opelly27/streetmerchant.git
synced 2026-05-20 07:37:39 +00:00
feat(notification): discord integration (#82)
Co-authored-by: Jef LeCompte <jeffreylec@gmail.com>
This commit is contained in:
@@ -18,3 +18,5 @@ STORES="bestbuy,bandh,nvidia"
|
|||||||
SCREENSHOT="true"
|
SCREENSHOT="true"
|
||||||
TELEGRAM_ACCESS_TOKEN=""
|
TELEGRAM_ACCESS_TOKEN=""
|
||||||
TELEGRAM_CHAT_ID="1234"
|
TELEGRAM_CHAT_ID="1234"
|
||||||
|
DISCORD_WEB_HOOK="https://discordapp.com/api/webhooks/23123123123/5dfsdfh3h2j5hdfhsdfsdhj55jf"
|
||||||
|
DISCORD_NOTIFY_GROUP="@here"
|
||||||
|
|||||||
@@ -60,8 +60,11 @@ To customize `nvidia-snatcher`, make a copy of `.env-example` as `.env` and make
|
|||||||
|
|
||||||
Here is a list of variables that you can use to customize your newly copied `.env` file:
|
Here is a list of variables that you can use to customize your newly copied `.env` file:
|
||||||
|
|
||||||
|
|
||||||
| **Environment variable** | **Description** | **Notes** |
|
| **Environment variable** | **Description** | **Notes** |
|
||||||
|:---:|---|---|
|
|:---:|---|---|
|
||||||
|
| `DISCORD_WEB_HOOK` | Discord Web Hook URL |
|
||||||
|
| `DISCORD_NOTIFY_GROUP` | Discord group you would like to notify; optional | E.g.: @here |
|
||||||
| `EMAIL_USERNAME` | Gmail address | E.g.: `jensen.robbed.us@gmail.com` |
|
| `EMAIL_USERNAME` | Gmail address | E.g.: `jensen.robbed.us@gmail.com` |
|
||||||
| `EMAIL_PASSWORD` | Gmail password | See below if you have MFA |
|
| `EMAIL_PASSWORD` | Gmail password | See below if you have MFA |
|
||||||
| `HEADLESS` | Puppeteer to run headless or not | Debugging related, default: `true` |
|
| `HEADLESS` | Puppeteer to run headless or not | Debugging related, default: `true` |
|
||||||
@@ -82,6 +85,7 @@ Here is a list of variables that you can use to customize your newly copied `.en
|
|||||||
| `SCREENSHOT` | Capture screenshot of page if a card is found | Default: `true` |
|
| `SCREENSHOT` | Capture screenshot of page if a card is found | Default: `true` |
|
||||||
| `TELEGRAM_ACCESS_TOKEN` | Telegram access token |
|
| `TELEGRAM_ACCESS_TOKEN` | Telegram access token |
|
||||||
| `TELEGRAM_CHAT_ID` | Telegram chat ID |
|
| `TELEGRAM_CHAT_ID` | Telegram chat ID |
|
||||||
|
|
||||||
> :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: 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.
|
||||||
|
|
||||||
#### Supported stores
|
#### Supported stores
|
||||||
|
|||||||
Generated
+23
@@ -1745,6 +1745,29 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"discord-webhook-node": {
|
||||||
|
"version": "1.1.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/discord-webhook-node/-/discord-webhook-node-1.1.8.tgz",
|
||||||
|
"integrity": "sha512-3u0rrwywwYGc6HrgYirN/9gkBYqmdpvReyQjapoXARAHi0P0fIyf3W5tS5i3U3cc7e44E+e7dIHYUeec7yWaug==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"form-data": "^3.0.0",
|
||||||
|
"node-fetch": "^2.6.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"form-data": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"asynckit": "^0.4.0",
|
||||||
|
"combined-stream": "^1.0.8",
|
||||||
|
"mime-types": "^2.1.12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"doctrine": {
|
"doctrine": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
|
||||||
|
|||||||
+2
-1
@@ -42,6 +42,7 @@
|
|||||||
"play-sound": "^1.1.3",
|
"play-sound": "^1.1.3",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^4.0.2",
|
"typescript": "^4.0.2",
|
||||||
"xo": "^0.33.1"
|
"xo": "^0.33.1",
|
||||||
|
"discord-webhook-node": "^1.1.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,10 @@ const notifications = {
|
|||||||
accessToken: process.env.TELEGRAM_ACCESS_TOKEN ?? '',
|
accessToken: process.env.TELEGRAM_ACCESS_TOKEN ?? '',
|
||||||
chatId: process.env.TELEGRAM_CHAT_ID ?? ''
|
chatId: process.env.TELEGRAM_CHAT_ID ?? ''
|
||||||
},
|
},
|
||||||
|
discord: {
|
||||||
|
webHookUrl: process.env.DISCORD_WEB_HOOK ?? '',
|
||||||
|
notifyGroup: process.env.DISCORD_NOTIFY_GROUP ?? ''
|
||||||
|
},
|
||||||
test: process.env.NOTIFICATION_TEST === 'true'
|
test: process.env.NOTIFICATION_TEST === 'true'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -55,7 +55,7 @@ async function main() {
|
|||||||
* Send test email.
|
* Send test email.
|
||||||
*/
|
*/
|
||||||
if (Config.notifications.test) {
|
if (Config.notifications.test) {
|
||||||
sendNotification('test');
|
sendNotification('http://test.com/', {brand: 'THE BEST BRAND', model: 'VENTUS', oosLabels: [], url: '', cartUrl: ''});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import {Webhook, MessageBuilder} from 'discord-webhook-node';
|
||||||
|
import {Config} from '../config';
|
||||||
|
import {Logger} from '../logger';
|
||||||
|
import {Link} from '../store/model';
|
||||||
|
|
||||||
|
const hook = new Webhook(Config.notifications.discord.webHookUrl);
|
||||||
|
const notifyGroup = Config.notifications.discord.notifyGroup;
|
||||||
|
|
||||||
|
export function sendDiscordMessage(cartUrl: string, link: Link) {
|
||||||
|
(async () => {
|
||||||
|
try {
|
||||||
|
const embed = new MessageBuilder();
|
||||||
|
embed.setTitle('Stock Notification');
|
||||||
|
embed.addField('URL', cartUrl, true);
|
||||||
|
embed.addField('Brand', link.brand, true);
|
||||||
|
embed.addField('Model', link.model, true);
|
||||||
|
|
||||||
|
if (notifyGroup !== '') {
|
||||||
|
embed.addField('Attention', notifyGroup, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
embed.setColor(0x76B900);
|
||||||
|
embed.setTimestamp();
|
||||||
|
await hook.send(embed);
|
||||||
|
Logger.info(`✔ discord message sent: ${cartUrl}`);
|
||||||
|
} catch (error) {
|
||||||
|
Logger.error(error);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
@@ -5,10 +5,12 @@ import {playSound} from './sound';
|
|||||||
import {sendSlackMessage} from './slack';
|
import {sendSlackMessage} from './slack';
|
||||||
import {sendPushoverNotification} from './pushover';
|
import {sendPushoverNotification} from './pushover';
|
||||||
import {sendTelegramMessage} from './telegram';
|
import {sendTelegramMessage} from './telegram';
|
||||||
|
import {sendDiscordMessage} from './discord';
|
||||||
|
import {Link} from '../store/model';
|
||||||
|
|
||||||
const notifications = Config.notifications;
|
const notifications = Config.notifications;
|
||||||
|
|
||||||
export function sendNotification(cartUrl: string) {
|
export function sendNotification(cartUrl: string, link: Link) {
|
||||||
if (notifications.email.username && notifications.email.password) {
|
if (notifications.email.username && notifications.email.password) {
|
||||||
sendEmail(cartUrl);
|
sendEmail(cartUrl);
|
||||||
}
|
}
|
||||||
@@ -21,6 +23,10 @@ export function sendNotification(cartUrl: string) {
|
|||||||
sendTelegramMessage(cartUrl);
|
sendTelegramMessage(cartUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (notifications.discord.webHookUrl) {
|
||||||
|
sendDiscordMessage(cartUrl, link);
|
||||||
|
}
|
||||||
|
|
||||||
if (notifications.phone.number) {
|
if (notifications.phone.number) {
|
||||||
const carrier = notifications.phone.carrier.toLowerCase();
|
const carrier = notifications.phone.carrier.toLowerCase();
|
||||||
if (carrier && notifications.phone.availableCarriers.has(carrier)) {
|
if (carrier && notifications.phone.availableCarriers.has(carrier)) {
|
||||||
|
|||||||
+1
-1
@@ -74,7 +74,7 @@ export async function lookup(browser: Browser, store: Store) {
|
|||||||
await open(givenUrl);
|
await open(givenUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
sendNotification(givenUrl);
|
sendNotification(givenUrl, link);
|
||||||
}
|
}
|
||||||
|
|
||||||
await page.close();
|
await page.close();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
interface Link {
|
export interface Link {
|
||||||
cartUrl?: string;
|
cartUrl?: string;
|
||||||
brand: string;
|
brand: string;
|
||||||
model: string;
|
model: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user