Estoy codificando un bot de discordia multifunción con soporte de música y necesito ayuda con esta funcionalidad única.
Hay un comando de reproducción que envía un mensaje de incrustación que contiene información musical y cuando se ejecuta el comando de parada, tiene que editar esa incrustación enviada por el comando de reproducción.
Esta es una versión minimizada de mi código (solo como ejemplo):
(...) //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 } (...) En este caso, ".editReply" solo envía la nueva inserción después del comando de detención. Esto puede ser mucho más fácil de hacer de lo que creo y sé que necesito obtener la interacción "reproducir" para editar la respuesta específica enviada por esa interacción, ya sea a través de webhooks u otro método, pero no sé... cómo. Los subcomandos "reproducir" y "detener" se manejan de esta manera: const options = interaction.options.getSubcommand();
Nota: Esta respuesta es para Discord.js v13.3.0
Cada comando está en un bloque if diferente. Cuando envíe el comando de play , el bot editará la respuesta, según lo previsto. Una vez que termina eso, se compara con el comando de parada. stop no coincide con el play y el código continúa. La razón por la que no está editando la respuesta que desea es porque está utilizando una interacción diferente cada vez. La primera interacción es para el comando de reproducción y, como se indicó anteriormente, dado que la play no coincide con la stop , el código avanza y descarta la interacción.
Una solución a esto es usar un conjunto y asignar la ID del miembro a la ID del canal y la ID de respuesta. Sin embargo, esto solo funciona si el mensaje no es efímero ("Solo tú puedes ver esto"). La solución funciona así:
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]}) } Una advertencia a este código es que si el usuario no ejecutó el comando de reproducción, plays[interaction.member.id] devolverá undefined y probablemente generará un error.