diff --git a/melisa/models/guild/__init__.py b/melisa/models/guild/__init__.py index 65c0d65..d747789 100644 --- a/melisa/models/guild/__init__.py +++ b/melisa/models/guild/__init__.py @@ -5,3 +5,5 @@ from .guild import * from .channel import * from .thread import * from .webhook import * +from .emoji import * +from .role import * diff --git a/melisa/models/guild/emoji.py b/melisa/models/guild/emoji.py new file mode 100644 index 0000000..b49debb --- /dev/null +++ b/melisa/models/guild/emoji.py @@ -0,0 +1,72 @@ +# Copyright MelisaDev 2022 - Present +# Full MIT License can be found in `LICENSE.txt` at the project root. + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING, Dict + +from ...utils import Snowflake +from ...utils.api_model import APIModelBase +from ...utils.types import APINullable, UNDEFINED + +if TYPE_CHECKING: + from ..user.user import User + from .role import Role + + +@dataclass(repr=False) +class Emoji(APIModelBase): + """Emoji Structure + + Attributes + ---------- + id: :class:`~melisa.utils.types.Snowflake` + Emoji id + name: :class:`str` + Emoji name + roles: :class:`Any` + Roles allowed to use this emoji + user: :class:`Any` + User that created this emoji + require_colons: :class:`bool` + Whether this emoji must be wrapped in colons + managed: :class:`bool` + Whether this emoji is managed + animated: :class:`bool` + Whether this emoji is animated + available: :class:`bool` + Whether this emoji can be used, may be false due to loss of Server Boosts + """ + + id: APINullable[Snowflake] = UNDEFINED + name: APINullable[str] = UNDEFINED + roles: APINullable[Role] = UNDEFINED + user: APINullable[User] = UNDEFINED + require_colons: APINullable[bool] = UNDEFINED + managed: APINullable[bool] = UNDEFINED + animated: APINullable[bool] = UNDEFINED + available: APINullable[bool] = UNDEFINED + + @classmethod + def from_dict(cls, data: Dict[str, any]) -> Emoji: + """Generate an emoji from the given data. + + Parameters + ---------- + data: :class:`dict` + The dictionary to convert into an emoji. + """ + + self: Emoji = super().__new__(cls) + + self.id = int(data["id"]) + self.name = data.get("name") + self.roles = data.get("roles") + self.user = data.get("user", {}) + self.require_colons = data.get("require_colons", False) + self.managed = data.get("managed", False) + self.animated = data.get("animated", False) + self.available = data.get("available", False) + + return self diff --git a/melisa/models/guild/role.py b/melisa/models/guild/role.py new file mode 100644 index 0000000..70e97b9 --- /dev/null +++ b/melisa/models/guild/role.py @@ -0,0 +1,76 @@ +# Copyright MelisaDev 2022 - Present +# Full MIT License can be found in `LICENSE.txt` at the project root. + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING, Dict + +from ...utils import Snowflake +from ...utils.api_model import APIModelBase +from ...utils.types import APINullable, UNDEFINED + + +@dataclass(repr=False) +class Role(APIModelBase): + """Roles represent a set of permissions attached to a group of users. + + Attributes + ---------- + id: :class:`~melisa.utils.types.Snowflake` + Role id + name: :class:`str` + Role name + color: :class:`int` + Integer representation of hexadecimal color code + hoist: :class:`bool` + If this role is pinned in the user listing + icon: :class:`str` + Role icon hash + unicode_emoji: :class:`str` + Role unicode emoji + position: :class:`str` + Position of this role + permission: :class:`str` + Permission bit set + managed: :class:`bool` + Whether this role is managed by an integration + mentionable: :class:`bool` + Whether this role is mentionable + """ + + id: APINullable[Snowflake] = UNDEFINED + name: APINullable[str] = UNDEFINED + color: APINullable[int] = UNDEFINED + hoist: APINullable[bool] = UNDEFINED + icon: APINullable[str] = UNDEFINED + unicode_emoji: APINullable[str] = UNDEFINED + position: APINullable[int] = UNDEFINED + permission: APINullable[str] = UNDEFINED + managed: APINullable[bool] = UNDEFINED + mentionable: APINullable[bool] = UNDEFINED + + @classmethod + def from_dict(cls, data: Dict[str, any]) -> Role: + """Generate a role from the given data. + + Parameters + ---------- + data: :class:`dict` + The dictionary to convert into a role. + """ + + self: Role = super().__new__(cls) + + self.id = int(data["id"]) + self.name = data.get("name") + self.color = data.get("color") + self.hoist = data.get("hoist", False) + self.icon = data.get("icon") + self.unicode_emoji = data.get("unicode_emoji") + self.position = data.get("position") + self.permission = data.get("permission") + self.managed = data.get("managed", False) + self.mentionable = data.get("mentionable", False) + + return self