mirror of
https://github.com/cassoule/flopobot_v2.git
synced 2026-03-18 21:40:27 +01:00
76 lines
2.8 KiB
JavaScript
76 lines
2.8 KiB
JavaScript
import 'dotenv/config'
|
|
import express from 'express'
|
|
import { InteractionType, InteractionResponseType } from 'discord-interactions';
|
|
import { VerifyDiscordRequest, ComponentType } from './utils.js';
|
|
|
|
// Create and configure express app
|
|
const app = express();
|
|
app.use(express.json({verify: VerifyDiscordRequest(process.env.PUBLIC_KEY)}));
|
|
|
|
app.post('/interactions', function (req, res) {
|
|
// Interaction type and data
|
|
let { type, data } = req.body;
|
|
/**
|
|
* Handle slash command requests
|
|
*/
|
|
if (type === InteractionType.APPLICATION_COMMAND){
|
|
// Slash command with name of "test"
|
|
if (data.name === "test") {
|
|
// Send a message with a button
|
|
return res.send({
|
|
"type": InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
|
|
"data": {
|
|
"content": 'A message with a button',
|
|
// Selects are inside of action rows
|
|
"components": [{
|
|
"type": ComponentType.ACTION,
|
|
"components": [{
|
|
"type": ComponentType.SELECT,
|
|
// Value for your app to identify the select menu interactions
|
|
"custom_id": "my_select",
|
|
// Select options - see https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-option-structure
|
|
"options": [
|
|
{
|
|
"label": "Option #1",
|
|
"value": "option_1",
|
|
"description": "The very first option"
|
|
},
|
|
{
|
|
"label": "Second option",
|
|
"value": "option_2",
|
|
"description": "The second AND last option"
|
|
}
|
|
]
|
|
}]
|
|
}]
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle requests from interactive components
|
|
*/
|
|
if (type === InteractionType.MESSAGE_COMPONENT){
|
|
// custom_id set in payload when sending message component
|
|
let componentId = data.custom_id;
|
|
|
|
if (componentId === 'my_select') {
|
|
console.log(req.body);
|
|
|
|
// Get selected option from payload
|
|
let selectedOption = data.values[0];
|
|
let userId = req.body.member.user.id;
|
|
|
|
// Send results
|
|
return res.send({
|
|
"type": InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
|
|
"data": { "content": `<@${userId}> selected ${selectedOption}` }
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
app.listen(3000, () => {
|
|
console.log('Listening on port 3000');
|
|
}); |