import 'dotenv/config'; import express from 'express'; import cron from 'node-cron'; import { InteractionType, InteractionResponseType, verifyKeyMiddleware, } from 'discord-interactions'; // Create an express app const app = express(); // Get port, or default to 3000 const PORT = process.env.PORT || 3000; /** * Interactions endpoint URL where Discord will send HTTP requests * Parse request body and verifies incoming requests using discord-interactions package */ app.post('/', verifyKeyMiddleware(process.env.PUBLIC_KEY), async function (req, res) { // Interaction type and data const { type, data } = req.body; /** * Handle verification requests */ if (type === InteractionType.PING) { return res.send({ type: InteractionResponseType.PONG }); } /** * Handle slash command requests * See https://discord.com/developers/docs/interactions/application-commands#slash-commands */ if (type === InteractionType.APPLICATION_COMMAND) { const { name, options } = data; if (name === 'schedule_message') { const message = options[0].value; const crontab = options[1].value; const valid = cron.validate(crontab); const content = valid ? 'registered message "' + message + '" with cron "' + crontab + '"' : 'invalid cron'; if (valid) { cron.schedule(crontab, () => { console.log(message); }); } return res.send({ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, data: { content: content, }, }); } console.error(`unknown command: ${name}`); return res.status(400).json({ error: 'unknown command' }); } console.error('unknown interaction type', type); return res.status(400).json({ error: 'unknown interaction type' }); }); app.listen(PORT, () => { console.log('Listening on port', PORT); });