Discordjs «createMessageComponentCollector», собирающий взаимодействие с другими сообщениями

У меня есть 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; в коллекторе, но мне кажется, что это не нужно? Он также не исправляет сборщики одной и той же /команды, которые также будут запускаться, и должен добавлять кучу фильтров к каждому сборщику, который я делаю, что нецелесообразно.

Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать фильтр, чтобы игнорировать нежелательные взаимодействия.

Вот пример, который я изменил из документов (это не проверено, будьте предупреждены):

// 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.fetchReply(); вместо того, чтобы делать const message = await interaction.reply

Trameur 14.04.2023 02:28
Ответ принят как подходящий

Решение найдено. Это не верно :

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});

Теперь он работает, как и ожидалось.

Другие вопросы по теме