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