mirror of
https://github.com/stoatchat/python-client-sdk.git
synced 2026-07-01 20:44:04 -04:00
234 lines
5.3 KiB
Python
Executable File
234 lines
5.3 KiB
Python
Executable File
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING, Any, Optional
|
|
|
|
from typing_extensions import Self
|
|
|
|
from .flags import Flag, Flags
|
|
from .types.permissions import Overwrite
|
|
|
|
__all__ = ("Permissions", "PermissionsOverwrite", "UserPermissions")
|
|
|
|
class UserPermissions(Flags):
|
|
"""Permissions for users"""
|
|
|
|
@Flag
|
|
def access() -> int:
|
|
return 1 << 0
|
|
|
|
@Flag
|
|
def view_profile() -> int:
|
|
return 1 << 1
|
|
|
|
@Flag
|
|
def send_message() -> int:
|
|
return 1 << 2
|
|
|
|
@Flag
|
|
def invite() -> int:
|
|
return 1 << 3
|
|
|
|
@classmethod
|
|
def all(cls) -> Self:
|
|
return cls(access=True, view_profile=True, send_message=True, invite=True)
|
|
|
|
class Permissions(Flags):
|
|
"""Server permissions for members and roles"""
|
|
|
|
@Flag
|
|
def manage_channel() -> int:
|
|
return 1 << 0
|
|
|
|
@Flag
|
|
def manage_server() -> int:
|
|
return 1 << 1
|
|
|
|
@Flag
|
|
def manage_permissions() -> int:
|
|
return 1 << 2
|
|
|
|
@Flag
|
|
def manage_role() -> int:
|
|
return 1 << 3
|
|
|
|
@Flag
|
|
def kick_members() -> int:
|
|
return 1 << 6
|
|
|
|
@Flag
|
|
def ban_members() -> int:
|
|
return 1 << 7
|
|
|
|
@Flag
|
|
def timeout_members() -> int:
|
|
return 1 << 8
|
|
|
|
@Flag
|
|
def asign_roles() -> int:
|
|
return 1 << 9
|
|
|
|
@Flag
|
|
def change_nickname() -> int:
|
|
return 1 << 10
|
|
|
|
@Flag
|
|
def manage_nicknames() -> int:
|
|
return 1 << 11
|
|
|
|
@Flag
|
|
def change_avatars() -> int:
|
|
return 1 << 12
|
|
|
|
@Flag
|
|
def remove_avatars() -> int:
|
|
return 1 << 13
|
|
|
|
@Flag
|
|
def view_channel() -> int:
|
|
return 1 << 20
|
|
|
|
@Flag
|
|
def read_message_history() -> int:
|
|
return 1 << 21
|
|
|
|
@Flag
|
|
def send_messages() -> int:
|
|
return 1 << 22
|
|
|
|
@Flag
|
|
def manage_messages() -> int:
|
|
return 1 << 23
|
|
|
|
@Flag
|
|
def manage_webhooks() -> int:
|
|
return 1 << 24
|
|
|
|
@Flag
|
|
def invite_others() -> int:
|
|
return 1 << 25
|
|
|
|
@Flag
|
|
def send_embeds() -> int:
|
|
return 1 << 26
|
|
|
|
@Flag
|
|
def upload_files() -> int:
|
|
return 1 << 27
|
|
|
|
@Flag
|
|
def masquerade() -> int:
|
|
return 1 << 28
|
|
|
|
@Flag
|
|
def connect() -> int:
|
|
return 1 << 30
|
|
|
|
@Flag
|
|
def speak() -> int:
|
|
return 1 << 31
|
|
|
|
@Flag
|
|
def video() -> int:
|
|
return 1 << 32
|
|
|
|
@Flag
|
|
def mute_members() -> int:
|
|
return 1 << 33
|
|
|
|
@Flag
|
|
def deafen_members() -> int:
|
|
return 1 << 34
|
|
|
|
@Flag
|
|
def move_members() -> int:
|
|
return 1 << 35
|
|
|
|
@classmethod
|
|
def all(cls) -> Self:
|
|
return cls(0x000F_FFFF_FFFF_FFFF)
|
|
|
|
@classmethod
|
|
def default_view_only(cls) -> Self:
|
|
return cls(view_channel=True, read_message_history=True)
|
|
|
|
@classmethod
|
|
def default(cls) -> Self:
|
|
return cls.default_view_only() | cls(send_messages=True, invite_others=True, send_embeds=True, upload_files=True, connect=True, speak=True)
|
|
|
|
@classmethod
|
|
def default_direct_message(cls) -> Self:
|
|
return cls.default_view_only() | cls(react=True, manage_channel=True)
|
|
|
|
class PermissionsOverwrite:
|
|
"""A permissions overwrite in a channel"""
|
|
|
|
def __init__(self, allow: Permissions, deny: Permissions):
|
|
self._allow = allow
|
|
self._deny = deny
|
|
|
|
for perm in Permissions.FLAG_NAMES:
|
|
if getattr(allow, perm):
|
|
value = True
|
|
elif getattr(deny, perm):
|
|
value = False
|
|
else:
|
|
value = None
|
|
|
|
super().__setattr__(perm, value)
|
|
|
|
def __setattr__(self, key: str, value: Any) -> None:
|
|
if key in Permissions.FLAG_NAMES:
|
|
if key is True:
|
|
setattr(self._allow, key, True)
|
|
super().__setattr__(key, True)
|
|
|
|
elif key is False:
|
|
setattr(self._deny, key, True)
|
|
super().__setattr__(key, False)
|
|
|
|
else:
|
|
setattr(self._allow, key, False)
|
|
setattr(self._deny, key, False)
|
|
super().__setattr__(key, None)
|
|
else:
|
|
super().__setattr__(key, value)
|
|
|
|
if TYPE_CHECKING:
|
|
manage_channel: Optional[bool]
|
|
manage_server: Optional[bool]
|
|
manage_permissions: Optional[bool]
|
|
manage_role: Optional[bool]
|
|
kick_members: Optional[bool]
|
|
ban_members: Optional[bool]
|
|
timeout_members: Optional[bool]
|
|
asign_roles: Optional[bool]
|
|
change_nickname: Optional[bool]
|
|
manage_nicknames: Optional[bool]
|
|
change_avatars: Optional[bool]
|
|
remove_avatars: Optional[bool]
|
|
view_channel: Optional[bool]
|
|
read_message_history: Optional[bool]
|
|
send_messages: Optional[bool]
|
|
manage_messages: Optional[bool]
|
|
manage_webhooks: Optional[bool]
|
|
invite_others: Optional[bool]
|
|
send_embeds: Optional[bool]
|
|
upload_files: Optional[bool]
|
|
masquerade: Optional[bool]
|
|
connect: Optional[bool]
|
|
speak: Optional[bool]
|
|
video: Optional[bool]
|
|
mute_members: Optional[bool]
|
|
deafen_members: Optional[bool]
|
|
move_members: Optional[bool]
|
|
|
|
def to_pair(self) -> tuple[Permissions, Permissions]:
|
|
return self._allow, self._deny
|
|
|
|
@classmethod
|
|
def _from_overwrite(cls, overwrite: Overwrite) -> Self:
|
|
allow = Permissions(overwrite["a"])
|
|
deny = Permissions(overwrite["d"])
|
|
|
|
return cls(allow, deny)
|