from typing import TYPE_CHECKING, Any, Dict, List, Optional
from .asset import Asset
from .permission import Permission
from .role import PartialRole
from .user import User
if TYPE_CHECKING:
from .client import Client
[docs]class Member(User):
"""
Represents a member of a guild, subclassed from :class:`User`.
"""
def __init__(self, client: "Client", data: Dict[str, Any]):
super().__init__(client, data)
@property
def guild_id(self) -> str:
return self.data["guild_id"]
@property
def nick(self) -> str:
return self.data.get("nick") or self.name
@property
def roles(self) -> List[PartialRole]:
ids = self.data.get("roles")
return [PartialRole(self.client, {"id": i, "guild_id": self.guild_id}) for i in ids]
@property
def joined_at(self) -> str:
return self.data["joined_at"]
@property
def premium_since(self) -> Optional[str]:
return self.data.get("premium_since")
@property
def permissions(self) -> int:
return int(self.data.get("permissions", "0"))
@property
def pending(self) -> bool:
return self.data.get("pending", False)
@property
def disabled_until(self) -> Optional[str]:
return self.data.get("communication_disabled_until")
@property
def flags(self) -> int:
return self.data["flags"]
@property
def avatar(self) -> Asset:
av_hash = self.data.get("avatar")
if not av_hash:
return super().avatar
return Asset(hash=av_hash, fragment=f"avatars/{self.id}")
@property
def mention(self) -> str:
"""
Returns a string that allows you to mention the member.
"""
return f"<@!{self.id}>"
def has_permission(self, permission: Permission) -> bool:
return Permission.check(self.permissions, permission)
[docs] async def add_role(self, role_id: str):
"""
Add a role to the member.
Parameters
----------
role_id : str
The ID of the role.
"""
return await self.client.http.add_role(self.guild_id, self.id, role_id)
[docs] async def remove_role(self, role_id: str):
"""
Remove a role from the member.
Parameters
----------
role_id : str
The ID of the role.
"""
return await self.client.http.remove_role(self.guild_id, self.id, role_id)
[docs] async def kick(self):
"""
Kick the member.
"""
return await self.client.http.kick_user(self.guild_id, self.id)
[docs] async def ban(self, *, delete_message_seconds: int = 0):
"""
Ban the member.
Parameters
----------
delete_message_seconds: int
The number of days to delete messages for.
"""
if delete_message_seconds > 604800:
raise ValueError("You can only delete messages for up to last 7 days.")
return await self.client.http.ban_user(self.guild_id, self.id, delete_message_seconds)