class Message
extends
Baseexport class Message<InGuild extends boolean = boolean> extends BaseRepresents a message on Discord.
activity : MessageActivity | null
Group activity
The id of the application of the interaction that sent this message, if any
attachments : Collection<Snowflake, Attachment>
A collection of attachments in the message - e.g. Pictures - mapped by their ids. This property requires the GatewayIntentBits.MessageContent privileged intent in a guild for messages that do not mention the client.
author : User
The author of the message
readonlybulkDeletable : boolean
Whether the message is bulk deletable by the client user
call : MessageCall | null
The call associated with the message
readonlychannel : If<InGuild, GuildTextBasedChannel, TextBasedChannel>
The channel that the message was sent in
channelId : Snowflake
The id of the channel the message was sent in
readonlycleanContent : string
The message contents with all mentions replaced by the equivalent text. If mentions cannot be resolved to a name, the relevant mention in the message content will not be converted.
components : TopLevelComponent[]
An array of components in the message. This property requires the GatewayIntentBits.MessageContent privileged intent in a guild for messages that do not mention the client.
content : string
The content of the message. This property requires the GatewayIntentBits.MessageContent privileged intent in a guild for messages that do not mention the client.
readonlycreatedAt : Date
The time the message was sent at
createdTimestamp : number
The timestamp the message was sent at
readonlycrosspostable : boolean
Whether the message is crosspostable by the client user
readonlydeletable : boolean
Whether the message is deletable by the client user
readonlyeditable : boolean
Whether the message is editable by the client user
embeds : Embed[]
An array of embeds in the message - e.g. YouTube Player. This property requires the GatewayIntentBits.MessageContent privileged intent in a guild for messages that do not mention the client.
flags : Readonly<MessageFlagsBitField>
Flags that are applied to the message
groupActivityApplication : ClientApplication | null
Supplemental application information for group activities
readonlyhasThread : boolean
Whether this message has a thread associated with it
id : Snowflake
The message's id
deprecatedinteraction : MessageInteraction | null
Use interactionMetadata instead.
Partial data of the interaction that this message is a reply to
interactionMetadata : MessageInteractionMetadata | null
Partial data of the interaction that this message is a result of
readonlymember : GuildMember | null
Represents the author of the message as a guild member. Only available if the message comes from a guild where the author is still a member
mentions : MessageMentions<InGuild>
All valid mentions that the message contains
messageSnapshots : Collection<Snowflake, MessageSnapshot>
The message snapshots associated with the message reference
A random number or string used for checking message delivery This is only received after the message was sent successfully, and lost if re-fetched
readonlypinnable : boolean
Whether the message is pinnable by the client user
pinned : boolean
Whether or not this message is pinned
A generally increasing integer (there may be gaps or duplicates) that represents the approximate position of the message in a thread.
reactions : ReactionManager
A manager of the reactions belonging to this message
reference : MessageReference | null
Message reference data
resolved : CommandInteractionResolvedData | null
roleSubscriptionData : RoleSubscriptionData | null
The data of the role subscription purchase or renewal. This is present on MessageType.RoleSubscriptionPurchase messages.
stickers : Collection<Snowflake, Sticker>
A collection of stickers in the message
system : boolean
Whether or not this message was sent by Discord, not actually a user (e.g. pin notifications)
readonlythread : AnyThreadChannel | null
The thread started by this message This property is not suitable for checking whether a message has a thread, use hasThread instead.
tts : boolean
Whether or not the message was Text-To-Speech
type : MessageType
The type of the message
readonlyurl : string
The URL to jump to this message
awaitMessageComponent<ComponentType extends MessageComponentType
>(options?: AwaitMessageCollectorOptionsParams<ComponentType, InGuild>) : Promise<MappedInteractionTypes<InGuild>[ComponentType]>
ComponentType extends MessageComponentType
Collects a single component interaction that passes the filter. The Promise will reject if the time expires.
// Collect a message component interaction
const filter = (interaction) => interaction.customId === 'button' && interaction.user.id === 'someId';
message.awaitMessageComponent({ filter, time: 15_000 })
.then(interaction => console.log(`${interaction.customId} was clicked!`))
.catch(console.error); awaitReactions(options?: AwaitReactionsOptions) : Promise<Collection<Snowflake | string, MessageReaction>>
Similar to createReactionCollector but in promise form. Resolves with a collection of reactions that pass the specified filter.
// Create a reaction collector
const filter = (reaction, user) => reaction.emoji.name === '👌' && user.id === 'someId'
message.awaitReactions({ filter, time: 15_000 })
.then(collected => console.log(`Collected ${collected.size} reactions`))
.catch(console.error); createMessageComponentCollector<ComponentType extends MessageComponentType
>(options?: MessageCollectorOptionsParams<ComponentType, InGuild>) : InteractionCollector<MappedInteractionTypes<InGuild>[ComponentType]>
ComponentType extends MessageComponentType
Creates a message component interaction collector.
// Create a message component interaction collector
const filter = (interaction) => interaction.customId === 'button' && interaction.user.id === 'someId';
const collector = message.createMessageComponentCollector({ filter, time: 15_000 });
collector.on('collect', i => console.log(`Collected ${i.customId}`));
collector.on('end', collected => console.log(`Collected ${collected.size} items`)); createReactionCollector(options?: ReactionCollectorOptions) : ReactionCollector
Creates a reaction collector.
// Create a reaction collector
const filter = (reaction, user) => reaction.emoji.name === '👌' && user.id === 'someId';
const collector = message.createReactionCollector({ filter, time: 15_000 });
collector.on('collect', r => console.log(`Collected ${r.emoji.name}`));
collector.on('end', collected => console.log(`Collected ${collected.size} items`));crosspost() : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Publishes a message in an announcement channel to all channels following it.
// Crosspost a message
if (message.channel.type === ChannelType.GuildAnnouncement) {
message.crosspost()
.then(() => console.log('Crossposted message'))
.catch(console.error);
}delete() : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Deletes the message.
// Delete a message
message.delete()
.then(msg => console.log(`Deleted message from ${msg.author.username}`))
.catch(console.error); edit(options: string | MessageEditOptions | MessagePayload) : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Edits the content of the message.
// Update the content of a message
message.edit('This is my new content!')
.then(msg => console.log(`Updated the content of a message to ${msg.content}`))
.catch(console.error);Used mainly internally. Whether two messages are identical in properties. If you want to compare messages without checking all the properties, use message.id === message2.id, which is much more efficient. This method allows you to see if there are differences in content, embeds, attachments, nonce and tts properties.
fetch(force?: boolean) : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Fetch this message.
fetchReference() : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Fetches the Message this crosspost/reply/pin-add references, if available to the client
inGuild() : this is Message<true>
Whether this message is from a guild.
pin(reason?: string) : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Pins this message to the channel's pinned messages.
// Pin a message
message.pin()
.then(console.log)
.catch(console.error) react(emoji: EmojiIdentifierResolvable) : Promise<MessageReaction>
Adds a reaction to the message.
// React to a message with a unicode emoji
message.react('🤔')
.then(console.log)
.catch(console.error);// React to a message with a custom emoji
message.react(message.guild.emojis.cache.get('123456789012345678'))
.then(console.log)
.catch(console.error);removeAttachments() : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Removes the attachments from this message.
reply(options: string | MessagePayload | MessageReplyOptions) : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Send an inline reply to this message.
// Reply to a message
message.reply('This is a reply!')
.then(() => console.log(`Replied to message "${message.content}"`))
.catch(console.error); resolveComponent(customId: string) : MessageActionRowComponent | null
Resolves a component by a custom id.
startThread(options: StartThreadOptions) : Promise<PublicThreadChannel<false>>
Create a new public thread from this message
suppressEmbeds(suppress?: boolean) : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Suppresses or unsuppresses embeds on a message.
toJSON() : unknown
toString() : string
When concatenated with a string, this automatically concatenates the message's content instead of the object.
// Logs: Message: This is a message!
console.log(`Message: ${message}`); unpin(reason?: string) : Promise<OmitPartialGroupDMChannel<Message<InGuild>>>
Unpins this message from the channel's pinned messages.
// Unpin a message
message.unpin()
.then(console.log)
.catch(console.error)