feat(notification): add desktop notifications (#140)

Co-authored-by: Jef LeCompte <jeffreylec@gmail.com>
This commit is contained in:
Nachi G
2020-09-20 17:48:27 -07:00
committed by GitHub
parent 7191e03a80
commit 722eaf3cd6
6 changed files with 123 additions and 5 deletions
+1
View File
@@ -62,6 +62,7 @@ Here is a list of variables that you can use to customize your newly copied `.en
| **Environment variable** | **Description** | **Notes** | | **Environment variable** | **Description** | **Notes** |
|:---:|---|---| |:---:|---|---|
| `DESKTOP_NOTIFICATIONS` | Display desktop notifications using [node-notifier](https://www.npmjs.com/package/node-notifier); optional | Default: `false` |
| `DISCORD_NOTIFY_GROUP` | Discord group you would like to notify; optional | E.g.: @here | | `DISCORD_NOTIFY_GROUP` | Discord group you would like to notify; optional | E.g.: @here |
| `DISCORD_WEB_HOOK` | Discord Web Hook URL | | `DISCORD_WEB_HOOK` | Discord Web Hook URL |
| `EMAIL_USERNAME` | Gmail address | E.g.: `jensen.robbed.us@gmail.com` | | `EMAIL_USERNAME` | Gmail address | E.g.: `jensen.robbed.us@gmail.com` |
+99 -5
View File
@@ -439,6 +439,15 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.1.tgz",
"integrity": "sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw==" "integrity": "sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw=="
}, },
"@types/node-notifier": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@types/node-notifier/-/node-notifier-8.0.0.tgz",
"integrity": "sha512-CseIDQOC/I+yvj/4ItpG4ATcwooQlGPDDJweII8nspjjZg4ZBuvkyHg9P81QkElgU9FpYlb5A27BRggD3idTCQ==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/nodemailer": { "@types/nodemailer": {
"version": "6.4.0", "version": "6.4.0",
"resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.0.tgz", "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.0.tgz",
@@ -3289,6 +3298,11 @@
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"dev": true "dev": true
}, },
"growly": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
},
"hard-rejection": { "hard-rejection": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
@@ -3844,8 +3858,7 @@
"isexe": { "isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
"dev": true
}, },
"isobject": { "isobject": {
"version": "3.0.1", "version": "3.0.1",
@@ -4656,6 +4669,19 @@
} }
} }
}, },
"node-notifier": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz",
"integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==",
"requires": {
"growly": "^1.3.0",
"is-wsl": "^2.2.0",
"semver": "^7.3.2",
"shellwords": "^0.1.1",
"uuid": "^8.3.0",
"which": "^2.0.2"
}
},
"nodemailer": { "nodemailer": {
"version": "6.4.11", "version": "6.4.11",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.11.tgz", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.11.tgz",
@@ -5254,6 +5280,21 @@
"@types/puppeteer": "*", "@types/puppeteer": "*",
"debug": "^4.1.1", "debug": "^4.1.1",
"deepmerge": "^4.2.2" "deepmerge": "^4.2.2"
},
"dependencies": {
"debug": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
} }
}, },
"puppeteer-extra-plugin": { "puppeteer-extra-plugin": {
@@ -5264,6 +5305,21 @@
"@types/debug": "^4.1.0", "@types/debug": "^4.1.0",
"debug": "^4.1.1", "debug": "^4.1.1",
"merge-deep": "^3.0.1" "merge-deep": "^3.0.1"
},
"dependencies": {
"debug": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
} }
}, },
"puppeteer-extra-plugin-adblocker": { "puppeteer-extra-plugin-adblocker": {
@@ -5276,6 +5332,21 @@
"debug": "^4.1.1", "debug": "^4.1.1",
"node-fetch": "^2.6.0", "node-fetch": "^2.6.0",
"puppeteer-extra-plugin": "^3.1.7" "puppeteer-extra-plugin": "^3.1.7"
},
"dependencies": {
"debug": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
} }
}, },
"puppeteer-extra-plugin-stealth": { "puppeteer-extra-plugin-stealth": {
@@ -5285,6 +5356,21 @@
"requires": { "requires": {
"debug": "^4.1.1", "debug": "^4.1.1",
"puppeteer-extra-plugin": "^3.1.7" "puppeteer-extra-plugin": "^3.1.7"
},
"dependencies": {
"debug": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
} }
}, },
"pushover-notifications": { "pushover-notifications": {
@@ -5613,8 +5699,7 @@
"semver": { "semver": {
"version": "7.3.2", "version": "7.3.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
"dev": true
}, },
"semver-diff": { "semver-diff": {
"version": "3.1.1", "version": "3.1.1",
@@ -5713,6 +5798,11 @@
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true "dev": true
}, },
"shellwords": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
"integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="
},
"signal-exit": { "signal-exit": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
@@ -6659,6 +6749,11 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
}, },
"uuid": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
"integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ=="
},
"v8-compile-cache": { "v8-compile-cache": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
@@ -6693,7 +6788,6 @@
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": { "requires": {
"isexe": "^2.0.0" "isexe": "^2.0.0"
} }
+2
View File
@@ -24,6 +24,7 @@
"dependencies": { "dependencies": {
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"messaging-api-telegram": "^1.0.0", "messaging-api-telegram": "^1.0.0",
"node-notifier": "^8.0.0",
"nodemailer": "^6.4.11", "nodemailer": "^6.4.11",
"open": "^7.2.1", "open": "^7.2.1",
"puppeteer": "^5.3.0", "puppeteer": "^5.3.0",
@@ -39,6 +40,7 @@
"@types/node": "^14.11.1", "@types/node": "^14.11.1",
"@types/nodemailer": "^6.4.0", "@types/nodemailer": "^6.4.0",
"@types/puppeteer": "^3.0.2", "@types/puppeteer": "^3.0.2",
"@types/node-notifier": "^8.0.0",
"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",
+1
View File
@@ -13,6 +13,7 @@ const browser = {
const logLevel = process.env.LOG_LEVEL ?? 'info'; const logLevel = process.env.LOG_LEVEL ?? 'info';
const notifications = { const notifications = {
desktop: process.env.DESKTOP_NOTIFICATIONS === 'true',
discord: { discord: {
notifyGroup: process.env.DISCORD_NOTIFY_GROUP ?? '', notifyGroup: process.env.DISCORD_NOTIFY_GROUP ?? '',
webHookUrl: process.env.DISCORD_WEB_HOOK ?? '' webHookUrl: process.env.DISCORD_WEB_HOOK ?? ''
+14
View File
@@ -0,0 +1,14 @@
import notifier from 'node-notifier';
import {Link} from '../store/model';
export function sendDesktopNotification(cartUrl: string, link: Link) {
(async () => {
const title = link.brand + ' ' + link.model + ' IN STOCK';
const message = cartUrl;
notifier.notify({
title,
message
});
})();
}
+6
View File
@@ -6,6 +6,8 @@ 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 {sendDiscordMessage} from './discord';
import {sendDesktopNotification} from './desktop';
import {Link} from '../store/model'; import {Link} from '../store/model';
const notifications = Config.notifications; const notifications = Config.notifications;
@@ -41,4 +43,8 @@ export function sendNotification(cartUrl: string, link: Link) {
if (notifications.playSound) { if (notifications.playSound) {
playSound(); playSound();
} }
if (notifications.desktop) {
sendDesktopNotification(cartUrl, link);
}
} }