1+ import asyncio
2+ from datetime import datetime
13from logging import Logger
24from typing import TYPE_CHECKING , List , Optional , Tuple , Union
35
46from ..api .error import LibraryException
5- from ..api .models .channel import Channel
7+ from ..api .models .channel import Channel , Thread
68from ..api .models .flags import MessageFlags , Permissions
79from ..api .models .guild import Guild
810from ..api .models .member import Member
@@ -41,11 +43,8 @@ class _Context(ClientSerializerMixin):
4143 """
4244
4345 message : Optional [Message ] = field (converter = Message , default = None , add_client = True )
44- author : Member = field (converter = Member , default = None , add_client = True )
45- member : Member = field (converter = Member , add_client = True )
46+ member : Optional [Member ] = field (default = None , converter = Member , add_client = True )
4647 user : User = field (converter = User , default = None , add_client = True )
47- channel : Optional [Channel ] = field (converter = Channel , default = None , add_client = True )
48- guild : Optional [Guild ] = field (converter = Guild , default = None , add_client = True )
4948 id : Snowflake = field (converter = Snowflake )
5049 application_id : Snowflake = field (converter = Snowflake )
5150 type : InteractionType = field (converter = InteractionType )
@@ -63,6 +62,16 @@ class _Context(ClientSerializerMixin):
6362 locale : Optional [Locale ] = field (converter = Locale , default = None )
6463 guild_locale : Optional [Locale ] = field (converter = Locale , default = None )
6564
65+ def __attrs_post_init__ (self ) -> None :
66+ if self .member and self .guild_id :
67+ self .member ._extras ["guild_id" ] = self .guild_id
68+
69+ if self .user is None :
70+ self .user = self .member .user if self .member else None
71+
72+ if self .member and not self .member .user and self .user :
73+ self .member .user = self .user
74+
6675 @property
6776 def deferred_ephemeral (self ) -> bool :
6877 """
@@ -75,48 +84,81 @@ def deferred_ephemeral(self) -> bool:
7584 and self .message .flags & MessageFlags .LOADING
7685 )
7786
78- def __attrs_post_init__ (self ) -> None :
79- if self .member and self .guild_id :
80- self .member ._extras ["guild_id" ] = self .guild_id
87+ @property
88+ def created_at (self ) -> datetime :
89+ """
90+ .. versionadded:: 4.4.0
8191
82- self .author = self .member
92+ Returns when the interaction was created.
93+ """
94+ return self .id .timestamp
8395
84- if self .user is None :
85- self .user = self .member .user if self .member else None
96+ @property
97+ def author (self ) -> Optional [Member ]:
98+ """
99+ Returns the author/member that invoked the interaction.
100+ """
101+ return self .member
86102
87- if self .guild is None and self .guild_id is not None :
88- self .guild = self ._client .cache [Guild ].get (self .guild_id , MISSING )
103+ @property
104+ def channel (self ) -> Optional [Channel ]:
105+ """
106+ .. versionadded:: 4.1.0
107+
108+ .. versionchanged:: 4.4.0
109+ Channel now returns ``None`` instead of ``MISSING`` if it is not found to avoid confusion
89110
90- if self .channel is None :
91- self .channel = self ._client .cache [Channel ].get (self .channel_id , MISSING )
111+ Returns the current channel, if cached.
112+ """
113+ return self ._client .cache [Channel ].get (self .channel_id , None ) or self ._client .cache [
114+ Thread
115+ ].get (self .channel_id , None )
116+
117+ @property
118+ def guild (self ) -> Optional [Guild ]:
119+ """
120+ .. versionadded:: 4.1.0
121+
122+ .. versionchanged:: 4.4.0
123+ Guild now returns ``None`` instead of ``MISSING`` if it is not found to avoid confusion
124+
125+ Returns the current guild, if cached.
126+ """
127+
128+ return self ._client .cache [Guild ].get (self .guild_id , None )
92129
93130 async def get_channel (self ) -> Channel :
94131 """
95132 .. versionadded:: 4.1.0
96133
97- This gets the channel the context was invoked in.
134+ This gets the channel the context was invoked in. If the channel is not cached, an HTTP request is made.
98135
99136 :return: The channel as object
100137 :rtype: Channel
101138 """
139+ if channel := self .channel :
140+ await asyncio .sleep (0 )
141+ return channel
102142
103143 res = await self ._client .get_channel (int (self .channel_id ))
104- self .channel = Channel (** res , _client = self ._client )
105- return self .channel
144+ return Channel (** res , _client = self ._client )
106145
107146 async def get_guild (self ) -> Guild :
108147 """
109148 .. versionadded:: 4.1.0
110149
111- This gets the guild the context was invoked in.
150+ This gets the guild the context was invoked in. If the guild is not cached, an HTTP request is made.
112151
113152 :return: The guild as object
114153 :rtype: Guild
115154 """
116155
156+ if guild := self .guild :
157+ await asyncio .sleep (0 )
158+ return guild
159+
117160 res = await self ._client .get_guild (int (self .guild_id ))
118- self .guild = Guild (** res , _client = self ._client )
119- return self .guild
161+ return Guild (** res , _client = self ._client )
120162
121163 async def send (
122164 self ,
@@ -389,10 +431,7 @@ class CommandContext(_Context):
389431 :ivar str token: The token of the interaction response.
390432 :ivar Snowflake guild_id: The ID of the current guild.
391433 :ivar Snowflake channel_id: The ID of the current channel.
392- :ivar Member author: The member data model.
393434 :ivar User user: The user data model.
394- :ivar Optional[Channel] channel: The channel data model.
395- :ivar Optional[Guild] guild: The guild data model.
396435 :ivar bool responded: Whether an original response was made or not.
397436 :ivar bool deferred: Whether the response was deferred or not.
398437 :ivar Optional[Locale] locale: The selected language of the user invoking the interaction.
@@ -661,10 +700,7 @@ class ComponentContext(_Context):
661700 :ivar Snowflake guild_id: The ID of the current guild.
662701 :ivar Snowflake channel_id: The ID of the current channel.
663702 :ivar Optional[Message] message: The message data model.
664- :ivar Member author: The member data model.
665703 :ivar User user: The user data model.
666- :ivar Optional[Channel] channel: The channel data model.
667- :ivar Optional[Guild] guild: The guild data model.
668704 :ivar bool responded: Whether an original response was made or not.
669705 :ivar bool deferred: Whether the response was deferred or not.
670706 :ivar str locale: The selected language of the user invoking the interaction.
0 commit comments