Skip to content

Commit

Permalink
feat!: use the guild data provided on interactions
Browse files Browse the repository at this point in the history
This could in theory use an optimisation of caching the guild, but  as
we do not have a good way to clear the cache afterwards, this is the
best we can implement at this point in time.
  • Loading branch information
onerandomusername committed Sep 23, 2024
1 parent a34d0f9 commit 50cd870
Showing 1 changed file with 22 additions and 14 deletions.
36 changes: 22 additions & 14 deletions disnake/interactions/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ class Interaction(Generic[ClientT]):
"_state",
"_session",
"_original_response",
"_guild",
"_cs_response",
"_cs_followup",
"_cs_me",
Expand All @@ -203,6 +204,7 @@ def __init__(self, *, data: InteractionPayload, state: ConnectionState) -> None:
self.version: int = data["version"]
self.application_id: int = int(data["application_id"])
self.guild_id: Optional[int] = utils._get_as_snowflake(data, "guild_id")
self._guild = data.get("guild")

self.locale: Locale = try_enum(Locale, data["locale"])
guild_locale = data.get("guild_locale")
Expand All @@ -216,18 +218,12 @@ def __init__(self, *, data: InteractionPayload, state: ConnectionState) -> None:
self.author: Union[User, Member] = MISSING

guild_fallback: Optional[Union[Guild, Object]] = None
if self.guild_id:
guild_fallback = self.guild or Object(self.guild_id)

if guild_fallback and (member := data.get("member")):
self.author = (
isinstance(guild_fallback, Guild)
and guild_fallback.get_member(int(member["user"]["id"]))
or Member(
state=self._state,
guild=guild_fallback, # type: ignore # may be `Object`
data=member,
)

if self.guild_id and (guild_fallback := self.guild) and (member := data.get("member")):
self.author = guild_fallback.get_member(int(member["user"]["id"])) or Member(
state=self._state,
guild=guild_fallback,
data=member,
)
self._permissions = int(member.get("permissions", 0))
elif user := data.get("user"):
Expand Down Expand Up @@ -263,8 +259,20 @@ def user(self) -> Union[User, Member]:

@property
def guild(self) -> Optional[Guild]:
"""Optional[:class:`Guild`]: The guild the interaction was sent from."""
return self._state._get_guild(self.guild_id)
"""Optional[:class:`Guild`]: The guild the interaction was sent from.
.. versionchanged:: 2.10
Returns a :class:`Guild` object when the guild could not be resolved from cache.
This object is created from the data provided by Discord, but it is not complete.
The only populated attributes are:
- :attr:`Guild.id`
- :attr:`Guild.locale`
- :attr:`Guild.features`
"""
if self.guild_id is None:
return None

return self._state._get_guild(self.guild_id) or Guild(data=self._guild, state=self._state)

@utils.cached_slot_property("_cs_me")
def me(self) -> Union[Member, ClientUser]:
Expand Down

0 comments on commit 50cd870

Please sign in to comment.