HiddenPhox/src/modules/private_reminders.js

104 lines
2.2 KiB
JavaScript

/*
private_reminders.json example:
[
{
"user": "user id",
"tz": "Etc/UTC",
"hour": 0,
"message": "it midnight"
}
]
*/
const timer = require("../lib/timer");
const fs = require("fs");
const {resolve} = require("path");
if (!fs.existsSync(resolve(__dirname, "..", "..", "private_reminders.json")))
return;
const tzFormatterCache = {};
const dmCache = {};
const reminderData = require(resolve(
__dirname,
"..",
"..",
"private_reminders.json"
));
hf.database.run(
"CREATE TABLE IF NOT EXISTS private_reminders (user STRING NOT NULL PRIMARY KEY, last_run STRING NOT NULL) WITHOUT ROWID"
);
function setLastRun(id, date) {
return new Promise((resolve, reject) => {
hf.database.run(
"REPLACE INTO private_reminders VALUES ($key,$value)",
{
$value: date,
$key: id,
},
(err) => {
if (err == null) {
resolve(true);
} else {
reject(err);
}
}
);
});
}
function getLastRun(id) {
return new Promise((resolve, reject) => {
hf.database.get(
"SELECT last_run FROM private_reminders WHERE user = $key",
{
$key: id,
},
(err, row) => {
if (err == null) {
resolve(row?.value);
} else {
reject(err);
}
}
);
});
}
timer.add(
"private_reminders",
async () => {
for (const data of reminderData) {
if (!tzFormatterCache[data.tz]) {
tzFormatterCache[data.tz] = Intl.DateTimeFormat("en-US", {
dateStyle: "short",
timeStyle: "short",
hour12: false,
timeZone: data.tz,
});
}
if (!dmCache[data.user]) {
dmCache[data.user] = await hf.bot.getDMChannel(data.user);
}
const [date, time] = tzFormatterCache[data.tz]
.format(Date.now())
.split(", ");
let [hour, minutes] = time.split(":");
hour = parseInt(hour);
minutes = parseInt(minutes);
const lastRan = await getLastRun(data.user);
if (date != lastRan && hour == data.hour && minutes == 0) {
dmCache[data.user].createMessage(":alarm_clock: " + data.message);
await setLastRun(data.user, date);
}
}
},
1000
);