diff --git a/disagreement/event_dispatcher.py b/disagreement/event_dispatcher.py index 33c5d99..e376dac 100644 --- a/disagreement/event_dispatcher.py +++ b/disagreement/event_dispatcher.py @@ -61,6 +61,11 @@ class EventDispatcher: "GUILD_ROLE_UPDATE": self._parse_guild_role_update, "TYPING_START": self._parse_typing_start, "VOICE_STATE_UPDATE": self._parse_voice_state_update, + "THREAD_CREATE": self._parse_thread_create, + "THREAD_UPDATE": self._parse_thread_update, + "THREAD_DELETE": self._parse_thread_delete, + "INVITE_CREATE": self._parse_invite_create, + "INVITE_DELETE": self._parse_invite_delete, } def _parse_message_create(self, data: Dict[str, Any]) -> Message: @@ -165,6 +170,43 @@ class EventDispatcher: return GuildRoleUpdate(data, client_instance=self._client) + def _parse_thread_create(self, data: Dict[str, Any]): + """Parses THREAD_CREATE into a Thread object and updates caches.""" + + return self._client.parse_channel(data) + + def _parse_thread_update(self, data: Dict[str, Any]): + """Parses THREAD_UPDATE into a Thread object.""" + + return self._client.parse_channel(data) + + def _parse_thread_delete(self, data: Dict[str, Any]): + """Parses THREAD_DELETE, removing the thread from caches.""" + + thread = self._client.parse_channel(data) + thread_id = data.get("id") + if thread_id: + self._client._channels.invalidate(thread_id) + guild_id = data.get("guild_id") + if guild_id: + guild = self._client._guilds.get(guild_id) + if guild: + guild._channels.invalidate(thread_id) + guild._threads.pop(thread_id, None) + return thread + + def _parse_invite_create(self, data: Dict[str, Any]): + """Parses INVITE_CREATE into an Invite object.""" + + return self._client.parse_invite(data) + + def _parse_invite_delete(self, data: Dict[str, Any]): + """Parses INVITE_DELETE into an InviteDelete model.""" + + from .models import InviteDelete + + return InviteDelete(data) + # Potentially add _parse_user for events that directly provide a full user object # def _parse_user_update(self, data: Dict[str, Any]) -> User: # return User(data=data) diff --git a/disagreement/models.py b/disagreement/models.py index a38cbcb..5ac3e4a 100644 --- a/disagreement/models.py +++ b/disagreement/models.py @@ -2640,6 +2640,18 @@ class Invite: return f"" +class InviteDelete: + """Represents an INVITE_DELETE event.""" + + def __init__(self, data: Dict[str, Any]): + self.channel_id: str = data["channel_id"] + self.guild_id: Optional[str] = data.get("guild_id") + self.code: str = data["code"] + + def __repr__(self) -> str: + return f"" + + class GuildMemberRemove: """Represents a GUILD_MEMBER_REMOVE event."""