Skip to content

Commit 814ce3c

Browse files
authored
Add command target to MessageInteractionMetadata
1 parent c7305b0 commit 814ce3c

File tree

2 files changed

+78
-8
lines changed

2 files changed

+78
-8
lines changed

discord/message.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,14 @@ class MessageInteractionMetadata(Hashable):
828828
The ID of the message that containes the interactive components, if applicable.
829829
modal_interaction: Optional[:class:`.MessageInteractionMetadata`]
830830
The metadata of the modal submit interaction that triggered this interaction, if applicable.
831+
target_user: Optional[:class:`User`]
832+
The user the command was run on, only applicable to user context menus.
833+
834+
.. versionadded:: 2.5
835+
target_message_id: Optional[:class:`int`]
836+
The ID of the message the command was run on, only applicable to message context menus.
837+
838+
.. versionadded:: 2.5
831839
"""
832840

833841
__slots__: Tuple[str, ...] = (
@@ -837,6 +845,8 @@ class MessageInteractionMetadata(Hashable):
837845
'original_response_message_id',
838846
'interacted_message_id',
839847
'modal_interaction',
848+
'target_user',
849+
'target_message_id',
840850
'_integration_owners',
841851
'_state',
842852
'_guild',
@@ -848,31 +858,43 @@ def __init__(self, *, state: ConnectionState, guild: Optional[Guild], data: Mess
848858

849859
self.id: int = int(data['id'])
850860
self.type: InteractionType = try_enum(InteractionType, data['type'])
851-
self.user = state.create_user(data['user'])
861+
self.user: User = state.create_user(data['user'])
852862
self._integration_owners: Dict[int, int] = {
853863
int(key): int(value) for key, value in data.get('authorizing_integration_owners', {}).items()
854864
}
855865

856866
self.original_response_message_id: Optional[int] = None
857867
try:
858-
self.original_response_message_id = int(data['original_response_message_id'])
868+
self.original_response_message_id = int(data['original_response_message_id']) # type: ignore # EAFP
859869
except KeyError:
860870
pass
861871

862872
self.interacted_message_id: Optional[int] = None
863873
try:
864-
self.interacted_message_id = int(data['interacted_message_id'])
874+
self.interacted_message_id = int(data['interacted_message_id']) # type: ignore # EAFP
865875
except KeyError:
866876
pass
867877

868878
self.modal_interaction: Optional[MessageInteractionMetadata] = None
869879
try:
870880
self.modal_interaction = MessageInteractionMetadata(
871-
state=state, guild=guild, data=data['triggering_interaction_metadata']
881+
state=state, guild=guild, data=data['triggering_interaction_metadata'] # type: ignore # EAFP
872882
)
873883
except KeyError:
874884
pass
875885

886+
self.target_user: Optional[User] = None
887+
try:
888+
self.target_user = state.create_user(data['target_user']) # type: ignore # EAFP
889+
except KeyError:
890+
pass
891+
892+
self.target_message_id: Optional[int] = None
893+
try:
894+
self.target_message_id = int(data['target_message_id']) # type: ignore # EAFP
895+
except KeyError:
896+
pass
897+
876898
def __repr__(self) -> str:
877899
return f'<MessageInteraction id={self.id} type={self.type!r} user={self.user!r}>'
878900

@@ -899,6 +921,16 @@ def interacted_message(self) -> Optional[Message]:
899921
return self._state._get_message(self.interacted_message_id)
900922
return None
901923

924+
@property
925+
def target_message(self) -> Optional[Message]:
926+
"""Optional[:class:`~discord.Message`]: The target message, if applicable and is found in cache.
927+
928+
.. versionadded:: 2.5
929+
"""
930+
if self.target_message_id:
931+
return self._state._get_message(self.target_message_id)
932+
return None
933+
902934
def is_guild_integration(self) -> bool:
903935
""":class:`bool`: Returns ``True`` if the interaction is a guild integration."""
904936
if self._guild:

discord/types/interactions.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,49 @@ class MessageInteraction(TypedDict):
255255
member: NotRequired[Member]
256256

257257

258-
class MessageInteractionMetadata(TypedDict):
258+
class _MessageInteractionMetadata(TypedDict):
259259
id: Snowflake
260-
type: InteractionType
261260
user: User
262261
authorizing_integration_owners: Dict[Literal['0', '1'], Snowflake]
263262
original_response_message_id: NotRequired[Snowflake]
264-
interacted_message_id: NotRequired[Snowflake]
265-
triggering_interaction_metadata: NotRequired[MessageInteractionMetadata]
263+
264+
265+
class _ApplicationCommandMessageInteractionMetadata(_MessageInteractionMetadata):
266+
type: Literal[2]
267+
# command_type: Literal[1, 2, 3, 4]
268+
269+
270+
class UserApplicationCommandMessageInteractionMetadata(_ApplicationCommandMessageInteractionMetadata):
271+
# command_type: Literal[2]
272+
target_user: User
273+
274+
275+
class MessageApplicationCommandMessageInteractionMetadata(_ApplicationCommandMessageInteractionMetadata):
276+
# command_type: Literal[3]
277+
target_message_id: Snowflake
278+
279+
280+
ApplicationCommandMessageInteractionMetadata = Union[
281+
_ApplicationCommandMessageInteractionMetadata,
282+
UserApplicationCommandMessageInteractionMetadata,
283+
MessageApplicationCommandMessageInteractionMetadata,
284+
]
285+
286+
287+
class MessageComponentMessageInteractionMetadata(_MessageInteractionMetadata):
288+
type: Literal[3]
289+
interacted_message_id: Snowflake
290+
291+
292+
class ModalSubmitMessageInteractionMetadata(_MessageInteractionMetadata):
293+
type: Literal[5]
294+
triggering_interaction_metadata: Union[
295+
ApplicationCommandMessageInteractionMetadata, MessageComponentMessageInteractionMetadata
296+
]
297+
298+
299+
MessageInteractionMetadata = Union[
300+
ApplicationCommandMessageInteractionMetadata,
301+
MessageComponentMessageInteractionMetadata,
302+
ModalSubmitMessageInteractionMetadata,
303+
]

0 commit comments

Comments
 (0)