-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathsetCronAlarm.js
More file actions
86 lines (82 loc) · 3.79 KB
/
Copy pathsetCronAlarm.js
File metadata and controls
86 lines (82 loc) · 3.79 KB
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
const cron = require("node-cron");
const sendMsgToGroup = require("./sendReminderMsg");
const getConfigData = require("./util/getConfigData");
const WAKEUP_INTERVAL = 10; // minutes
let task;
async function setCronAlarm(pgClient) {
return new Promise((res, rej) => {
getConfigData(pgClient).then(data => {
let days3Letter = "";
for (let i = 0; i < data.daysToSend.length; i++) {
const letter = data.daysToSend.substring(i, i+1);
let threeLetter = "";
if (letter === "m") threeLetter = "mon";
else if (letter === "t") threeLetter = "tue";
else if (letter === "w") threeLetter = "wed";
else if (letter === "r") threeLetter = "thu";
else if (letter === "f") threeLetter = "fri";
else if (letter === "s") threeLetter = "sat";
else if (letter === "u") threeLetter = "sun";
days3Letter += threeLetter+",";
}
days3Letter = days3Letter.substring(0, days3Letter.length-1); // trim trailing comma
// converting CENTRAL time to SERVER time (UTC)
const t = new Date(); // system time
const systemOffset = t.getTimezoneOffset() - 300; // diff to CST America/Chicago (mins)
let sHour = data.hourToSend, sMin = data.minuteToSend;
let minsToSlurp = systemOffset;
if (minsToSlurp > 0) {
while (minsToSlurp > 0) { // find system minute
minsToSlurp--;
sMin--;
}
while (sMin < 0) { // overcorrection
sMin += 60;
sHour -= 1; // todo fix day wraparound
}
} else if (minsToSlurp < 0) {
while (minsToSlurp < 0) {
minsToSlurp++;
sMin++;
}
while (sMin >= 60) { // overcorrection
sMin -= 60;
sHour += 1;
}
}
t.setHours(sMin);
t.setMinutes(sHour); // input our time into system time
console.log(`[cron] Local time goal is ${data.hourToSend}:${data.minuteToSend}. ∴ Sytem goal time is ${sHour}:${sMin}. [Currently ${new Date().toTimeString()}]`);
if (task) task.stop(); // stop previous task
task = cron.schedule(`${sMin} ${sHour} * * ${days3Letter}`, () => {
sendMsgToGroup(pgClient)
.then(() => console.log("Scheduled message sent to group."))
.catch(err => {
//reply("Could not send the scheduled message"); // error could be message is blank
console.error("Failed to send message to the group at the scheduled time:", err);
});
});
//task.start();
const now = new Date();
const alarm = new Date();
alarm.setHours(sHour);
alarm.setMinutes(sMin);
const nextWakeup = new Date(now.getTime() + WAKEUP_INTERVAL*60*1000 + 60*1000); // 60s startup buffer
// it may be the wrong day but this is easier (todo)
if (now < alarm && nextWakeup > alarm) {
//task.stop();
//task.destroy();
res({ task: task, time: `[system] ${sHour}:${sMin} on ${days3Letter}`, close: true }); // close enough away
} else {
res({ task: task, time: `[system] ${sHour}:${sMin} on ${days3Letter}`, close: false });
}
}, err => {
console.error("Error getting config data:", err);
rej(err);
});
});
}
function cancelCronAlarm() {
task.stop();
}
module.exports = { task, setCronAlarm, cancelCronAlarm };