Задать вопрос
@koldan_off

Как решить ошибку discrod.js с кнопками — Interaction has already been acknowledged?

Пишу дискорд бота.
Структура кода как в доках (в каждом файле отдельная команда - https://github.com/discordjs/guide/tree/main/code-...)
Так вот, имеем следующее:
Файл команды (dungeon.js):
let newDungeon = functions.dungeonGen("right")
        newDungeon[1].push("left")
        await interaction.reply({
            content: `Вы запустили мини-игру: "Подземелье"`,
            components: [functions.dungeonButtons(newDungeon[1])],
            embeds: [functions.dungeonEmbed(newDungeon[0])]
        });


Файл index.js:
const filter = i => i.user.id === interaction.user.id

	const collector = interaction.channel.createMessageComponentCollector({ filter, time: 60000 })

	collector.on('collect', async i => {
	const ButtonId = i.customId.split(";")
	if (ButtonId[0] === `up` || ButtonId[0] === `left` || ButtonId[0] === `right` || ButtonId[0] === `down`) {
		const newDungeon = functions.dungeonGen(ButtonId[0])
		let text = newDungeon[1].includes("treasure") ? `Пойдя ${ButtonId[1]}, вы нашли сокровища в комнате! :moneybag:` : `Вы пошли ${ButtonId[1]}... В комнате пусто.`
		console.log(i)
		await i.update({
			content: text,
			components: [functions.dungeonButtons(newDungeon[1])],
			embeds: [functions.dungeonEmbed(newDungeon[0])]});
	}
	if(ButtonId[0] === `exit`) {
		await i.update({
			content: "Приключения закончились..",
			embeds: []
		})
		await i.deleteReply();
		collector.stop();
	}


Если написать любые другие команды, а после уже эту команду dungeon, то при нажатии на кнопку бот умирает, выдавая ошибку:
C:\Users\ADMIN\Desktop\bot\node_modules\discord.js\src\rest\RequestHandler.js:350
      throw new DiscordAPIError(data, res.status, request);
            ^

DiscordAPIError: Interaction has already been acknowledged.
    at RequestHandler.execute (C:\Users\ADMIN\Desktop\bot\node_modules\discord.js\src\rest\RequestHandler.js:350:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async RequestHandler.push (C:\Users\ADMIN\Desktop\bot\node_modules\discord.js\src\rest\RequestHandler.js:51:14)
    at async ButtonInteraction.update (C:\Users\ADMIN\Desktop\bot\node_modules\discord.js\src\structures\interfaces\InteractionResponses.js:214:5)
    at async InteractionCollector.<anonymous> (C:\Users\ADMIN\Desktop\bot\index.js:44:3) {


44 строчка index.js:
await i.update
  • Вопрос задан
  • 754 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@koldan_off Автор вопроса
Нашёл ошибку.
Кому надо, то:
Данный коллектор я просто впихнул в функцию client.on с параметром 'interactionCreate'. Без каких-либо проверок или ещё что-то, что в итоге привело к тому, что коллектор из раза в раз запускался. Фикс простой -
const { commandName } = interaction;
	if(commandName == "dungeon") {
       //Код коллектора тут
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы