diff --git a/interactions/api/events/processors/scheduled_events.py b/interactions/api/events/processors/scheduled_events.py index 4993c1ca2..afc46aa8d 100644 --- a/interactions/api/events/processors/scheduled_events.py +++ b/interactions/api/events/processors/scheduled_events.py @@ -37,14 +37,16 @@ async def _on_raw_guild_scheduled_event_delete(self, event: "RawGatewayEvent") - @Processor.define() async def _on_raw_guild_scheduled_event_user_add(self, event: "RawGatewayEvent") -> None: - scheduled_event = self.cache.get_scheduled_event(event.data.get("guild_scheduled_event_id")) - user = self.cache.get_user(event.data.get("user_id")) - - self.dispatch(events.GuildScheduledEventUserAdd(event.data.get("guild_id"), scheduled_event, user)) + self.dispatch( + events.GuildScheduledEventUserAdd( + event.data["guild_id"], event.data["guild_scheduled_event_id"], event.data["user_id"] + ) + ) @Processor.define() async def _on_raw_guild_scheduled_event_user_remove(self, event: "RawGatewayEvent") -> None: - scheduled_event = self.cache.get_scheduled_event(event.data.get("guild_scheduled_event_id")) - user = self.cache.get_user(event.data.get("user_id")) - - self.dispatch(events.GuildScheduledEventUserRemove(event.data.get("guild_id"), scheduled_event, user)) + self.dispatch( + events.GuildScheduledEventUserRemove( + event.data["guild_id"], event.data["guild_scheduled_event_id"], event.data["user_id"] + ) + ) diff --git a/interactions/api/http/http_requests/scheduled_events.py b/interactions/api/http/http_requests/scheduled_events.py index 7649ca220..abee75bfa 100644 --- a/interactions/api/http/http_requests/scheduled_events.py +++ b/interactions/api/http/http_requests/scheduled_events.py @@ -58,11 +58,11 @@ async def get_scheduled_event( return await self.request( Route( "GET", - "/guilds/{guild_id}/scheduled-events/{scheduled_event_id}", + "/guilds/{guild_id}/scheduled-events/{scheduled_event_id}?with_user_count={with_user_count}", guild_id=guild_id, scheduled_event_id=scheduled_event_id, + with_user_count=with_user_count, ), - params={"with_user_count": with_user_count}, ) async def create_scheduled_event( diff --git a/interactions/client/smart_cache.py b/interactions/client/smart_cache.py index 575f69741..799ae619d 100644 --- a/interactions/client/smart_cache.py +++ b/interactions/client/smart_cache.py @@ -924,6 +924,38 @@ def get_scheduled_event(self, scheduled_event_id: "Snowflake_Type") -> Optional[ """ return self.scheduled_events_cache.get(to_snowflake(scheduled_event_id)) + async def fetch_scheduled_event( + self, + guild_id: "Snowflake_Type", + scheduled_event_id: "Snowflake_Type", + with_user_count: bool = False, + *, + force: bool = False, + ) -> "ScheduledEvent": + """ + Fetch a scheduled event based on the guild and its own ID. + + Args: + guild_id: The ID of the guild this event belongs to + scheduled_event_id: The ID of the event + with_user_count: Whether to include the user count in the response. + force: If the cache should be ignored, and the event should be fetched from the API + + Returns: + The scheduled event if found + """ + if not force: + if scheduled_event := self.get_scheduled_event(scheduled_event_id): + if int(scheduled_event._guild_id) == int(guild_id) and ( + not with_user_count or scheduled_event.user_count is not MISSING + ): + return scheduled_event + + scheduled_event_data = await self._client.http.get_scheduled_event( + guild_id, scheduled_event_id, with_user_count=with_user_count + ) + return self.place_scheduled_event_data(scheduled_event_data) + def place_scheduled_event_data(self, data: discord_typings.GuildScheduledEventData) -> "ScheduledEvent": """ Take json data representing a scheduled event, process it, and cache it. diff --git a/interactions/models/discord/guild.py b/interactions/models/discord/guild.py index 5551f2bf7..3b2e780be 100644 --- a/interactions/models/discord/guild.py +++ b/interactions/models/discord/guild.py @@ -1259,27 +1259,45 @@ async def list_scheduled_events(self, with_user_count: bool = False) -> List["mo scheduled_events_data = await self._client.http.list_schedules_events(self.id, with_user_count) return [self._client.cache.place_scheduled_event_data(data) for data in scheduled_events_data] + def get_scheduled_event(self, scheduled_event_id: Snowflake_Type) -> Optional["models.ScheduledEvent"]: + """ + Gets a scheduled event from the cache by id. + + Args: + scheduled_event_id: The id of the scheduled event. + + Returns: + The scheduled event. If the event does not exist, returns None. + + """ + event = self._client.cache.get_scheduled_event(scheduled_event_id) + return None if event and int(event._guild_id) != self.id else event + async def fetch_scheduled_event( - self, scheduled_event_id: Snowflake_Type, with_user_count: bool = False + self, + scheduled_event_id: Snowflake_Type, + with_user_count: bool = False, + *, + force: bool = False, ) -> Optional["models.ScheduledEvent"]: """ - Get a scheduled event by id. + Fetches a scheduled event by id. Args: scheduled_event_id: The id of the scheduled event. with_user_count: Whether to include the user count in the response. + force: If the cache should be ignored, and the event should be fetched from the API Returns: The scheduled event. If the event does not exist, returns None. """ try: - scheduled_event_data = await self._client.http.get_scheduled_event( - self.id, scheduled_event_id, with_user_count + return await self._client.cache.fetch_scheduled_event( + self.id, scheduled_event_id, with_user_count=with_user_count, force=force ) except NotFound: return None - return self._client.cache.place_scheduled_event_data(scheduled_event_data) async def create_scheduled_event( self, diff --git a/interactions/models/discord/scheduled_event.py b/interactions/models/discord/scheduled_event.py index a958ce4f5..2f2837299 100644 --- a/interactions/models/discord/scheduled_event.py +++ b/interactions/models/discord/scheduled_event.py @@ -49,7 +49,7 @@ class ScheduledEvent(DiscordObject): """The id of an entity associated with a guild scheduled event""" entity_metadata: Optional[Dict[str, Any]] = attrs.field(repr=False, default=MISSING) # TODO make this """The metadata associated with the entity_type""" - user_count: int = attrs.field(repr=False, default=MISSING) + user_count: Absent[int] = attrs.field(repr=False, default=MISSING) # TODO make this optional and None in 6.0 """Amount of users subscribed to the scheduled event""" cover: Asset | None = attrs.field(repr=False, default=None) """The cover image of this event"""