我正在编写一个具有音乐支持的多功能不和谐机器人,需要一些帮助。
有一个播放命令发送包含音乐信息的嵌入消息,当停止命令被执行时,它必须编辑播放命令发送的嵌入。
这是我的代码的最小化版本(只是作为一个例子):
(...)
//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"只在stop命令后发送新的嵌入。这可能比我想象的要容易得多,我知道我需要得到"游戏"。交互来编辑由该交互发送的特定回复,可以通过webhook或其他方法,但我不知道。子命令"play";和";stop"被这样处理:const options = interaction.options.getSubcommand();
注意:此答案适用于Discord.js v13.3.0
每个命令在不同的if
块中。当您发送play
命令时,bot将按预期编辑回复。完成该操作后,它将根据stop命令检查自己。stop
与play
不匹配,代码继续执行。它没有编辑您希望它编辑的回复的原因是因为您每次都使用不同的交互。第一个交互是针对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]})
}
此代码的一个警告是,如果用户没有运行play命令,plays[interaction.member.id]
将返回undefined,并可能导致错误。