Discord Bot JS:编辑来自先前斜杠命令交互的回复

我正在编写一个支持音乐的多功能不和谐机器人,需要一些关于这个单一功能的帮助。

有一个播放命令发送包含音乐信息的嵌入消息,当执行停止命令时,它必须编辑播放命令发送的嵌入消息。

这是我的代码的最小化版本(仅作为示例):

(...)
    //PLAY COMMAND
    if (options === 'play') {
      const PlayEmbed = new MessageEmbed()
      PlayEmbed.setColor('#007DD1')
      PlayEmbed.setDescription(`${track.title}`)

      //Send message
      interaction.editReply({embeds: [PlayEmbed]})   // <--- The original reply
    }

    //STOP COMMAND
    if (options === 'stop') {
      const EndEmbed = new MessageEmbed()
      EndEmbed.setColor('#007DD1')
      EndEmbed.setDescription(`The music stopped!`)

      //Edit message
      interaction.editReply({embeds: [EndEmbed]})   // <--- Edit the original reply
    }
(...)

在这种情况下,“.editReply”只是在停止命令之后发送新的嵌入。这可能比我想象的要容易得多,而且我知道我需要通过 webhook 或其他方法获得“播放”交互来编辑该交互发送的特定回复,但我不知道 -如何。子命令“play”和“stop”是这样处理的: const options = interaction.options.getSubcommand();

stack overflow Discord Bot JS: Editing the reply from a previous slash command interaction
原文答案
author avatar

接受的答案

Note: This answer is for Discord.js v13.3.0


每个命令都在不同的 if 块中。当您发送 play 命令时,机器人将按预期编辑回复。一旦完成,它会根据停止命令检查自己。 stopplay 不匹配,代码继续。它不编辑您想要的回复的原因是因为您每次都使用不同的交互。第一个交互用于播放命令,如前所述,由于 playstop 不匹配,代码继续进行,丢弃交互。

对此的解决方案是使用 Set 并将成员的 ID 映射到频道 ID 和回复 ID。但是,这仅适用于消息不是短暂的(“只有您可以看到”)。该解决方案的工作原理如下:

const plays = new Map();

(...)

//PLAY COMMAND
if (options === 'play') {
 (...)
 interaction.editReply({embeds: [PlayEmbed]})
 plays.set(interaction.member.id, [interaction.channel.id, interaction.fetchReply().id])
}

//STOP COMMAND
if (options === 'stop') {
 (...)
 let channel = client.channels.cache.get(plays[interaction.member.id].0);
 // Fetch the messages before we can access any of them
 channel.messages.fetch();
 channel.messages.cache.get(plays[interaction.member.id].1).edit({embeds: [EndEmbed]})
}

对这段代码的一个警告是,如果用户没有运行 play 命令, plays[interaction.member.id] 将返回 undefined 并可能导致错误。


答案: