McFree
@McFree
JS, TS, C#

Повторное изменение Embed'a выдает ошибку The reply to this interaction has already been sent or deferred. Как исправить?

Есть функция в которую поступает массив условных объектов IMuteModel.
Из этого массива хочу сделать вывод списка с пагинацией и использую для работы с пагинацией рекурсивную функцию:

protected async renderResponceMessage(mutes: IMuteModel[], interaction: CommandInteraction) {
        let startList: number = (this.page * this.pageLimit) - this.pageLimit;
        let endList: number = this.page * this.pageLimit;
        const isLastPage: boolean = startList < mutes.length && endList >= mutes.length;
        const isFirstPage: boolean = this.page === 1;
        const lastPage: number = mutes.length % this.pageLimit > 0 ?  Math.floor(mutes.length / this.pageLimit) + 1 :  mutes.length / this.pageLimit;

        let context: string = "";
        for(let i: number = startList; i < endList; i++) {
            const mute: IMuteModel = mutes[i];
            if(!mute) break;

            const place: string = mute.place === MutePlacesEN.all ? MutePlacesRU.all : (
                mute.place === MutePlacesEN.current ? MutePlacesRU.current : `<#${mute.place}>`
            );
            const time: number = Math.floor((mute.time + mute.date) / 1000);
            const timeText: string = mute.time === 0 ? "Постоянно" : `<t:${time}>`;
            context += `\n\n` +
                `\`#${i+1}\` **Участник:** <@${mute.userId}> (ID: \`${mute.userId}\`) ` +
                `\n**Выдан:** <@${mute.author}>` +
                `\n**Канал:** ${place}` +
                `\n**Причина:** ${mute.reason}` +
                `\n**Действует до:** ${timeText}`;
        }

        const buttons: ActionRowBuilder<ButtonBuilder> = new ActionRowBuilder<ButtonBuilder>();
        buttons.addComponents(
            new ButtonBuilder()
                .setStyle(ButtonStyle.Secondary)
                .setCustomId(ListActions.first)
                .setDisabled(isFirstPage)
                .setLabel('⏪'),
            new ButtonBuilder()
                .setStyle(ButtonStyle.Secondary)
                .setCustomId(ListActions.preview)
                .setDisabled(isFirstPage)
                .setLabel('◀️'),
            new ButtonBuilder()
                .setStyle(ButtonStyle.Secondary)
                .setCustomId(ListActions.next)
                .setDisabled(isLastPage)
                .setLabel('▶️'),
            new ButtonBuilder()
                .setStyle(ButtonStyle.Secondary)
                .setCustomId(ListActions.last)
                .setDisabled(isLastPage)
                .setLabel('⏩'),
            new ButtonBuilder()
                .setStyle(ButtonStyle.Danger)
                .setCustomId(ListActions.close)
                .setLabel('❌')
        );

        const embed: EmbedBuilder = new EmbedBuilder()
            .setDescription(`**Страница ${this.page} из ${lastPage} - Всего мьютов: ${mutes.length}` +
                `\nСписок активных мьютов**` +
                (context == "" ? "\n\n**Отсутствуют**" : context))
            .setColor("#ff68a0")

        if (!this.rendered) {
            this.rendered = true;
            this.response = await interaction.reply({
                embeds: [embed],
                components: [buttons],
            });
        } else {
            this.response = await interaction.editReply({
                embeds: [embed],
                components: [buttons],
            });
        }

        try {
            const confirmation = await this.response.awaitMessageComponent({ filter: this.collectorFilter, time: 60_000});

            switch (confirmation.customId) {
                case ListActions.first: {
                    this.page = 1;
                    await this.renderResponceMessage(mutes, interaction);
                    break;
                }
                case ListActions.preview: {
                    this.page -= 1;
                    await this.renderResponceMessage(mutes, interaction);
                    break;
                }
                case ListActions.next: {
                    this.page += 1;
                    await this.renderResponceMessage(mutes, interaction);
                    break;
                }
                case ListActions.last: {
                    this.page = lastPage;
                    await this.renderResponceMessage(mutes, interaction);
                    break;
                }
                case ListActions.close: {
                    await interaction.deleteReply();
                    break;
                }
            }
        } catch (e) {
            console.log(e);
            const embed: EmbedBuilder = new EmbedBuilder()
                .setDescription(`Время на просмотр списка истекло`)
                .setColor("#ff68a0")
            await interaction.reply({
                embeds: [embed],
                components: [],
            });
        }
    }


После нажатия на одну из четырех кнопок я получаю ошибку The reply to this interaction has already been sent or deferred. однако первое изменение текста в Embed проходит после нажатия на кнопку.

Мне нужно сделать спокойное хождение по списку этого массива через данные кнопки. Как я могу сохранить возможность изменять сообщение и прослушивать все нажатия на кнопки у данного сообщения без ограничений количества изменения до окончания времени (1 минута)?
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
McFree
@McFree Автор вопроса
JS, TS, C#
Нашел как это сделать и воспользовался исходником отсюда https://github.com/JavascriptSimp/discordjs-v14-pa...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы