Skip to content

Commit 27565ae

Browse files
EepyElvyraDamego
andauthored
refactor: remove abstraction from the context class (#1182)
* refactor: remove abstraction from the context class * refactor: do stuff * Update interactions/client/context.py * Update interactions/client/context.py * Update interactions/client/context.py * Update interactions/client/context.py * Update interactions/client/context.py Co-authored-by: Damego <damego.dev@gmail.com> * Update interactions/client/context.py Co-authored-by: Damego <damego.dev@gmail.com> Co-authored-by: Damego <damego.dev@gmail.com>
1 parent 8987229 commit 27565ae

File tree

1 file changed

+63
-27
lines changed

1 file changed

+63
-27
lines changed

interactions/client/context.py

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import asyncio
2+
from datetime import datetime
13
from logging import Logger
24
from typing import TYPE_CHECKING, List, Optional, Tuple, Union
35

46
from ..api.error import LibraryException
5-
from ..api.models.channel import Channel
7+
from ..api.models.channel import Channel, Thread
68
from ..api.models.flags import MessageFlags, Permissions
79
from ..api.models.guild import Guild
810
from ..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

Comments
 (0)