UNPKG

gamecord

Version:

Gamecord is a powerful npm package with a collection of minigames for your discord bot

86 lines (65 loc) 3.99 kB
const { EmbedBuilder, ActionRowBuilder } = require('discord.js'); const { formatMessage, ButtonBuilder } = require('./utils'); const events = require('events'); module.exports = class Approve extends events { constructor(options = {}) { if (!options.embed) options.embed = {}; if (!options.embed.requestTitle) options.embed.requestTitle = options.embed.title; if (!options.embed.requestColor) options.embed.requestColor = options.embed.color; if (!options.embed.rejectTitle) options.embed.rejectTitle = options.embed.title; if (!options.embed.rejectColor) options.embed.rejectColor = options.embed.color; if (!options.buttons) options.buttons = {}; if (!options.buttons.accept) options.buttons.accept = 'Aceitar'; if (!options.buttons.reject) options.buttons.reject = 'Rejeitar'; if (!options.reqTimeoutTime) options.reqTimeoutTime = 30000; if (typeof options.mentionUser === 'undefined') options.mentionUser = false; if (!options.requestMessage) options.requestMessage = '{player} convidou-o para uma ronda de jogo.'; if (!options.rejectMessage) options.rejectMessage = 'O jogador recusou o seu pedido de uma ronda de jogo.'; if (!options.reqTimeoutMessage) options.reqTimeoutMessage = 'Abandonei o jogo porque o jogador não respondeu.'; super(); this.options = options; this.message = options.message; this.opponent = options.opponent; } async sendMessage(content) { if (this.options.isSlashGame) return await this.message.editReply(content).catch(e => {}); else return await this.message.channel.send(content).catch(e => {}); } async approve() { return new Promise(async resolve => { const embed = new EmbedBuilder() .setColor(this.options.embed.requestColor) .setTitle(this.options.embed.requestTitle) .setDescription(formatMessage(this.options, 'requestMessage')); const btn1 = new ButtonBuilder().setLabel(this.options.buttons.accept).setCustomId('approve_accept').setStyle('SUCCESS'); const btn2 = new ButtonBuilder().setLabel(this.options.buttons.reject).setCustomId('approve_reject').setStyle('DANGER'); const row = new ActionRowBuilder().addComponents(btn1, btn2); const content = this.options.mentionUser ? '<@!'+this.opponent.id+'>' : null; const msg = await this.sendMessage({ content, embeds: [embed], components: [row], allowedMentions: { parse: ['users'] } }); const collector = msg.createMessageComponentCollector({ time: this.options.reqTimeoutTime }); collector.on('collect', async btn => { await btn.deferUpdate().catch(e => {}); if (btn.user.id === this.opponent.id) collector.stop(btn.customId.split('_')[1]); }) collector.on('end', async (_, reason) => { if (reason === 'accept') return resolve(msg); const embed = new EmbedBuilder() .setColor(this.options.embed.rejectColor) .setTitle(this.options.embed.rejectTitle) .setDescription(formatMessage(this.options, 'rejectMessage')) if (reason === 'time') embed.setDescription(formatMessage(this.options, 'reqTimeoutMessage')); this.emit('gameOver', { result: reason, player: this.message.author, opponent: this.opponent }); await msg.edit({ content: null, embeds: [embed], components: [] }); return resolve(false); }) }) } formatTurnMessage(options, contentMsg) { const { message, opponent } = options; let player1 = (!this.player1Turn) ? opponent : message.author; let content = options[contentMsg]; content = content.replace('{player.tag}', player1.tag).replace('{player.username}', player1.username).replace('{player}', `<@!${player1.id}>`); content = content.replace('{opponent.tag}', opponent.tag).replace('{opponent.username}', opponent.username).replace('{opponent}', `<@!${opponent.id}>`); return content; } }