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
并且代码继续。它没有编辑您想要的回复的原因是因为您每次都使用不同的交互。第一个交互用于播放命令,如前所述,由于play
与stop
不匹配,代码继续前进,丢弃交互。
对此的解决方案是使用 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 给我一块蛋糕)
如何获取 Bot 消息 ID 并编辑消息 - Discord JDA Java