So I'm coding this discord bot using discord.js v13 right and it was all going fine until for some reason I started to get this runtime error concerning my embed's description.
What happens is that 3 buttons work, except for the last one (the one that's supposed to go to the very last page).
Here is my code:
import {
Interaction,
Message,
MessageActionRow,
MessageButton,
MessageEmbed,
} from 'discord.js'
import { ICommand } from 'wokcommands'
export default {
category: 'Testing',
description: 'Creates an embed pagination',
slash: 'both',
testOnly: true,
callback: async ({ user, message, interaction, channel }) => {
const embeds: MessageEmbed[] = []
const pages = {} as { [key: string]: number }
for (let i = 0; i < 4; ++i) {
embeds.push(new MessageEmbed()
.setDescription(`Testing page ${i + 1}`))
}
const getRow = (id: string) => {
const row = new MessageActionRow()
row.addComponents(
new MessageButton()
.setCustomId('first_embed')
.setStyle('SECONDARY')
.setEmoji('⏮')
.setDisabled(pages[id] === 0)
)
row.addComponents(
new MessageButton()
.setCustomId('prev_embed')
.setStyle('SECONDARY')
.setEmoji('⏪')
.setDisabled(pages[id] === 0)
)
row.addComponents(
new MessageButton()
.setCustomId('next_embed')
.setStyle('SECONDARY')
.setEmoji('⏩')
.setDisabled(pages[id] === embeds.length - 1)
)
row.addComponents(
new MessageButton()
.setCustomId('last_embed')
.setStyle('SECONDARY')
.setEmoji('⏭')
.setDisabled(pages[id] === embeds.length - 1)
)
return row
}
const id = user.id
pages[id] = pages[id] || 0
const embed = embeds[pages[id]]
let reply: Message | undefined
let collector
const filter = (i: Interaction) => i.user.id === user.id
const time = 1000 * 60 * 5
if (message) {
reply = await message.reply({
embeds: [embed],
components: [getRow(id)],
})
collector = reply.createMessageComponentCollector({ filter, time })
} else {
interaction.reply({
ephemeral: true,
embeds: [embed],
components: [getRow(id)],
})
collector = channel.createMessageComponentCollector({ filter, time })
}
collector.on('collect', (btnInt) => {
if (!btnInt) {
return
}
btnInt.deferUpdate()
if (btnInt.customId !== 'prev_embed' && btnInt.customId !== 'next_embed' && btnInt.customId !== 'first_embed' && btnInt.customId !== 'last_embed') {
return
}
console.log(embeds.length - 1)
console.log(embeds.length)
console.log(pages[id])
if (btnInt.customId === 'prev_embed' && pages[id] > 0) {
--pages[id]
} else if (btnInt.customId === 'next_embed' && pages[id] < embeds.length - 1) {
++pages[id]
} else if (btnInt.customId === 'first_embed' && pages[id] > 0) {
pages[id] = 0
} else if (btnInt.customId === 'last_embed' && pages[id] < embeds.length - 1) {
pages[id] = embeds.length
}
if (reply) {
reply.edit({
embeds: [embeds[pages[id]]],
components: [getRow(id)]
})
} else {
interaction.editReply({
embeds: [embeds[pages[id]]],
components: [getRow(id)]
})
}
})
}
} as ICommand
Error: DiscordAPIError: Invalid Form Body embeds[0].description: This field is required
The bot breaks as soon as I click the "last" button...
// ...
} else if (btnInt.customId === 'last_embed' && pages[id] < embeds.length - 1) {
pages[id] = embeds.length
}
// ...
This code appears to be setting the page to embeds.length
. You probably want to set the page to embeds.length - 1
, since arrays are zero-indexed.