diff --git a/src/Discord.Net.Core/DiscordConfig.cs b/src/Discord.Net.Core/DiscordConfig.cs
index 067c55225..4e9ac1f8a 100644
--- a/src/Discord.Net.Core/DiscordConfig.cs
+++ b/src/Discord.Net.Core/DiscordConfig.cs
@@ -132,6 +132,21 @@ namespace Discord
///
public const int MaxAuditLogEntriesPerBatch = 100;
+ ///
+ /// Returns the max number of stickers that can be sent on a message.
+ ///
+ public const int MaxStickersPerMessage = 3;
+
+ ///
+ /// Returns the max numbe of files that can be sent on a message.
+ ///
+ public const int MaxFilesPerMessage = 10;
+
+ ///
+ /// Returns the max number of embeds that can be sent on a message.
+ ///
+ public const int MaxEmbedsPerMessage = 10;
+
///
/// Gets or sets how a request should act in the case of an error, by default.
///
@@ -165,23 +180,23 @@ namespace Discord
///
internal bool DisplayInitialLog { get; set; } = true;
- ///
- /// Gets or sets whether or not rate-limits should use the system clock.
- ///
- ///
- /// If set to false, we will use the X-RateLimit-Reset-After header
- /// to determine when a rate-limit expires, rather than comparing the
- /// X-RateLimit-Reset timestamp to the system time.
- ///
- /// This should only be changed to false if the system is known to have
- /// a clock that is out of sync. Relying on the Reset-After header will
- /// incur network lag.
- ///
- /// Regardless of this property, we still rely on the system's wall-clock
- /// to determine if a bucket is rate-limited; we do not use any monotonic
- /// clock. Your system will still need a stable clock.
- ///
- public bool UseSystemClock { get; set; } = true;
+ ///
+ /// Gets or sets whether or not rate-limits should use the system clock.
+ ///
+ ///
+ /// If set to false, we will use the X-RateLimit-Reset-After header
+ /// to determine when a rate-limit expires, rather than comparing the
+ /// X-RateLimit-Reset timestamp to the system time.
+ ///
+ /// This should only be changed to false if the system is known to have
+ /// a clock that is out of sync. Relying on the Reset-After header will
+ /// incur network lag.
+ ///
+ /// Regardless of this property, we still rely on the system's wall-clock
+ /// to determine if a bucket is rate-limited; we do not use any monotonic
+ /// clock. Your system will still need a stable clock.
+ ///
+ public bool UseSystemClock { get; set; } = true;
///
/// Gets or sets whether or not the internal experation check uses the system date
diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs
index 60a7c7575..ed1fb264d 100644
--- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs
+++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs
@@ -38,6 +38,16 @@ namespace Discord
///
Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null, Embed[] embeds = null, MessageFlags flags = MessageFlags.None);
///
+ /// Sends a message to this message channel.
+ ///
+ /// The created from a .
+ /// The options to be used when sending the request.
+ ///
+ /// A task that represents an asynchronous send operation for delivering the message. The task result
+ /// contains the sent message.
+ ///
+ Task SendMessageAsync(Message message, RequestOptions options = null);
+ ///
/// Sends a file to this message channel with an optional caption.
///
///
diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/ComponentBuilder.cs
index 37342b039..c56c5c3f8 100644
--- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/ComponentBuilder.cs
+++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/ComponentBuilder.cs
@@ -92,7 +92,7 @@ namespace Discord
/// The max values of the placeholder.
/// Whether or not the menu is disabled.
/// The row to add the menu to.
- ///
+ /// The current builder.
public ComponentBuilder WithSelectMenu(string customId, List options,
string placeholder = null, int minValues = 1, int maxValues = 1, bool disabled = false, int row = 0)
{
diff --git a/src/Discord.Net.Core/Entities/Messages/Message.cs b/src/Discord.Net.Core/Entities/Messages/Message.cs
new file mode 100644
index 000000000..6341c54be
--- /dev/null
+++ b/src/Discord.Net.Core/Entities/Messages/Message.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ ///
+ /// Represents a message created by a that can be sent to a channel.
+ ///
+ public sealed class Message
+ {
+ ///
+ /// Gets the content of the message.
+ ///
+ public string Content { get; internal set; }
+
+ ///
+ /// Gets whether or not this message should be read by a text-to-speech engine.
+ ///
+ public bool IsTTS { get; internal set; }
+
+ ///
+ /// Gets a collection of embeds sent along with this message.
+ ///
+ public IReadOnlyCollection