-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathheb.js
120 lines (99 loc) · 2.9 KB
/
heb.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
const cron = require('node-cron');
const express = require('express');
const fetch = require('node-fetch');
const dotenv = require('dotenv');
const {IncomingWebhook} = require('@slack/webhook');
const hebURL = 'https://heb-ecom-covid-vaccine.hebdigital-prd.com/vaccine_locations.json';
const cronJobInterval = '*/2 * * * *';
app = express();
dotenv.config();
const url = process.env.SLACK_WEBHOOK_URL;
const webhook = new IncomingWebhook(url);
const keepaliveURL = 'https://texas-vaccines.herokuapp.com/';
app.get('/', function(req, res) {
res.send('Staying alive.');
});
const renderSlackMessage = (locations) => {
return {
blocks: [
{
type: 'section',
text: {
type: 'mrkdwn',
text: '*Vaccines are available! 💉*',
},
},
{
type: 'section',
text: {
type: 'mrkdwn',
text: 'Click @here to schedule:',
},
accessory: {
type: 'button',
text: {
type: 'plain_text',
text: 'Schedule',
emoji: true,
},
value: 'vaccine',
url: 'https://vaccine.heb.com/scheduler',
action_id: 'button-action',
},
},
{
'type': 'divider',
},
{
'type': 'section',
'fields': locations,
},
],
};
};
cron.schedule(cronJobInterval, () => {
try {
(async () => {
const keep = await fetch(keepaliveURL);
const alive = await keep.text();
console.log(alive);
const response = await fetch(hebURL);
const vaccineLocations = await response.json();
if (response.status === 200) {
console.log('Checking for vaccines...');
const locationsWithVaccine = {};
for (const location in vaccineLocations.locations) {
if (vaccineLocations.locations.hasOwnProperty(location)) {
const {name, openTimeslots} = vaccineLocations.locations[location];
if (openTimeslots !== 0) {
locationsWithVaccine[name] = openTimeslots;
}
}
}
if (Object.keys(locationsWithVaccine).length === 0) {
console.log('No Vaccines found.');
return;
}
const slackFields = [];
for (location in locationsWithVaccine) {
if (locationsWithVaccine.hasOwnProperty(location)) {
const count = locationsWithVaccine[location];
slackFields.push({
'type': 'mrkdwn',
'text': `${location}: *${count}*`,
});
}
}
if (slackFields.length > 10) {
slackFields.length = 10; // Slack limits the number of fields to 10
}
const slackMessage = renderSlackMessage(slackFields);
await webhook.send(slackMessage);
}
console.log('Done.');
})();
} catch (error) {
console.error(error);
}
});
app.listen(process.env.PORT);