Discord.js - how do I edit message.embed() statements?

Viewed 31577

I am making a ping command - It is very simple to code, but I haven't got the slightest idea how to edit the embed I'm using. Here is my code - I'm using a command handler explaining the exports.run statement.

const Discord = require('discord.js')

exports.run = (bot, message, args) => {  
const pingUpdate = new Discord.MessageEmbed()
.setColor('#0099ff')
.setDescription('pinging...')
message.channel.send(pingUpdate);
}

exports.help = {
  name: 'ping'
}

I need to edit the ping update embed to make the .description edit to perform this (simple ping calculation)

message.channel.send('pinging...').then((m) => m.edit(`${m.createdTimestamp - message.createdTimestamp}ms`))

This would make the description change from 'pinging...' to 'examplepingms'

Thank you in advance

4 Answers

You going right way. But to .setDescription you need create new Embed constructor and add description.

message.channel.send('pinging...').then(msg => {
    let embed = new Discord.MessageEmbed() //For discord v11 Change to new Discord.RichEmbed()
        .setDescription(`${msg.createdTimestamp - message.createdTimestamp}`)
    msg.edit(embed)
})

also, instead of doing msg.createTimeStamp - message.createdTimestamp you could also do bot.ping.toFixed(2)

This should work (dont have time to test rn)

    const Embed = new Discord.MessageEmbed()
        .setDescription(":one:")

    const newEmbed = new Discord.MessageEmbed()
        .setDescription(":two:")

    // Edit Part Below
    var Msg = await message.channel.send(Embed); // sends message
    Msg.edit(newEmbed) // edits message with newembed

Edit: realized that im using a older version of discord.js updated to make it work with newer version

Solution seems outdated again, now you should edit embed in message using

Message#edit({embeds:[MessageEmbed#]})

For example:

const oldEmbed = new MessageEmbed();
const messageHandle = await textChannel.send({embeds: [oldEmbed]});
const newEmbed = new MessageEmbed();
messageHandle.edit({embeds:[newEmbed]});

You don't actually have to create a new embed. You can edit the original:

UPDATE: Per the docs, it is recommended to create new embeds, but you use the original embed to pre-populate the new embed. Then, just update what you need and edit the message with the new embed:

// the original embed posted during collected.on('end')
const embed = new MessageEmbed()
                    .setColor('0xff4400')
                    .setTitle(`My Awesome Embed`)
                    .setDescription('\u200b')
                    .setAuthor(collected.first().user.username, collected.first().user.displayAvatarURL())
                    .setImage(`https://via.placeholder.com/400x300.png/808080/000000?text=Placeholder`)
                    .setTimestamp(new Date())
                    .setThumbnail('https://via.placeholder.com/200x200.png/808080/000000?text=Placeholder');

// In the original embed, I have a placeholder image that the user
// can replace by posting a new message with the image they want
client.on('messageCreate', async message => {
    // adding image to original embed
    if (message.attachments.size > 0 && !message.author.bot) {
        // get all messages with attachments
        const messages = await client.channels.cache.get('<CHANNEL>').messages.fetch();
            
        // get the newest message by the user
        const d = messages.filter(msg => msg.embeds.length > 0).filter(m => message.author.username === m.embeds[0].author.name).first();
        
        // create new embed using original as starter
        const tempEmbed = new MessageEmbed(d.embeds[0])

        // update desired values
        tempEmbed.setImage(message.attachments.first().url);
    
        // edit/update the message
        d.edit({ embeds: [tempEmbed] });
        
        // delete the posted image
        message.delete();
    }
});
Related