'use strict'; const config = require('config'); const crypto = require('crypto'); const timers = require('timers/promises'); const riddles = require('../../assets/riddles.json'); const style = require('../utils/style'); const settings = { ...config.riddle }; const open = new Map(); const emojis = ['😆', 'ðŸĪĢ', '😂', '😅', 'ðŸĪŠ', '😛', '😝', '🙃', 'ðŸĨē', 'ðŸĪ­', '😏', 'ðŸĨī', '💀', 'ðŸĪĶ']; function setTimeout(timeout, context) { if (!timeout) { context.sendMessage(`Timeout is set to ${style.bold(settings.timeout)}`, context.room.id); return; } const parsedTimeout = Number(timeout); if (Number.isNaN(parsedTimeout) || parsedTimeout < 10 || parsedTimeout > 300) { context.sendMessage('Timeout must be a number between 10 and 300', context.room.id); return; } settings.timeout = parsedTimeout; context.sendMessage(`Timeout set to ${style.bold(settings.timeout)} by ${context.user.prefixedUsername}`, context.room.id); } async function onCommand(args, context) { if (context.subcommand === 'timeout') { setTimeout(args[0], context); return; } if (open.has(context.room.id)) { context.sendMessage(open.get(context.room.id).riddle, context.room.id); return; } const riddle = riddles[crypto.randomInt(0, riddles.length)]; const ac = new AbortController(); // eslint-disable-line no-undef open.set(context.room.id, { ...riddle, ac }); context.sendMessage(riddle.riddle, context.room.id); context.logger.info(`Riddle asked "${riddle.riddle}" with answer: ${riddle.answers[0]}`); try { await timers.setTimeout(settings.timeout * 1000, null, { signal: ac.signal }); open.delete(context.room.id); context.sendMessage(`No one guessed the riddle: ${style.bold(riddle.fullAnswer)}! ${emojis[crypto.randomInt(0, emojis.length)]}`, context.room.id); } catch (error) { // timer aborted because someone guessed the answer } } function onMessage(message, context) { const riddle = open.get(context.room?.id); if (riddle && riddle.answers.some((answer) => new RegExp(`\\b${answer}s?\\b`, 'i').test(message.body))) { riddle.ac.abort(); open.delete(context.room.id); if (config.riddle.score) { context.setPoints(context.user, 1); context.sendMessage(`${style.bold(style.yellow(riddle.fullAnswer))} is the right answer! ${context.user.prefixedUsername} gets a point.`, context.room.id); return; } context.sendMessage(`${style.bold(riddle.fullAnswer)} is the right answer!`, context.room.id); } } module.exports = { help: `Solve the riddle before time runs out! Ask for one with ${config.prefix}riddle, and answer by typing it in the chat. Change the time limit with ${config.prefix}riddle:timeout [10-300].`, onCommand, onMessage, };