diff --git a/discord/ui/button.py b/discord/ui/button.py index 82a485f91..7a60333db 100644 --- a/discord/ui/button.py +++ b/discord/ui/button.py @@ -149,6 +149,7 @@ class Button(Item[V]): style=style, emoji=emoji, sku_id=sku_id, + id=id, ) self._parent: Optional[ActionRow] = None self.row = row @@ -250,6 +251,7 @@ class Button(Item[V]): emoji=button.emoji, row=None, sku_id=button.sku_id, + id=button.id, ) @property diff --git a/discord/ui/container.py b/discord/ui/container.py index cc2405a75..b4aa574b6 100644 --- a/discord/ui/container.py +++ b/discord/ui/container.py @@ -194,12 +194,15 @@ class Container(Item[V]): def to_component_dict(self) -> Dict[str, Any]: components = self.to_components() - return { + base = { 'type': self.type.value, 'accent_color': self._colour.value if self._colour else None, 'spoiler': self.spoiler, 'components': components, } + if self.id is not None: + base['id'] = self.id + return base def _update_store_data( self, @@ -222,4 +225,5 @@ class Container(Item[V]): children=[_component_to_item(c) for c in component.children], accent_colour=component.accent_colour, spoiler=component.spoiler, + id=component.id, ) diff --git a/discord/ui/file.py b/discord/ui/file.py index 7d065f0ff..2e34c316d 100644 --- a/discord/ui/file.py +++ b/discord/ui/file.py @@ -75,6 +75,7 @@ class File(Item[V]): self._underlying = FileComponent._raw_construct( media=UnfurledMediaItem(media) if isinstance(media, str) else media, spoiler=spoiler, + id=id, ) self.row = row @@ -126,4 +127,5 @@ class File(Item[V]): return cls( media=component.media, spoiler=component.spoiler, + id=component.id, ) diff --git a/discord/ui/media_gallery.py b/discord/ui/media_gallery.py index ee0fb3cf0..3deca63c8 100644 --- a/discord/ui/media_gallery.py +++ b/discord/ui/media_gallery.py @@ -75,6 +75,7 @@ class MediaGallery(Item[V]): self._underlying = MediaGalleryComponent._raw_construct( items=items, + id=id, ) self.row = row @@ -183,4 +184,5 @@ class MediaGallery(Item[V]): def from_component(cls, component: MediaGalleryComponent) -> Self: return cls( items=component.items, + id=component.id, ) diff --git a/discord/ui/section.py b/discord/ui/section.py index 0aa164d88..a034a1c08 100644 --- a/discord/ui/section.py +++ b/discord/ui/section.py @@ -174,6 +174,7 @@ class Section(Item[V]): return cls( children=[_component_to_item(c) for c in component.components], accessory=_component_to_item(component.accessory), + id=component.id, ) def to_component_dict(self) -> Dict[str, Any]: @@ -182,4 +183,6 @@ class Section(Item[V]): 'components': [c.to_component_dict() for c in self._children], 'accessory': self.accessory.to_component_dict(), } + if self.id is not None: + data['id'] = self.id return data diff --git a/discord/ui/select.py b/discord/ui/select.py index efa8a9e68..e2d3d34d2 100644 --- a/discord/ui/select.py +++ b/discord/ui/select.py @@ -224,6 +224,7 @@ class BaseSelect(Item[V]): 'min_values', 'max_values', 'disabled', + 'id', ) def __init__( @@ -257,6 +258,7 @@ class BaseSelect(Item[V]): channel_types=[] if channel_types is MISSING else channel_types, options=[] if options is MISSING else options, default_values=[] if default_values is MISSING else default_values, + id=id, ) self.row = row diff --git a/discord/ui/separator.py b/discord/ui/separator.py index 394e9ac78..e212f4b4e 100644 --- a/discord/ui/separator.py +++ b/discord/ui/separator.py @@ -74,6 +74,7 @@ class Separator(Item[V]): self._underlying = SeparatorComponent._raw_construct( spacing=spacing, visible=visible, + id=id, ) self.row = row @@ -120,4 +121,5 @@ class Separator(Item[V]): return cls( visible=component.visible, spacing=component.spacing, + id=component.id, ) diff --git a/discord/ui/text_display.py b/discord/ui/text_display.py index 8e22905eb..409b68272 100644 --- a/discord/ui/text_display.py +++ b/discord/ui/text_display.py @@ -67,10 +67,13 @@ class TextDisplay(Item[V]): self.id = id def to_component_dict(self): - return { + base = { 'type': self.type.value, 'content': self.content, } + if self.id is not None: + base['id'] = self.id + return base @property def width(self): @@ -87,4 +90,5 @@ class TextDisplay(Item[V]): def from_component(cls, component: TextDisplayComponent) -> Self: return cls( content=component.content, + id=component.id, ) diff --git a/discord/ui/text_input.py b/discord/ui/text_input.py index 96b4581f4..86f7373ee 100644 --- a/discord/ui/text_input.py +++ b/discord/ui/text_input.py @@ -92,6 +92,10 @@ class TextInput(Item[V]): like to control the relative positioning of the row then passing an index is advised. For example, row=1 will show up before row=2. Defaults to ``None``, which is automatic ordering. The row number must be between 0 and 4 (i.e. zero indexed). + id: Optional[:class:`int`] + The ID of the component. This must be unique across the view. + + .. versionadded:: 2.6 """ __item_repr_attributes__: Tuple[str, ...] = ( @@ -112,6 +116,7 @@ class TextInput(Item[V]): min_length: Optional[int] = None, max_length: Optional[int] = None, row: Optional[int] = None, + id: Optional[int] = None, ) -> None: super().__init__() self._value: Optional[str] = default @@ -129,8 +134,10 @@ class TextInput(Item[V]): required=required, min_length=min_length, max_length=max_length, + id=id, ) self.row = row + self.id = id def __str__(self) -> str: return self.value @@ -241,6 +248,7 @@ class TextInput(Item[V]): min_length=component.min_length, max_length=component.max_length, row=None, + id=component.id, ) @property diff --git a/discord/ui/thumbnail.py b/discord/ui/thumbnail.py index e9a2c13f5..7f21edd3a 100644 --- a/discord/ui/thumbnail.py +++ b/discord/ui/thumbnail.py @@ -96,12 +96,15 @@ class Thumbnail(Item[V]): return True def to_component_dict(self) -> Dict[str, Any]: - return { + base = { 'type': self.type.value, 'spoiler': self.spoiler, 'media': self.media.to_dict(), 'description': self.description, } + if self.id is not None: + base['id'] = self.id + return base @classmethod def from_component(cls, component: ThumbnailComponent) -> Self: @@ -109,4 +112,5 @@ class Thumbnail(Item[V]): media=component.media.url, description=component.description, spoiler=component.spoiler, + id=component.id, )