Skip to content

feat/fix💥: adjust and fix various issues with scheduled events #1547

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions interactions/api/events/processors/scheduled_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
)
)
4 changes: 2 additions & 2 deletions interactions/api/http/http_requests/scheduled_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
32 changes: 32 additions & 0 deletions interactions/client/smart_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
28 changes: 23 additions & 5 deletions interactions/models/discord/guild.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion interactions/models/discord/scheduled_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""
Expand Down