Handle if queue reply is deleted

This commit is contained in:
Max Isom 2021-12-16 15:18:50 -05:00
parent 09908f4af5
commit 812d01edbd
No known key found for this signature in database
GPG key ID: 25C9B1A7F6798880
2 changed files with 52 additions and 16 deletions

View file

@ -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 {}
}
});

View file

@ -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(