From 812d01edbd929c4d6140ed54a49cd493e9ab2b06 Mon Sep 17 00:00:00 2001 From: Max Isom Date: Thu, 16 Dec 2021 15:18:50 -0500 Subject: [PATCH] Handle if queue reply is deleted --- src/bot.ts | 13 ++++--- src/services/updating-queue-embed.ts | 55 ++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/bot.ts b/src/bot.ts index 6152d2f..b9c31a7 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -70,11 +70,14 @@ export default class { } catch (error: unknown) { debug(error); - if (interaction.replied || interaction.deferred) { - await interaction.editReply(errorMsg('something went wrong')); - } else { - await interaction.reply({content: errorMsg(error as Error), ephemeral: true}); - } + // This can fail if the message was deleted, and we don't want to crash the whole bot + try { + if (interaction.replied || interaction.deferred) { + await interaction.editReply(errorMsg('something went wrong')); + } else { + await interaction.reply({content: errorMsg(error as Error), ephemeral: true}); + } + } catch {} } }); diff --git a/src/services/updating-queue-embed.ts b/src/services/updating-queue-embed.ts index 31d58ff..6496fb5 100644 --- a/src/services/updating-queue-embed.ts +++ b/src/services/updating-queue-embed.ts @@ -1,4 +1,4 @@ -import {CommandInteraction, MessageActionRow, MessageButton, MessageEmbed} from 'discord.js'; +import {CommandInteraction, MessageActionRow, MessageButton, MessageEmbed, DiscordAPIError} from 'discord.js'; import getYouTubeID from 'get-youtube-id'; import getProgressBar from '../utils/get-progress-bar.js'; import {prettyTime} from '../utils/time.js'; @@ -40,13 +40,23 @@ export default class { * @param interaction */ async createFromInteraction(interaction: CommandInteraction) { - this.interaction = interaction; - this.currentPage = 1; + const oldInteraction = this.interaction; - await interaction.reply({ - embeds: [this.buildEmbed()], - components: this.buildButtons(this.player), - }); + this.resetState(); + + this.interaction = interaction; + + await Promise.all([ + interaction.reply({ + embeds: [this.buildEmbed()], + components: this.buildButtons(this.player), + }), + (async () => { + if (oldInteraction) { + await oldInteraction.deleteReply(); + } + })(), + ]); if (!this.refreshTimeout) { this.refreshTimeout = setInterval(async () => this.update(), REFRESH_INTERVAL_MS); @@ -58,10 +68,23 @@ export default class { this.currentPage = 1; } - await this.interaction?.editReply({ - embeds: [this.buildEmbed()], - components: this.buildButtons(this.player), - }); + try { + await this.interaction?.editReply({ + embeds: [this.buildEmbed()], + components: this.buildButtons(this.player), + }); + } catch (error: unknown) { + if (error instanceof DiscordAPIError) { + // Interaction / message was deleted + if (error.code === 10008) { + this.resetState(); + + return; + } + } + + throw error; + } } async pageBack() { @@ -80,6 +103,16 @@ export default class { await this.update(); } + private resetState() { + if (this.refreshTimeout) { + clearInterval(this.refreshTimeout); + this.refreshTimeout = undefined; + } + + this.currentPage = 1; + this.interaction = undefined; + } + private buildButtons(player: Player): MessageActionRow[] { const queuePageControls = new MessageActionRow() .addComponents(