Command that can roll a collection of dice, separated by spaces. Can handle multiple dice in a single roll, as well as roll boosts or penalties. For example, to roll 3 d6's and a d20 you can do "!roll 3d6 1d20".
/* Dice roll syntax: !roll [number of dice](d/D)[die to roll](+/-)[stat mod]
Examples:
!roll 1d20
!roll 5d10+5 3d6-2 1d20
*/
const lib = require('lib')({token: process.env.STDLIB_SECRET_TOKEN});
if (context.params.event.content.startsWith('!roll')) {
let rolls = context.params.event.content.split(' ').slice(1);
let rollSum = 0;
let rollResults = rolls.map((roll) => {
let [count, die, _] = roll.split(/[dD+-]{1}/);
let mod = roll.match(/([+-]{1})([0-9]{1,})/);
if (count && die) {
let rolls = [];
for (let i = 0; i < count; i++) {
rolls.push(1 + Math.floor(Math.random() * die))
}
let rollTotal = rolls.reduce((acc, _r) => acc + _r, 0) +
(mod ? parseInt(mod[2]) * (mod[1] === '-' ? -1 : 1) : 0);
rollSum += rollTotal;
return `${rollTotal} β (${rolls.join(', ')}${mod ? ', ' + mod[0] : ''})`;
} else {
return 'Bad roll!';
}
});
await lib.discord.channels['@0.1.1'].messages.create({
channel_id: `${context.params.event.channel_id}`,
content: `π² Rolled **${rollSum}**\`\`\`${rollResults.join('\n')}\`\`\``,
});
}