Отправить эфемерное сообщение пользователю, который нажал кнопку

#javascript #node.js #discord.js

Вопрос:

Я хочу показывать кнопки в сообщении, но разрешать взаимодействовать с кнопками только исходному отправителю запроса сообщения. Если кто-то еще нажимает кнопки, я хочу отправить им секретное сообщение о том, что их щелчок был проигнорирован.

Я изучал это некоторое время, и я продолжаю находить людей, говорящих, что это невозможно, но все же бот Dank Memer уже делает именно это! Если вы нажмете кнопку на чужом сообщении, бот отправит вам сообщение со словами «Это меню не для вас». и в нем будет сказано «Только вы можете увидеть это сообщение»

В настоящее время у меня есть этот код

 const collector = message.createMessageComponentCollector({ componentType: "BUTTON", time: 15000});

collector.on("collect",collected => {
    if(collected.user.id !== interaction.user.id){
        //collected.member.send("This command is being controlled by somebody else.");
        // What can I put in here to send an ephemeral message to collected.user?? I can send them a DM using .send(), but that's not what I want.
        return;
    }
    if(collected.customId === "confirm"){
        interaction.followUp("Success");
    }else{
        interaction.followUp("Ignore");
    }
});
 

Вот фотография, на которой Данк Мемер делает это… Что наводит меня на мысль, что это возможно. (Он сказал это в ответ на то, что я попросил таблицу лидеров для одной учетной записи, а затем попытался перейти к ней в другой учетной записи.)

Промозглый Мемер, делающий то, что мне сказали, невозможно

Пожалуйста, скажите мне, как это делается!

Ответ №1:

Основываясь на этом примере из discord.js руководство вы можете сделать это, ответив на собранный объект, поскольку он представляет собой взаимодействие:

 collector.on("collect",collected => {
    // Replies to the user who clicked a button that wasn't theirs
    if(collected.user.id !== interaction.user.id){
        collected.reply({ content: `These buttons aren't for you!`, ephemeral: true })
        return;
    }
    if(collected.customId === "confirm"){
        interaction.followUp("Success");
    } else {
        interaction.followUp("Ignore");
    }
});
 

Комментарии:

1. Потрясающе! Это именно то, что я искал, спасибо! Я пробовал это раньше, но, должно быть, я случайно допустил опечатку, потому что каждый раз, когда я запускал свой код, программа завершалась без сообщения об ошибке, поэтому я просто предположил, что это невозможно. Я просто переписал его снова с нуля, и теперь он работает отлично. Огромное спасибо!

Ответ №2:

Чтобы ответить ephemeral , вы должны использовать interaction.reply и получить такой код:

 interaction.reply({ content: `text`, ephemeral: true })
 

Комментарии:

1. Нет! Извините, но это неправильный ответ. Использование interaction.reply() отправляет секретное сообщение исходному пользователю команды, который не является тем человеком, который должен его получать! Я хочу отправить сообщение человеку, пытающемуся взаимодействовать с командой, а не человеку, который ее изначально выполнил. Я использовал именно этот код, и я уверен, что он не работает должным образом.