У меня есть 2 команды косой черты в Discordjs. В обеих командах у меня есть кнопка и такой коллектор:
const message = await interaction.reply({ components: [row] });
const collector = message.createMessageComponentCollector({ComponentType: ComponentType.Button});
collector.on('collect', async (i) => {}
Если я правильно понимаю, он должен собирать только взаимодействия внутри сообщения. Но в моем случае, если пользователь1 наберет /command1, а пользователь2 наберет /command2, а затем пользователь2 нажмет кнопку /command1, код из сборщика кнопки /command2 может быть выполнен
бывший :
/command1 :
async execute(interaction: any) {
const button = new ButtonBuilder().setLabel('Command 1').setStyle(ButtonStyle.Primary).setCustomId(`command1`);
const row = new ActionRowBuilder().addComponents(button);
const message = await interaction.reply({ components: [row] });
const collector = message.createMessageComponentCollector({ComponentType: ComponentType.Button});
collector.on('collect', async (i) => {i.reply('collector 1')}
}
/command2 :
async execute(interaction: any) {
const button = new ButtonBuilder().setLabel('Command 2').setStyle(ButtonStyle.Primary).setCustomId(`command2`);
const row = new ActionRowBuilder().addComponents(button);
const message = await interaction.reply({ components: [row] });
const collector = message.createMessageComponentCollector({ComponentType: ComponentType.Button});
collector.on('collect', async (i) => {i.reply('collector 2')}
}
В сценарии, который я написал ранее, если пользователь2 нажмет кнопку /command1 от пользователя1, бот ответит
collector 2
На самом деле иногда он отвечает collector 1, поэтому я думаю, что оба сборщика запускаются, и я получаю сообщение об ошибке DiscordAPIError[10062]: Неизвестное взаимодействие со вторым сборщиком, пытающимся ответить одновременно.
Разве createMessageComponentCollector не должен собирать взаимодействие только с одним конкретным сообщением? Почему срабатывают оба коллектора?
Я могу написать что-то вроде if (i.customId != 'command1') return; в коллекторе, но мне кажется, что это не нужно? Он также не исправляет сборщики одной и той же /команды, которые также будут запускаться, и должен добавлять кучу фильтров к каждому сборщику, который я делаю, что нецелесообразно.
Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать фильтр, чтобы игнорировать нежелательные взаимодействия.
Вот пример, который я изменил из документов (это не проверено, будьте предупреждены):
// make sure the interaction's message is the correct message
const filter = (interaction) => interaction.message.id === message.id;
const collector = message.createMessageComponentCollector({ filter, time: 15_000 });
collector.on('collect', i => console.info(`Collected ${i.customId}`));
collector.on('end', collected => console.info(`Collected ${collected.size} items`));
Решение найдено. Это не верно :
const message = await interaction.reply({ components: [row] });
const collector = message.createMessageComponentCollector({ComponentType: ComponentType.Button});
Это верно :
await interaction.reply({ components: [row] });
const message = interaction.fetchReply();
const collector = message.createMessageComponentCollector({ComponentType: ComponentType.Button});
Теперь он работает, как и ожидалось.
Я пробовал играть с фильтрами, и ничего не работало, но я нашел решение. Мне нужно делать
const message = await interaction.fetchReply();вместо того, чтобы делатьconst message = await interaction.reply