diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index c2db435cf..ae1b2d67d 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -355,6 +355,11 @@ namespace Discord bool IsBoostProgressBarEnabled { get; } /// + /// Gets the upload limit in bytes for this guild. This number is dependent on the guild's boost status. + /// + ulong MaxUploadLimit { get; } + + /// /// Modifies this guild. /// /// The delegate containing the properties to modify the guild with. diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 52929ae0a..d2cc95d27 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -372,6 +372,16 @@ namespace Discord.Rest Preconditions.NotNullOrEmpty(attachment.FileName, nameof(attachment.FileName), "File Name must not be empty or null"); } + if (channel is ITextChannel guildTextChannel) + { + var contentSize = (ulong)attachments.Sum(x => x.Stream.Length); + + if (contentSize > guildTextChannel.Guild.MaxUploadLimit) + { + throw new ArgumentOutOfRangeException(nameof(attachments), $"Collective file size exceeds the max file size of {guildTextChannel.Guild.MaxUploadLimit} bytes in that guild!"); + } + } + // check that user flag and user Id list are exclusive, same with role flag and role Id list if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue) { diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 2cdbbb7b5..ff16c31f1 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -124,6 +124,15 @@ namespace Discord.Rest { await client.ApiClient.DeleteGuildAsync(guild.Id, options).ConfigureAwait(false); } + public static ulong GetUploadLimit(IGuild guild) + { + return guild.PremiumTier switch + { + PremiumTier.Tier2 => 50ul * 1000000, + PremiumTier.Tier3 => 100ul * 1000000, + _ => 8ul * 1000000 + }; + } #endregion #region Bans diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index daecb1d8c..d90372636 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -99,6 +99,9 @@ namespace Discord.Rest }; } } + /// + public ulong MaxUploadLimit + => GuildHelper.GetUploadLimit(this); /// public NsfwLevel NsfwLevel { get; private set; } /// diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 084a42c55..48b4bb5bc 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -201,6 +201,9 @@ namespace Discord.WebSocket }; } } + /// + public ulong MaxUploadLimit + => GuildHelper.GetUploadLimit(this); /// /// Gets the widget channel (i.e. the channel set in the guild's widget settings) in this guild. ///