Ошибка после выбора участника в селект меню discord.js

У меня есть код команды, чтобы управлять комнатой. Есть кнопка управление доступом, и при нажатии на неё выходит селект меню участников. После выбора участников участника у которого он хочет изменить доступ, если у него нету роли комнаты то её должно выдавать, а если нет забирать. Но после выбора участника в селект меню просто ошибка взаимодействия но ошибки в терминале нету. Помогите пожалуйста, как можно пофиксить?

const {
    SlashCommandBuilder,
    ActionRowBuilder,
    ButtonBuilder,
    StringSelectMenuBuilder,
    EmbedBuilder,
    ButtonStyle,
    ModalBuilder,
    TextInputBuilder,
    TextInputStyle,
    PermissionFlagsBits
} = require('discord.js');
const sqlite3 = require('sqlite3').verbose();

const db = new sqlite3.Database('database.db');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('управление-комнатой')
        .setDescription('Управление вашими комнатами.')
        .setDefaultMemberPermissions(PermissionFlagsBits.Administrator),

    async run(client, interaction) {
        const userId = interaction.user.id;

        // Получение списка комнат пользователя
        db.all('SELECT * FROM voice_rooms WHERE owner_id = ?', [userId], async (err, rooms) => {
            if (err) {
                console.error(err);
                return interaction.reply({ content: 'Произошла ошибка при получении комнат.', ephemeral: true });
            }

            if (rooms.length === 0) {
                return interaction.reply({ content: 'У вас нет созданных комнат.', ephemeral: true });
            }

            // Селект меню для выбора комнаты
            const options = rooms.map(room => ({
                label: `Комната ${room.room_id}`,
                description: `ID: ${room.room_id}`,
                value: room.room_id
            }));

            // Проверяем, что опций не больше 25
            if (options.length > 25) {
                options.length = 25; // Обрезаем до 25 опций, если их больше
            }

            const selectMenu = new StringSelectMenuBuilder()
                .setCustomId('select-room')
                .setPlaceholder('Выберите комнату')
                .addOptions(options);

            const row = new ActionRowBuilder().addComponents(selectMenu);

            const embed = new EmbedBuilder()
                .setColor(0x0099ff)
                .setTitle('Управление комнатой')
                .setDescription('Выберите комнату для управления.');

            await interaction.reply({ embeds: [embed], components: [row], ephemeral: true });

            // Обработка выбора комнаты
            const filter = i => i.customId === 'select-room' && i.user.id === userId;
            const collector = interaction.channel.createMessageComponentCollector({ filter, time: 60000 });

            collector.on('collect', async i => {
                const selectedRoom = rooms.find(room => room.room_id === i.values[0]);

                if (!selectedRoom) {
                    return i.reply({ content: 'Комната не найдена.', ephemeral: true });
                }

                // Информация о выбранной комнате
                const roomEmbed = new EmbedBuilder()
                    .setColor(0x0099ff)
                    .setTitle(`Управление комнатой ${selectedRoom.room_id}`)
                    .setDescription('Выберите действие для управления комнатой.');

                const actionRow = new ActionRowBuilder()
                    .addComponents(
                        new ButtonBuilder()
                            .setCustomId('change-name')
                            .setLabel('Изменить название')
                            .setStyle(ButtonStyle.Primary),
                        new ButtonBuilder()
                            .setCustomId('change-color')
                            .setLabel('Изменить цвет')
                            .setStyle(ButtonStyle.Primary),
                        new ButtonBuilder()
                            .setCustomId('manage-access')
                            .setLabel('Ограничить/выдать доступ')
                            .setStyle(ButtonStyle.Secondary),
                        new ButtonBuilder()
                            .setCustomId('kick-member')
                            .setLabel('Выгнать из комнаты')
                            .setStyle(ButtonStyle.Danger)
                    );

                const actionRowWithSelectMenu = new ActionRowBuilder()
                    .addComponents(
                        new StringSelectMenuBuilder()
                            .setCustomId('manage-access-user-select')
                            .setPlaceholder('Выберите участника для управления доступом')
                            .setMinValues(1)
                            .setMaxValues(1)
                            .addOptions(options) // Убедитесь, что добавляемые опции корректны
                    );

                await i.update({
                    embeds: [roomEmbed],
                    components: [actionRow, actionRowWithSelectMenu]
                });

                // Обработка нажатия на кнопки
                const buttonFilter = btn => ['change-name', 'change-color', 'manage-access', 'kick-member'].includes(btn.customId) && btn.user.id === userId;
                const buttonCollector = interaction.channel.createMessageComponentCollector({ buttonFilter, time: 60000 });

                buttonCollector.on('collect', async buttonInteraction => {
                    switch (buttonInteraction.customId) {
                        case 'change-name':
                            const nameModal = new ModalBuilder()
                                .setCustomId('change-name-modal')
                                .setTitle('Изменить название комнаты');

                            const nameInput = new TextInputBuilder()
                                .setCustomId('new-name')
                                .setLabel('Новое название комнаты')
                                .setStyle(TextInputStyle.Short);

                            const nameActionRow = new ActionRowBuilder().addComponents(nameInput);
                            nameModal.addComponents(nameActionRow);

                            await buttonInteraction.showModal(nameModal);

                            client.once('interactionCreate', async modalInteraction => {
                                if (modalInteraction.customId === 'change-name-modal') {
                                    const newName = modalInteraction.fields.getTextInputValue('new-name');

                                    const roomChannel = await interaction.guild.channels.fetch(selectedRoom.room_id);
                                    const roomRole = await interaction.guild.roles.fetch(selectedRoom.role_id);

                                    await roomChannel.setName(newName);
                                    await roomRole.setName(newName);

                                    await modalInteraction.reply({ content: `Название комнаты изменено на ${newName}`, ephemeral: true });
                                }
                            });
                            break;

                        case 'change-color':
                            const colorModal = new ModalBuilder()
                                .setCustomId('change-color-modal')
                                .setTitle('Изменить цвет роли комнаты');

                            const colorInput = new TextInputBuilder()
                                .setCustomId('new-color')
                                .setLabel('Новый цвет (HEX)')
                                .setStyle(TextInputStyle.Short);

                            const colorActionRow = new ActionRowBuilder().addComponents(colorInput);
                            colorModal.addComponents(colorActionRow);

                            await buttonInteraction.showModal(colorModal);

                            client.once('interactionCreate', async modalInteraction => {
                                if (modalInteraction.customId === 'change-color-modal') {
                                    const newColor = modalInteraction.fields.getTextInputValue('new-color');
                                    const hexColorPattern = /^#[0-9A-Fa-f]{6}$/;

                                    if (!hexColorPattern.test(newColor)) {
                                        return modalInteraction.reply({ content: 'Пожалуйста, укажите корректный цвет в формате HEX.', ephemeral: true });
                                    }

                                    const roomRole = await interaction.guild.roles.fetch(selectedRoom.role_id);
                                    await roomRole.setColor(newColor);

                                    await modalInteraction.reply({ content: `Цвет роли изменен на ${newColor}`, ephemeral: true });
                                }
                            });
                            break;

                        case 'manage-access':
                            const userSelectMenu = new StringSelectMenuBuilder()
                                .setCustomId('manage-access-user-select')
                                .setPlaceholder('Выберите участника для управления доступом')
                                .setMinValues(1)
                                .setMaxValues(1)
                                .addOptions(options);

                            const accessRow = new ActionRowBuilder().addComponents(userSelectMenu);
                            await buttonInteraction.update({ content: 'Выберите участника для управления доступом.', components: [accessRow], ephemeral: true });

                            const userSelectFilter = i => i.customId === 'manage-access-user-select' && i.user.id === buttonInteraction.user.id;
                            const userSelectCollector = buttonInteraction.channel.createMessageComponentCollector({ filter: userSelectFilter, componentType: 'USER_SELECT', time: 120000 });

                            userSelectCollector.on('collect', async userSelectInteraction => {
                                try {
                                    const selectedUser = await userSelectInteraction.guild.members.fetch(userSelectInteraction.values[0]);

                                    const role = await interaction.guild.roles.fetch(selectedRoom.role_id);
                                    if (selectedUser.roles.cache.has(role.id)) {
                                        await selectedUser.roles.remove(role);
                                        await userSelectInteraction.reply({ content: `Роль <@&${role.id}> была удалена у пользователя ${selectedUser.user.username}.`, ephemeral: true });
                                    } else {
                                        await selectedUser.roles.add(role);
                                        await userSelectInteraction.reply({ content: `Роль <@&${role.id}> была добавлена пользователю ${selectedUser.user.username}.`, ephemeral: true });
                                    }

                                } catch (error) {
                                    console.error('Ошибка при обработке взаимодействия:', error);
                                    await userSelectInteraction.reply({ content: 'Произошла ошибка при управлении доступом.', ephemeral: true });
                                }
                            });

                            break;

                        case 'kick-member':
                            const connectedMembers = interaction.guild.members.cache.filter(member => member.voice.channelId === selectedRoom.room_id);

                            if (connectedMembers.size === 0) {
                                return buttonInteraction.reply({ content: 'В комнате нет участников для выгона.', ephemeral: true });
                            }

                            const kickOptions = connectedMembers.map(member => ({
                                label: member.user.username,
                                value: member.id,
                                description: `Выгнать: ${member.user.username}`
                            }));

                            if (kickOptions.length > 25) {
                                kickOptions.length = 25; // Обрезаем до 25 опций
                            }

                            const kickMenu = new StringSelectMenuBuilder()
                                .setCustomId('kick-member-select')
                                .setPlaceholder('Выберите участника для выгона')
                                .addOptions(kickOptions);

                            const kickRow = new ActionRowBuilder().addComponents(kickMenu);
                            await buttonInteraction.update({ content: 'Выберите участника для выгона.', components: [kickRow], ephemeral: true });

                            const kickFilter = i => i.customId === 'kick-member-select' && i.user.id === buttonInteraction.user.id;
                            const kickCollector = buttonInteraction.channel.createMessageComponentCollector({ filter: kickFilter, time: 120000 });

                            kickCollector.on('collect', async selectInteraction => {
                                try {
                                    const memberId = selectInteraction.values[0];
                                    const member = await interaction.guild.members.fetch(memberId);
                                    await member.voice.disconnect();

                                    await selectInteraction.reply({ content: `${member.user.username} был выгнан из комнаты.`, ephemeral: true });

                                } catch (error) {
                                    console.error('Ошибка при выгоне участника:', error);
                                    await selectInteraction.reply({ content: 'Произошла ошибка при выгоне участника.', ephemeral: true });
                                }
                            });

                            break;
                    }
                });

                buttonCollector.on('end', collected => {
                    if (collected.size === 0) {
                        interaction.editReply({ content: 'Время на выбор действия истекло.', components: [] });
                    }
                });
            });

            collector.on('end', collected => {
                if (collected.size === 0) {
                    interaction.editReply({ content: 'Время на выбор комнаты истекло.', components: [] });
                }
            });
        });
    }
};

Ответы (0 шт):