schat2-clive/src/games/dice.js

46 lines
1.3 KiB
JavaScript
Executable File

'use strict';
const config = require('config');
const crypto = require('crypto');
const style = require('../utils/style');
const dieFaces = ['⚀', '⚁', '⚂', '⚃', '⚄', '⚅'];
function onCommand(args, context) {
const pattern = args[0]?.match(/(\d+)?d(\d+)?/i);
if (pattern) {
onCommand(pattern.slice(1), context);
return;
}
const rolls = Math.max(Number(args[0]) || 1, 1);
const faces = Math.max(Number(args[1]) || 6, 1);
if (rolls > config.dice.maxRolls) {
context.sendMessage(`You can only roll ${config.dice.maxRolls} dice at one time`, context.room.id);
return;
}
if (faces > config.dice.maxFaces) {
context.sendMessage(`Your dice can have at most ${config.dice.maxFaces} faces`, context.room.id);
return;
}
const results = Array.from({ length: rolls }, () => {
const result = crypto.randomInt(1, faces);
// using U+2003 Em Space after dice to create double space that doesn't get filtered in SChat
return `${style.grey(dieFaces[result - 1] || '☐')} ${style.bold(result)}`; // eslint-disable-line no-irregular-whitespace
});
context.sendMessage(results.join(style.grey(' | ')), context.room.id);
}
module.exports = {
onCommand,
commands: ['dice', 'die', 'roll'],
help: 'What\'s your next move? Try ~dice [rolls] [faces], ~die or ~roll',
};