Ошибка после выбора участника в селект меню 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: [] });
}
});
});
}
};