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), }; }