UNPKG

discord-tictactoe

Version:

A modern Discord Bot for playing Tic-Tac-Toe

108 lines (107 loc) 4.43 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const ComponentInteractionMessagingTunnel_1 = __importDefault(require("../messaging/ComponentInteractionMessagingTunnel")); const localize_1 = __importDefault(require("../../i18n/localize")); const discord_js_1 = require("discord.js"); class DuelRequest { constructor(manager, tunnel, invited, expireTime, useReactions, embedColor) { this.manager = manager; this.tunnel = tunnel; this.invited = invited; this.expireTime = expireTime ?? 60; this.useReactions = useReactions ?? false; this.embedColor = embedColor ?? 2719929; } get content() { const content = localize_1.default.__('duel.challenge', { initier: this.tunnel.author.displayName }) + '\n' + localize_1.default.__('duel.action'); return { allowedMentions: { parse: ['users'] }, components: this.useReactions ? [] : [ new discord_js_1.ActionRowBuilder().addComponents(new discord_js_1.ButtonBuilder({ style: discord_js_1.ButtonStyle.Success, customId: 'yes', label: localize_1.default.__('duel.button.accept') }), new discord_js_1.ButtonBuilder({ style: discord_js_1.ButtonStyle.Danger, customId: 'no', label: localize_1.default.__('duel.button.decline') })) ], content: this.invited.toString(), embeds: [ new discord_js_1.EmbedBuilder() .setTitle(localize_1.default.__('duel.title')) .setDescription(content) .setColor(this.embedColor) ] }; } async attachTo(message) { if (this.useReactions) { for (const reaction of DuelRequest.REACTIONS) { await message.react(reaction); } return message .awaitReactions({ filter: (reaction, user) => reaction.emoji.name != null && DuelRequest.REACTIONS.includes(reaction.emoji.name) && user.id === this.invited.id, max: 1, time: this.expireTime * 1000, errors: ['time'] }) .then(this.challengeEmojiAnswered.bind(this)) .catch(this.challengeExpired.bind(this)); } else { message .createMessageComponentCollector({ filter: interaction => interaction.user.id === this.invited.id, max: 1, time: this.expireTime * 1000 }) .on('collect', this.challengeButtonAnswered.bind(this)) .on('end', async (_, reason) => { if (reason !== 'limit') { return this.challengeExpired(); } }); } } async challengeButtonAnswered(interaction) { this.tunnel = new ComponentInteractionMessagingTunnel_1.default(interaction, this.tunnel.author); return interaction.customId === 'yes' ? this.challengeAccepted() : this.challengeRejected(); } async challengeEmojiAnswered(collected) { const accepted = collected.first().emoji.name === DuelRequest.REACTIONS[0]; return accepted ? this.challengeAccepted() : this.challengeRejected(); } async challengeAccepted() { return this.manager.createGame(this.tunnel, this.invited); } async challengeRejected() { return this.tunnel.end({ allowedMentions: { parse: [] }, components: [], content: localize_1.default.__('duel.reject', { invited: this.invited.displayName }), embeds: [] }); } async challengeExpired() { return this.tunnel.end({ allowedMentions: { parse: [] }, components: [], content: localize_1.default.__('duel.expire', { invited: this.invited.displayName }), embeds: [] }); } } DuelRequest.REACTIONS = ['👍', '👎']; exports.default = DuelRequest;