Add member and ban events (#20)

This commit is contained in:
Slipstream 2025-06-10 15:44:45 -06:00 committed by GitHub
parent f9a7895ecb
commit 15f969c7e6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 168 additions and 0 deletions

View File

@ -54,7 +54,13 @@ class EventDispatcher:
"INTERACTION_CREATE": self._parse_interaction_create,
"GUILD_CREATE": self._parse_guild_create,
"CHANNEL_CREATE": self._parse_channel_create,
"CHANNEL_UPDATE": self._parse_channel_update,
"PRESENCE_UPDATE": self._parse_presence_update,
"GUILD_MEMBER_ADD": self._parse_guild_member_add,
"GUILD_MEMBER_REMOVE": self._parse_guild_member_remove,
"GUILD_BAN_ADD": self._parse_guild_ban_add,
"GUILD_BAN_REMOVE": self._parse_guild_ban_remove,
"GUILD_ROLE_UPDATE": self._parse_guild_role_update,
"TYPING_START": self._parse_typing_start,
}
@ -110,6 +116,45 @@ class EventDispatcher:
return Reaction(data, client_instance=self._client)
def _parse_guild_member_add(self, data: Dict[str, Any]):
"""Parses GUILD_MEMBER_ADD into a Member object."""
guild_id = str(data.get("guild_id"))
return self._client.parse_member(data, guild_id)
def _parse_guild_member_remove(self, data: Dict[str, Any]):
"""Parses GUILD_MEMBER_REMOVE into a GuildMemberRemove model."""
from .models import GuildMemberRemove
return GuildMemberRemove(data, client_instance=self._client)
def _parse_guild_ban_add(self, data: Dict[str, Any]):
"""Parses GUILD_BAN_ADD into a GuildBanAdd model."""
from .models import GuildBanAdd
return GuildBanAdd(data, client_instance=self._client)
def _parse_guild_ban_remove(self, data: Dict[str, Any]):
"""Parses GUILD_BAN_REMOVE into a GuildBanRemove model."""
from .models import GuildBanRemove
return GuildBanRemove(data, client_instance=self._client)
def _parse_channel_update(self, data: Dict[str, Any]):
"""Parses CHANNEL_UPDATE into a Channel object."""
return self._client.parse_channel(data)
def _parse_guild_role_update(self, data: Dict[str, Any]):
"""Parses GUILD_ROLE_UPDATE into a GuildRoleUpdate model."""
from .models import GuildRoleUpdate
return GuildRoleUpdate(data, client_instance=self._client)
# 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)

View File

@ -1734,6 +1734,64 @@ class Reaction:
return f"<Reaction message_id='{self.message_id}' user_id='{self.user_id}' emoji='{emoji_value}'>"
class GuildMemberRemove:
"""Represents a GUILD_MEMBER_REMOVE event."""
def __init__(
self, data: Dict[str, Any], client_instance: Optional["Client"] = None
):
self._client = client_instance
self.guild_id: str = data["guild_id"]
self.user: User = User(data["user"])
def __repr__(self) -> str:
return (
f"<GuildMemberRemove guild_id='{self.guild_id}' user_id='{self.user.id}'>"
)
class GuildBanAdd:
"""Represents a GUILD_BAN_ADD event."""
def __init__(
self, data: Dict[str, Any], client_instance: Optional["Client"] = None
):
self._client = client_instance
self.guild_id: str = data["guild_id"]
self.user: User = User(data["user"])
def __repr__(self) -> str:
return f"<GuildBanAdd guild_id='{self.guild_id}' user_id='{self.user.id}'>"
class GuildBanRemove:
"""Represents a GUILD_BAN_REMOVE event."""
def __init__(
self, data: Dict[str, Any], client_instance: Optional["Client"] = None
):
self._client = client_instance
self.guild_id: str = data["guild_id"]
self.user: User = User(data["user"])
def __repr__(self) -> str:
return f"<GuildBanRemove guild_id='{self.guild_id}' user_id='{self.user.id}'>"
class GuildRoleUpdate:
"""Represents a GUILD_ROLE_UPDATE event."""
def __init__(
self, data: Dict[str, Any], client_instance: Optional["Client"] = None
):
self._client = client_instance
self.guild_id: str = data["guild_id"]
self.role: Role = Role(data["role"])
def __repr__(self) -> str:
return f"<GuildRoleUpdate guild_id='{self.guild_id}' role_id='{self.role.id}'>"
def channel_factory(data: Dict[str, Any], client: "Client") -> Channel:
"""Create a channel object from raw API data."""
channel_type = data.get("type")

View File

@ -23,3 +23,68 @@ Dispatched when a user begins typing in a channel. The callback receives a `Typi
async def on_typing_start(typing: disagreement.TypingStart):
...
```
## GUILD_MEMBER_ADD
Fired when a new member joins a guild. The callback receives a `Member` model.
```python
@client.event
async def on_guild_member_add(member: disagreement.Member):
...
```
## GUILD_MEMBER_REMOVE
Triggered when a member leaves or is removed from a guild. The callback
receives a `GuildMemberRemove` model.
```python
@client.event
async def on_guild_member_remove(event: disagreement.GuildMemberRemove):
...
```
## GUILD_BAN_ADD
Dispatched when a user is banned from a guild. The callback receives a
`GuildBanAdd` model.
```python
@client.event
async def on_guild_ban_add(event: disagreement.GuildBanAdd):
...
```
## GUILD_BAN_REMOVE
Dispatched when a user's ban is lifted. The callback receives a
`GuildBanRemove` model.
```python
@client.event
async def on_guild_ban_remove(event: disagreement.GuildBanRemove):
...
```
## CHANNEL_UPDATE
Sent when a channel's settings change. The callback receives an updated
`Channel` model.
```python
@client.event
async def on_channel_update(channel: disagreement.Channel):
...
```
## GUILD_ROLE_UPDATE
Emitted when a guild role is updated. The callback receives a
`GuildRoleUpdate` model.
```python
@client.event
async def on_guild_role_update(event: disagreement.GuildRoleUpdate):
...
```