68 lines
1.9 KiB
JavaScript
68 lines
1.9 KiB
JavaScript
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);
|
|
});
|