Estoy escribiendo una función que devuelve una imagen incrustada de un mensaje. Quiero decir, Imagen de MessageEmbed.
La cosa: Discord resuelve la URL de la imagen y devuelve un objeto de inserción de imagen en su lugar (se puede encontrar usando la propiedad
message.embeds).
Aquí hay una imagen de ejemplo
Y aquí está el problema principal:
Cuando intente acceder a la propiedad
embedsdesde el objeto del mensaje, obtendrá una matriz vacía como esta:[]. Pero accediendo de nuevo obtendrá el resultado esperado.[ [MessageEmbed] ]Un ImageEmbed.
El problema con esto es que Discord tarda un tiempo en resolver la URL y se muestra en el mensaje como archivo adjunto, y no quiere usar la función setTimeout para esperar. Porque si el mensaje contiene varias URL de imágenes, esto llevará más tiempo. Bueno... intentar acceder a la propiedad embeds después de esa operación no funcionará correctamente porque devuelve nuevamente... una matriz vacía.
Entonces, al buscar el evento messageUpdate , encontré que emite el mismo mensaje con la URL de la imagen resuelta en la propiedad embeds . Así que hago este código:
async function getImageEmbeds(message) { // Access into Client to listen the messageUpdate event. const { client } = message; const collectedImages = new Array(); // Waits the event emittion await new Promise((resolve) => { function fnListener(oldmsg, newmsg) { if (message.id !== newmsg.id) return; const imageEmbeds = newmsg.embeds.filter(embed => embed.thumbnail !== null).map(embed => embed.thumbnail); collectedImages.push(...imageEmbeds); client.removeListener("messageUpdate", fnListener); // Ends this promise. resolve(true); } client.on("messageUpdate", fnListener); }) return collectedImages; } Este código funciona como se esperaba (espera la resolución de la URL de la imagen que se emitirá en el evento messageUpdate y devuelve una matriz con la imagen incrustada resuelta). Pero hay un nuevo problema, la función esperará indefinidamente si el mensaje no tiene una URL de imagen.
¿Alguna sugerencia que pueda solucionar este problema?