UNPKG

discord-mini-games-es.js

Version:

Un paquete para implementar minijuegos usando discord.js-v14 en español

121 lines (120 loc) 6.58 kB
const discord = require('discord.js'); const words_list = require('./assets/odd_words.json') const {EmbedBuilder,ButtonBuilder,ButtonStyle,ActionRowBuilder,ComponentType} = require('discord.js') class OddOneOut{ /** * Initialises a new instance of OddOneOut Game. * @param {`Message/Interaction`} message The Message Object. * @param {`GameOptions-Object`} gameOptions The game Options Object. * @returns {OddOneOut} Game instance. */ constructor(message,gameOptions) { if(!message) throw new Error("no se proporciona el mensaje."); this.message = message; if(gameOptions && typeof gameOptions !== 'object') throw new TypeError("gameOptions debe ser un objeto."); this.isSlash = gameOptions?.isSlash ?? false; if(this.isSlash == true){ if(!(this.message instanceof discord.CommandInteraction)){ throw new TypeError("El mensaje debe ser una instancia de Interacción de Comando.") } } else { if(!(this.message instanceof discord.Message)) { throw new TypeError("El mensaje debe ser una instancia de Mensaje de Discord.") } } this.time = gameOptions?.time ?? 30000; this.replied = false; this.randomN = (min,max) => {return Math.floor(Math.random()*max)+min;} this.edit = async (messageOptions,replyMessage) => { messageOptions.fetchReply = true; if(this.replied == false) { this.replied=true; if(this.isSlash == true) return await replyMessage.editReply(messageOptions) return await this.message.reply(messageOptions);} else return await replyMessage.edit(messageOptions) } this.options = gameOptions; this.onWin = gameOptions?.onWin ?? null; this.onTie = gameOptions?.onTie ?? null; this.onTimeUp = gameOptions?.onTimeUp ?? null; this.board = []; if(this.opponent && this.player.id == this.opponent.id) throw new Error('El jugador y el oponente no pueden ser el mismo.'); if(this.onWin && typeof this.onWin !== 'function') throw new TypeError('onWin debe ser una función.'); if(this.options?.emoji1 && typeof this.options?.emoji1 !== 'string') throw new TypeError('emoji1 Debe ser un String.'); if(this.options?.emoji2 && typeof this.options?.emoji2 !== 'string') throw new TypeError('emoji2 Debe ser un String.'); if(this.options?.emptyEmoji && typeof this.options?.emptyEmoji !== 'string') throw new TypeError('emptyEmoji Debe ser un String.'); if(this.onTie && typeof this.onTie !== 'function') throw new TypeError('onTie Debe de ser una función.'); if(this.onTimeUp && typeof this.onTimeUp!== 'function') throw new TypeError('onTimeUp Debe de ser una función.'); if(typeof this.isSlash !== 'boolean') throw new TypeError('isSlash Debe ser un valor Bolean.'); if(typeof this.time !== 'number') throw new TypeError('time debe de ser un número.'); if(this.options?.resTime && typeof this.options?.resTime !== 'number') throw new TypeError('resTime debe de ser un número'); if(this.time < 5000) throw new RangeError('time Debe ser mayor que 5000'); if(this.options?.title && typeof this.options?.title !== 'string') throw new TypeError('title debe de ser un String.'); if(this.options?.winDes && typeof this.options?.winDes !== 'string') throw new TypeError('winDes debe de ser un String.'); if(this.options?.tieDes && typeof this.options?.tieDes !== 'string') throw new TypeError('tieDes debe de ser un String.'); if(this.options?.nextDes && typeof this.options?.nextDes !== 'string') throw new TypeError('nextDes debe de ser un String.'); if(this.options?.timeUpDes && typeof this.options?.timeUpDes !== 'string') throw new TypeError('timeUpDes debe de ser un String.'); if(this.options?.confirmDes && typeof this.options?.confirmDes !== 'string') throw new TypeError('confirmDes debe de ser un String.'); if(this.options?.declineDes && typeof this.options?.declineDes !== 'string') throw new TypeError('declineDes debe de ser un String.'); if(this.options?.noResDes && typeof this.options?.noResDes !== 'string') throw new TypeError('noResDes debe de ser un String.'); } /** * Starts The Game. */ async run() { if(this.isSlash == true) { await this.message.deferReply().catch(() => {}); } const game = this; function oooEm(text,color) { const embed = new EmbedBuilder() .setTitle(game.options?.title ?? 'Odd One Out') .setDescription(text) .setColor(color) .setThumbnail(game.player.avatarURL()) .setTimestamp() .setFooter({text:`Pedido por ${game.player.username}`}) return embed; } function shuffleArray(lol) { let New = new Array().concat(lol) for (let i = New.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [New[i], New[j]] = [New[j], New[i]]; } return New; } const answer = this.words_data.correct; this.words_data.others[4] = answer; const choices = shuffleArray(this.words_data.others) var Row = new ActionRowBuilder() for (var i=0; i<5;i++) { Row.addComponents(new ButtonBuilder().setCustomId('ooo_' + choices[i]).setStyle(ButtonStyle.Secondary).setLabel(choices[i])) } const msg = await this.edit({embeds:[oooEm(this.options?.startDes?? 'Encuentra la palabra rara','Green')],components:[Row]},this.message) const collector = msg.createMessageComponentCollector({ componentType: ComponentType.Button, idle:this.time}) let played = false; collector.on('collect', async (i) => { await i.deferUpdate(); if(i.user.id == this.player.id) { played = true; collector.stop() Row.components.find(x => x.data.custom_id == i.customId).setDisabled(true) if(i.customId.replace('ooo_','') == answer) { await this.edit({embeds:[oooEm(this.options?.winDes?.replace(/{answer}/g,answer)?.replace(/{user_option}/g,i.customId.replace('ooo_','')) ?? `¡Ganaste!, era ${answer}`,`Yellow`)],components:[Row]},msg) if(this.onWin) await this.onWin(); } else { await this.edit({embeds:[oooEm(this.options?.loseDes?.replace(/{answer}/g,answer)?.replace(/{user_option}/g,i.customId.replace('ooo_','')) ?? `¡Perdiste!, era ${answer}`,`Red`)],components:[Row]},msg) if(this.onLose) await this.onLose(); } } }) collector.on('end', async () => { if(played == false) { Row.components.forEach(x => x.setDisabled(true)) await this.edit({embeds:[oooEm(this.options?.timeUpDes?.replace(/{answer}/g,answer) ?? `Juego terminado: Se acabó el tiempo, era ` + answer,'Red')],components:[Row]},msg); } }) } } module.exports = OddOneOut;