diff --git a/README.md b/README.md index ab68415..71225c3 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ Here is a list of variables that you can use to customize your newly copied `.en | **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_WEB_HOOK` | Discord Web Hook URL | | `EMAIL_USERNAME` | Gmail address | E.g.: `jensen.robbed.us@gmail.com` | diff --git a/package-lock.json b/package-lock.json index ccd5a57..e4a6ad3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -439,6 +439,15 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.1.tgz", "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": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.0.tgz", @@ -3289,6 +3298,11 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "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": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -3844,8 +3858,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "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": { "version": "6.4.11", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.11.tgz", @@ -5254,6 +5280,21 @@ "@types/puppeteer": "*", "debug": "^4.1.1", "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": { @@ -5264,6 +5305,21 @@ "@types/debug": "^4.1.0", "debug": "^4.1.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": { @@ -5276,6 +5332,21 @@ "debug": "^4.1.1", "node-fetch": "^2.6.0", "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": { @@ -5285,6 +5356,21 @@ "requires": { "debug": "^4.1.1", "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": { @@ -5613,8 +5699,7 @@ "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "semver-diff": { "version": "3.1.1", @@ -5713,6 +5798,11 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "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": { "version": "3.0.3", "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", "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": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", @@ -6693,7 +6788,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index e6fa952..24cfb7b 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "dependencies": { "dotenv": "^8.2.0", "messaging-api-telegram": "^1.0.0", + "node-notifier": "^8.0.0", "nodemailer": "^6.4.11", "open": "^7.2.1", "puppeteer": "^5.3.0", @@ -39,6 +40,7 @@ "@types/node": "^14.11.1", "@types/nodemailer": "^6.4.0", "@types/puppeteer": "^3.0.2", + "@types/node-notifier": "^8.0.0", "play-sound": "^1.1.3", "rimraf": "^3.0.2", "typescript": "^4.0.2", diff --git a/src/config.ts b/src/config.ts index dd4ce1e..117eca2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -13,6 +13,7 @@ const browser = { const logLevel = process.env.LOG_LEVEL ?? 'info'; const notifications = { + desktop: process.env.DESKTOP_NOTIFICATIONS === 'true', discord: { notifyGroup: process.env.DISCORD_NOTIFY_GROUP ?? '', webHookUrl: process.env.DISCORD_WEB_HOOK ?? '' diff --git a/src/notification/desktop.ts b/src/notification/desktop.ts new file mode 100644 index 0000000..f26b88d --- /dev/null +++ b/src/notification/desktop.ts @@ -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 + }); + })(); +} diff --git a/src/notification/notification.ts b/src/notification/notification.ts index dc632ea..0d7c810 100644 --- a/src/notification/notification.ts +++ b/src/notification/notification.ts @@ -6,6 +6,8 @@ import {sendSlackMessage} from './slack'; import {sendPushoverNotification} from './pushover'; import {sendTelegramMessage} from './telegram'; import {sendDiscordMessage} from './discord'; +import {sendDesktopNotification} from './desktop'; + import {Link} from '../store/model'; const notifications = Config.notifications; @@ -41,4 +43,8 @@ export function sendNotification(cartUrl: string, link: Link) { if (notifications.playSound) { playSound(); } + + if (notifications.desktop) { + sendDesktopNotification(cartUrl, link); + } }