diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderV2.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderV2.cs index 8c119a28..71bb127e 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderV2.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentBuilderV2.cs @@ -7,9 +7,9 @@ namespace Discord; public class ComponentBuilderV2 : IStaticComponentContainer { /// - /// Gets the maximum number of components that can be added to this container. + /// Gets the maximum number of components that can be added to a message. /// - public const int MaxComponents = 10; + public const int MaxComponents = 40; private List _components = new(); @@ -53,8 +53,8 @@ public class ComponentBuilderV2 : IStaticComponentContainer /// public MessageComponent Build() { - if (_components.Count is 0 or >MaxComponents) - throw new InvalidOperationException($"The number of components must be between 1 and {MaxComponents}."); + Preconditions.AtLeast(Components?.Count ?? 0, 1, nameof(Components.Count), "At least 1 component must be added to this container."); + Preconditions.AtMost(this.ComponentCount(), MaxComponents, nameof(Components.Count), $"A message must contain {MaxComponents} components or less."); if (_components.Any(x => x is not ActionRowBuilder diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentContainerExtensions.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentContainerExtensions.cs index bddf0137..4e31e161 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentContainerExtensions.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ComponentContainerExtensions.cs @@ -5,6 +5,15 @@ namespace Discord; public static class ComponentContainerExtensions { + /// + /// Gets the total number of components in this and all child s combined. + /// + public static int ComponentCount(this IComponentContainer container) + => (container.Components?.Count ?? 0) + + container.Components? + .OfType() + .Sum(x => x.ComponentCount()) ?? 0; + /// /// Adds a to the container. /// diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ContainerBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ContainerBuilder.cs index fe179868..a94a5ad8 100644 --- a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ContainerBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/Builders/ContainerBuilder.cs @@ -7,11 +7,6 @@ namespace Discord; public class ContainerBuilder : IMessageComponentBuilder, IStaticComponentContainer { - /// - /// The maximum number of components allowed in a container. - /// - public const int MaxComponents = 10; - /// public ComponentType Type => ComponentType.Container; @@ -86,9 +81,6 @@ public class ContainerBuilder : IMessageComponentBuilder, IStaticComponentContai /// public ContainerComponent Build() { - if (_components.Count is 0 or > MaxComponents) - throw new InvalidOperationException($"A container must have between 1 and {MaxComponents} components."); - if (_components.Any(x => x is not ActionRowBuilder and not TextDisplayBuilder