Skip to content

Commit 633da19

Browse files
authored
fix: adjust and fix various issues with scheduled events (#1547)
1 parent d29a03f commit 633da19

File tree

5 files changed

+68
-16
lines changed

5 files changed

+68
-16
lines changed

interactions/api/events/processors/scheduled_events.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,16 @@ async def _on_raw_guild_scheduled_event_delete(self, event: "RawGatewayEvent") -
3737

3838
@Processor.define()
3939
async def _on_raw_guild_scheduled_event_user_add(self, event: "RawGatewayEvent") -> None:
40-
scheduled_event = self.cache.get_scheduled_event(event.data.get("guild_scheduled_event_id"))
41-
user = self.cache.get_user(event.data.get("user_id"))
42-
43-
self.dispatch(events.GuildScheduledEventUserAdd(event.data.get("guild_id"), scheduled_event, user))
40+
self.dispatch(
41+
events.GuildScheduledEventUserAdd(
42+
event.data["guild_id"], event.data["guild_scheduled_event_id"], event.data["user_id"]
43+
)
44+
)
4445

4546
@Processor.define()
4647
async def _on_raw_guild_scheduled_event_user_remove(self, event: "RawGatewayEvent") -> None:
47-
scheduled_event = self.cache.get_scheduled_event(event.data.get("guild_scheduled_event_id"))
48-
user = self.cache.get_user(event.data.get("user_id"))
49-
50-
self.dispatch(events.GuildScheduledEventUserRemove(event.data.get("guild_id"), scheduled_event, user))
48+
self.dispatch(
49+
events.GuildScheduledEventUserRemove(
50+
event.data["guild_id"], event.data["guild_scheduled_event_id"], event.data["user_id"]
51+
)
52+
)

interactions/api/http/http_requests/scheduled_events.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ async def get_scheduled_event(
5858
return await self.request(
5959
Route(
6060
"GET",
61-
"/guilds/{guild_id}/scheduled-events/{scheduled_event_id}",
61+
"/guilds/{guild_id}/scheduled-events/{scheduled_event_id}?with_user_count={with_user_count}",
6262
guild_id=guild_id,
6363
scheduled_event_id=scheduled_event_id,
64+
with_user_count=with_user_count,
6465
),
65-
params={"with_user_count": with_user_count},
6666
)
6767

6868
async def create_scheduled_event(

interactions/client/smart_cache.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,38 @@ def get_scheduled_event(self, scheduled_event_id: "Snowflake_Type") -> Optional[
924924
"""
925925
return self.scheduled_events_cache.get(to_snowflake(scheduled_event_id))
926926

927+
async def fetch_scheduled_event(
928+
self,
929+
guild_id: "Snowflake_Type",
930+
scheduled_event_id: "Snowflake_Type",
931+
with_user_count: bool = False,
932+
*,
933+
force: bool = False,
934+
) -> "ScheduledEvent":
935+
"""
936+
Fetch a scheduled event based on the guild and its own ID.
937+
938+
Args:
939+
guild_id: The ID of the guild this event belongs to
940+
scheduled_event_id: The ID of the event
941+
with_user_count: Whether to include the user count in the response.
942+
force: If the cache should be ignored, and the event should be fetched from the API
943+
944+
Returns:
945+
The scheduled event if found
946+
"""
947+
if not force:
948+
if scheduled_event := self.get_scheduled_event(scheduled_event_id):
949+
if int(scheduled_event._guild_id) == int(guild_id) and (
950+
not with_user_count or scheduled_event.user_count is not MISSING
951+
):
952+
return scheduled_event
953+
954+
scheduled_event_data = await self._client.http.get_scheduled_event(
955+
guild_id, scheduled_event_id, with_user_count=with_user_count
956+
)
957+
return self.place_scheduled_event_data(scheduled_event_data)
958+
927959
def place_scheduled_event_data(self, data: discord_typings.GuildScheduledEventData) -> "ScheduledEvent":
928960
"""
929961
Take json data representing a scheduled event, process it, and cache it.

interactions/models/discord/guild.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,27 +1259,45 @@ async def list_scheduled_events(self, with_user_count: bool = False) -> List["mo
12591259
scheduled_events_data = await self._client.http.list_schedules_events(self.id, with_user_count)
12601260
return [self._client.cache.place_scheduled_event_data(data) for data in scheduled_events_data]
12611261

1262+
def get_scheduled_event(self, scheduled_event_id: Snowflake_Type) -> Optional["models.ScheduledEvent"]:
1263+
"""
1264+
Gets a scheduled event from the cache by id.
1265+
1266+
Args:
1267+
scheduled_event_id: The id of the scheduled event.
1268+
1269+
Returns:
1270+
The scheduled event. If the event does not exist, returns None.
1271+
1272+
"""
1273+
event = self._client.cache.get_scheduled_event(scheduled_event_id)
1274+
return None if event and int(event._guild_id) != self.id else event
1275+
12621276
async def fetch_scheduled_event(
1263-
self, scheduled_event_id: Snowflake_Type, with_user_count: bool = False
1277+
self,
1278+
scheduled_event_id: Snowflake_Type,
1279+
with_user_count: bool = False,
1280+
*,
1281+
force: bool = False,
12641282
) -> Optional["models.ScheduledEvent"]:
12651283
"""
1266-
Get a scheduled event by id.
1284+
Fetches a scheduled event by id.
12671285
12681286
Args:
12691287
scheduled_event_id: The id of the scheduled event.
12701288
with_user_count: Whether to include the user count in the response.
1289+
force: If the cache should be ignored, and the event should be fetched from the API
12711290
12721291
Returns:
12731292
The scheduled event. If the event does not exist, returns None.
12741293
12751294
"""
12761295
try:
1277-
scheduled_event_data = await self._client.http.get_scheduled_event(
1278-
self.id, scheduled_event_id, with_user_count
1296+
return await self._client.cache.fetch_scheduled_event(
1297+
self.id, scheduled_event_id, with_user_count=with_user_count, force=force
12791298
)
12801299
except NotFound:
12811300
return None
1282-
return self._client.cache.place_scheduled_event_data(scheduled_event_data)
12831301

12841302
async def create_scheduled_event(
12851303
self,

interactions/models/discord/scheduled_event.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class ScheduledEvent(DiscordObject):
4949
"""The id of an entity associated with a guild scheduled event"""
5050
entity_metadata: Optional[Dict[str, Any]] = attrs.field(repr=False, default=MISSING) # TODO make this
5151
"""The metadata associated with the entity_type"""
52-
user_count: int = attrs.field(repr=False, default=MISSING)
52+
user_count: Absent[int] = attrs.field(repr=False, default=MISSING) # TODO make this optional and None in 6.0
5353
"""Amount of users subscribed to the scheduled event"""
5454
cover: Asset | None = attrs.field(repr=False, default=None)
5555
"""The cover image of this event"""

0 commit comments

Comments
 (0)