55 lines
1.8 KiB
JavaScript
55 lines
1.8 KiB
JavaScript
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
|
|
|
|
const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
|
|
const rollDice = (count, sides) => {
|
|
const rolls = [];
|
|
for (let i = 0; i < count; i += 1) {
|
|
rolls.push(1 + Math.floor(Math.random() * sides));
|
|
}
|
|
return rolls;
|
|
};
|
|
|
|
module.exports = {
|
|
data: new SlashCommandBuilder()
|
|
.setName('roll')
|
|
.setDescription('Roll one or more dice with a custom number of sides.')
|
|
.addIntegerOption((option) =>
|
|
option
|
|
.setName('sides')
|
|
.setDescription('Number of sides on each die (2-100).')
|
|
.setMinValue(2)
|
|
.setMaxValue(100)
|
|
)
|
|
.addIntegerOption((option) =>
|
|
option
|
|
.setName('count')
|
|
.setDescription('How many dice to roll (1-6).')
|
|
.setMinValue(1)
|
|
.setMaxValue(6)
|
|
),
|
|
category: 'Utility',
|
|
async execute(interaction) {
|
|
const sidesInput = interaction.options.getInteger('sides') ?? 6;
|
|
const countInput = interaction.options.getInteger('count') ?? 1;
|
|
|
|
const sides = clamp(sidesInput, 2, 100);
|
|
const count = clamp(countInput, 1, 6);
|
|
const rolls = rollDice(count, sides);
|
|
const total = rolls.reduce((sum, roll) => sum + roll, 0);
|
|
|
|
const embed = new EmbedBuilder()
|
|
.setColor(0x20bf6b)
|
|
.setTitle('Dice Roll')
|
|
.addFields(
|
|
{ name: 'Sides', value: `${sides}`, inline: true },
|
|
{ name: 'Dice', value: `${count}`, inline: true },
|
|
{ name: 'Total', value: `${total}`, inline: true },
|
|
{ name: 'Rolls', value: rolls.join(', ') }
|
|
)
|
|
.setTimestamp();
|
|
|
|
await interaction.reply({ embeds: [embed] });
|
|
},
|
|
};
|