WIP: Implementing /nag, /unnag, /checkin

This commit is contained in:
2025-07-04 10:36:40 -04:00
parent 40bf06f288
commit e53d38e0ad
5 changed files with 269 additions and 5 deletions

View File

@@ -0,0 +1,79 @@
import {
ChatInputCommandInteraction,
Client,
SlashCommandBuilder,
} from "discord.js";
import { Sequelize, literal } from "sequelize";
import { Nag, CheckIn, Settings } from "./common";
import { Chrono } from "chrono-node";
const data = new SlashCommandBuilder()
.setName("nag")
.setDescription("Let Blitzcrank nag you every day about something")
.addStringOption((option) =>
option
.setRequired(true)
.setName("text")
.setDescription("What you have to do every day"),
)
.addStringOption((option) =>
option
.setName("failText")
.setDescription("Custom message to be broadcast on failure"),
)
.addBooleanOption((option) =>
option
.setName("mentionHere")
.setDescription("Whether to DM you or @ a channel")
.setRequired(false),
);
function lateCheckedInUsers() {
return Nag.findAll({
include: [CheckIn],
where: literal(
"checkInTime <= datetime('now', '-1 day', 'start of day', '+9 hours')",
),
});
}
async function initialize(settings: Settings) {}
async function execute(interaction: ChatInputCommandInteraction) {
const text = interaction.options.getString("text");
if (text === null || text === undefined) {
await interaction.reply("Nag can't have a blank `text`, try again.");
return;
}
const nag = await Nag.create({
userId: interaction.user.id,
text: text,
failText: interaction.options.getString("failText"),
mentionHere: interaction.options.getBoolean("mentionHere") ?? false,
});
await nag.save();
const chrono = new Chrono();
const checkIn = chrono.parseDate("today at 9AM");
if (!checkIn) {
await interaction.reply(
"Internal error while saving your nag. Tell Drew the bot is broken!!!",
);
return;
}
await CheckIn.create({
nagId: nag.id,
checkIn: checkIn,
});
await interaction.reply(
`I'll check every day at 9AM if you've completed '${text}'. If not, I'll nag you! Use /checkin to prevent a shameful callout, and /unnag to cancel.`,
);
}
export default function (settings: Settings) {
return {
data,
execute,
initialize: async () => await initialize(settings),
};
}