如何将用户标识添加到按钮交互中?

How to add the user id to the button interaction?

我正在开发 Discord 机器人,我正在尝试让按钮仅对使用该命令的用户起作用。

对不起,如果我听起来很蠢,但我不知道如何正确解释它。

到目前为止,我所拥有的是在频道中发送消息的命令 test,它附有 2 个按钮,而我想要的是附上用户的按钮的 ID。

.setCustomId(button1-${message.author.id})

如果所有代码都在一个文件中,这实际上是有效的。但是如果我拆分按钮的代码,它就不起作用了。

我尝试将 -${interaction.user.id} 添加到按钮名称,但它不起作用,因为它给我“未定义交互”。

module.exports = {
  data: {
    name: `button1`
  },
  async execute (interaction, client) {

  interaction.channel.send({ content: "This button works!"})

    
  }
}

有什么方法可以将用户的 id 添加到按钮名称中吗?

这应该对您有所帮助。任何时候使用应用程序命令时,该消息都有一个元素来标识发送者 interaction.message.interaction.user.id,即发送命令的人的用户 ID。

但是在您的使用中,您使用的是一条消息,这很好,它仍然可以工作,因为消息有一个元素来指定要回复谁 interaction.message.mentions.users,以便为您使用,试试下面的代码。您不需要将用户 ID 添加到按钮代码中。

if (message.content.startsWith(PREFIX + "test")) {
    const row = new MessageActionRow().addComponents(
        new MessageButton()
            .setLabel("✔")
            .setStyle("PRIMARY")
            .setCustomId(`button1`),
        new MessageButton()
            .setLabel("✔")
            .setStyle("SECONDARY")
            .setCustomId(`button2`),
    );
    message.reply({
        content: "Hello",
        components: [row],
    });
}

以下部分是您的 interactionCreate 代码的一部分,如果是主 bot.js 文件的一部分

client.on('interactionCreate', async interaction => {
    if (interaction.isButton()) {
        const buttonID = interaction.customId;
        if (buttonID === 'button1') {
            if (interaction.message.mentions.users.get(interaction.user.id)) {
                interaction.channel.send({
                    content: "This button works!",
                });
                // This is the sender of the command
                console.log(true);
            } else {
                // This is not the sender
                console.log(false);
                return;
            }
        } else if (buttonID === 'button2') {
            if (interaction.message.mentions.users.get(interaction.user.id)) {
                interaction.channel.send({
                    content: "This button works!",
                });
                console.log(true);
            } else {
                // This is not the sender
                console.log(false);
                return;
            }
        }
    }
});

如果您将 interactionCreate 命令作为单独的文件,代码将如下所示

module.exports = {
    data: {
        name: `interactionCreate`,
    },
    async execute(interaction, client) {
        const buttonID = interaction.customId;
        if (buttonID === 'button1') {
            if (interaction.message.mentions.users.get(interaction.user.id)) {
                interaction.channel.send({
                    content: "This button works!",
                });
                // This is the sender of the command
                console.log(true);
            } else {
                // This is not the sender
                console.log(false);
                return;
            }
        } else if (buttonID === 'button2') {
            if (interaction.message.mentions.users.get(interaction.user.id)) {
                interaction.channel.send({
                    content: "This button works!",
                });
                console.log(true);
            } else {
                // This is not the sender
                console.log(false);
                return;
            }
        }
    },
};