Skip to content

Commit cb7eb2d

Browse files
feat!: use the guild data provided on interactions
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.
1 parent a34d0f9 commit cb7eb2d

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

disnake/interactions/base.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ class Interaction(Generic[ClientT]):
183183
"_state",
184184
"_session",
185185
"_original_response",
186+
"_guild",
186187
"_cs_response",
187188
"_cs_followup",
188189
"_cs_me",
@@ -203,6 +204,7 @@ def __init__(self, *, data: InteractionPayload, state: ConnectionState) -> None:
203204
self.version: int = data["version"]
204205
self.application_id: int = int(data["application_id"])
205206
self.guild_id: Optional[int] = utils._get_as_snowflake(data, "guild_id")
207+
self._guild = data.get("guild")
206208

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

218220
guild_fallback: Optional[Union[Guild, Object]] = None
219-
if self.guild_id:
220-
guild_fallback = self.guild or Object(self.guild_id)
221-
222-
if guild_fallback and (member := data.get("member")):
223-
self.author = (
224-
isinstance(guild_fallback, Guild)
225-
and guild_fallback.get_member(int(member["user"]["id"]))
226-
or Member(
227-
state=self._state,
228-
guild=guild_fallback, # type: ignore # may be `Object`
229-
data=member,
230-
)
221+
222+
if self.guild_id and (guild := self.guild) and (member := data.get("member")):
223+
self.author = guild.get_member(int(member["user"]["id"])) or Member(
224+
state=self._state,
225+
guild=guild,
226+
data=member,
231227
)
232228
self._permissions = int(member.get("permissions", 0))
233229
elif user := data.get("user"):
@@ -263,8 +259,20 @@ def user(self) -> Union[User, Member]:
263259

264260
@property
265261
def guild(self) -> Optional[Guild]:
266-
"""Optional[:class:`Guild`]: The guild the interaction was sent from."""
267-
return self._state._get_guild(self.guild_id)
262+
"""Optional[:class:`Guild`]: The guild the interaction was sent from.
263+
264+
.. versionchanged:: 2.10
265+
Returns a :class:`Guild` object when the guild could not be resolved from cache.
266+
This object is created from the data provided by Discord, but it is not complete.
267+
The only populated attributes are:
268+
- :attr:`Guild.id`
269+
- :attr:`Guild.locale`
270+
- :attr:`Guild.features`
271+
"""
272+
if self.guild_id is None:
273+
return None
274+
275+
return self._state._get_guild(self.guild_id) or Guild(data=self._guild, state=self._state)
268276

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

0 commit comments

Comments
 (0)