From 348928a06553c0a818b0fc19779f88175e10eabe Mon Sep 17 00:00:00 2001
From: Mihail Gribkov <61027276+Misha-133@users.noreply.github.com>
Date: Wed, 30 Apr 2025 00:09:32 +0300
Subject: [PATCH] update component limits + add `ComponentCount()` extension
(#3107)
---
.../MessageComponents/Builders/ComponentBuilderV2.cs | 8 ++++----
.../Builders/ComponentContainerExtensions.cs | 9 +++++++++
.../MessageComponents/Builders/ContainerBuilder.cs | 8 --------
3 files changed, 13 insertions(+), 12 deletions(-)
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