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

Posted

技术标签:

【中文标题】Discord Bot JS:编辑来自先前斜杠命令交互的回复【英文标题】:Discord Bot JS: Editing the reply from a previous slash command interaction 【发布时间】:2021-12-15 08:01:25 【问题描述】:

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

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

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

(...)
    //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();

【问题讨论】:

【参考方案1】:

注意:此答案适用于 Discord.js v13.3.0


每个命令都在不同的if 块中。当您发送play 命令时,机器人将按预期编辑回复。一旦完成,它会根据停止命令检查自己。 stop 不匹配 play 并且代码继续。它没有编辑您想要的回复的原因是因为您每次都使用不同的交互。第一个交互用于播放命令,如前所述,由于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])

此代码的一个警告是,如果用户尚未运行播放命令,plays[interaction.member.id] 将返回 undefined 并可能导致错误。

【讨论】:

以上是关于Discord Bot JS:编辑来自先前斜杠命令交互的回复的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 从带有前缀的句子中过滤命令(比如 Hey Bot 给我一块蛋糕)

Discord Bot Say 命令编辑:有权限

Discord bot没有回复消息[重复]

如何获取 Bot 消息 ID 并编辑消息 - Discord JDA Java

Discord bot 更改前缀命令出错 (discord.js)

Discord.js v13:斜杠命令重复