diff --git a/discord/ui/action_row.py b/discord/ui/action_row.py index 9868bfbc2..f4ffc3e2c 100644 --- a/discord/ui/action_row.py +++ b/discord/ui/action_row.py @@ -219,6 +219,12 @@ class ActionRow(Item[V]): for child in self.children: yield child + def content_length(self) -> int: + """:class:`int`: Returns the total length of all text content in this action row.""" + from .text_display import TextDisplay + + return sum(len(item.content) for item in self._children if isinstance(item, TextDisplay)) + def add_item(self, item: Item[Any]) -> Self: """Adds an item to this action row. diff --git a/discord/ui/container.py b/discord/ui/container.py index 8e9130320..1dcdca6b2 100644 --- a/discord/ui/container.py +++ b/discord/ui/container.py @@ -281,6 +281,12 @@ class Container(Item[V]): if child._has_children(): yield from child.walk_children() # type: ignore + def content_length(self) -> int: + """:class:`int`: Returns the total length of all text content in this container.""" + from .text_display import TextDisplay + + return sum(len(item.content) for item in self.walk_children() if isinstance(item, TextDisplay)) + def add_item(self, item: Item[Any]) -> Self: """Adds an item to this container. diff --git a/discord/ui/section.py b/discord/ui/section.py index fc1b770ba..c39c54789 100644 --- a/discord/ui/section.py +++ b/discord/ui/section.py @@ -128,6 +128,12 @@ class Section(Item[V]): def _has_children(self): return True + def content_length(self) -> int: + """:class:`int`: Returns the total length of all text content in this section.""" + from .text_display import TextDisplay + + return sum(len(item.content) for item in self._children if isinstance(item, TextDisplay)) + def add_item(self, item: Union[str, Item[Any]]) -> Self: """Adds an item to this section. diff --git a/discord/ui/view.py b/discord/ui/view.py index af41285d5..6d2f16024 100644 --- a/discord/ui/view.py +++ b/discord/ui/view.py @@ -327,6 +327,15 @@ class BaseView: """List[:class:`Item`]: The list of children attached to this view.""" return self._children.copy() + def content_length(self) -> int: + """:class:`int`: Returns the total length of all text content in the view's items. + + A view is allowed to have a maximum of 4000 display characters across all its items. + """ + from .text_display import TextDisplay + + return sum(len(item.content) for item in self.walk_children() if isinstance(item, TextDisplay)) + @classmethod def from_message(cls, message: Message, /, *, timeout: Optional[float] = 180.0) -> Union[View, LayoutView]: """Converts a message's components into a :class:`View`