Source code for voltage.member

from __future__ import annotations

from typing import TYPE_CHECKING, Any, Optional, Union

from .asset import Asset
from .permissions import Permissions

# Internal imports
from .user import User

if TYPE_CHECKING:
    from .internals import CacheHandler
    from .roles import Role
    from .server import Server
    from .types import MemberPayload, OnServerMemberUpdatePayload, OverrideFieldPayload


def make_member_dot_zip(
    member: Member, user: User
):  # very excellanto functiono it take memberru object and it users objecto and give it all atrr like naem, avartar and sow on.
    for i in user.__slots__:
        setattr(member, i, getattr(user, i))


[docs]class Member(User): """ A class that represents a Voltage server member. This class is a subclass of :class:`User` and inherits all of its attributes. Attributes ---------- server: :class:`Server` The server that the member belongs to. nickname: Optional[:class:`str`] The member's nickname. server_avatar: Optional[:class:`Asset`] The member's avatar. roles: List[:class:`Role`] The member's roles. permissions: :class:`Permissions` The member's permissions. """ __slots__ = ("nickname", "server_avatar", "roles", "server", "permissions") def __init__(self, data: MemberPayload, server: Server, cache: CacheHandler): user = cache.get_user(data["_id"]["user"]) make_member_dot_zip(self, user) self.nickname = data.get("nickname") if av := data.get("avatar"): self.server_avatar: Optional[Asset] = Asset(av, cache.http) else: self.server_avatar = None roles = [] for i in data.get("roles", []): role = server.get_role(i) if role: roles.append(role) self.roles: list[Role] = sorted(roles, key=lambda r: r.rank, reverse=True) self.permissions: Permissions self._caclulate_perms() self.server = server def __repr__(self): return f"<Member {self.name}#{self.discriminator}>" @property def display_name(self): """ Returns the member's display name. This is the member's masquerade name or nickname if they have one, otherwise their username. """ return self.masquerade_name or self.nickname or self.name @property def display_avatar(self): """ Returns the member's display avatar. This is the member's masquerade avatar or their server's avatar if they have one, otherwise their avatar. """ return self.masquerade_avatar or self.server_avatar or self.avatar or self.default_avatar
[docs] async def kick(self): """ A method that kicks the member from the server. """ await self.cache.http.kick_member(self.server.id, self.id)
[docs] async def ban(self, reason: Optional[str] = None): """ A method that bans the member from the server. Parameters ---------- reason: Optional[:class:`str`] The reason for banning the member. """ await self.cache.http.ban_member(self.server.id, self.id, reason=reason)
[docs] async def unban(self): """ A method that unbans the member from the server. """ await self.cache.http.unban_member(self.server.id, self.id)
[docs] async def add_roles(self, *roles: Role): """ A method that adds roles to the member. Parameters ---------- *roles: :class:`Role` The roles to add to the member. """ await self.cache.http.edit_member( self.server.id, self.id, roles=[r.id for r in roles] + [r.id for r in self.roles], )
[docs] async def set_nickname(self, nickname: Optional[str]): """ A method that sets the member's nickname. Parameters ---------- nickname: Optional[:class:`str`] The nickname to set. """ if nickname: return await self.cache.http.edit_member(self.server.id, self.id, nickname=nickname) await self.cache.http.edit_member(self.server.id, self.id, remove="Nickname")
[docs] async def remove_avatar(self): """ A method that removes the member's avatar. """ await self.cache.http.edit_member(self.server.id, self.id, remove="Avatar")
def _caclulate_perms(self): perms: OverrideFieldPayload = {"a": 0, "d": 0} for role in self.roles: perms["a"] |= role.permissions.allow.flags perms["d"] |= role.permissions.deny.flags self.permissions = Permissions(perms) def _update(self, data: Union[Any, OnServerMemberUpdatePayload]): # god bless mypy if clear := data.get("clear"): if clear == "Nickname": self.nickname = None elif clear == "Avatar": self.server_avatar = None if new := data.get("data"): if new.get("nickname"): self.nickname = new["nickname"] if new.get("avatar"): self.server_avatar = Asset(new["avatar"], self.cache.http) if new.get("roles"): roles = [] for i in new["roles"]: role = self.server.get_role(i) if role: roles.append(role) self.roles = sorted(roles, key=lambda r: r.rank, reverse=True) self._caclulate_perms()