Source code for curious.dataclasses.emoji
# This file is part of curious.
#
# curious is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# curious is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with curious. If not, see <http://www.gnu.org/licenses/>.
"""
Wrappers for custom emojis in guilds.
.. currentmodule:: curious.dataclasses.emoji
"""
import typing
from curious.dataclasses import guild as dt_guild, role as dt_role
from curious.dataclasses.bases import Dataclass
[docs]class Emoji(Dataclass):
"""
Represents a custom emoji uploaded to a guild.
"""
__slots__ = ("id", "name", "role_ids", "require_colons", "managed", "guild_id", "animated")
def __init__(self, **kwargs):
super().__init__(int(kwargs.get("id")), kwargs.get("client"))
#: The name of this emoji.
self.name = kwargs.get("name", None) # type: str
#: A list of role IDs that this emoji can be used by.
self.role_ids = kwargs.get("roles", []) # type: typing.List[int]
#: If this emoji requires colons to use.
self.require_colons = kwargs.get("require_colons", False) # type: bool
#: If this emoji is managed or not.
self.managed = kwargs.get("managed", False) # type: bool
#: The ID of the guild this emoji is associated with.
self.guild_id = None # type: int
#: If this emoji is animated or not.
self.animated = kwargs.get("animated", False) # type: bool
def __eq__(self, other) -> bool:
if isinstance(other, str):
return False
return self.id == other.id
def __hash__(self) -> int:
return hash(self.id)
def __str__(self) -> str:
return "<{}:{}:{}>".format('a' if self.animated else '', self.name, self.id)
def __repr__(self) -> str:
return "<Emoji guild={!r} id={!r} name={!r}>".format(self.guild, self.id, self.name)
[docs] async def edit(self, *,
name: str = None,
roles: 'typing.List[dt_role.Role]' = None) -> 'Emoji':
"""
Edits this emoji.
:param name: The new name of the emoji.
:param roles: The new list of roles that can use this emoji.
:return: This emoji.
"""
if roles is not None:
roles = [r.id for r in roles]
await self._bot.http.edit_guild_emoji(guild_id=self.guild_id, emoji_id=self.id,
name=name, roles=roles)
return self
[docs] async def delete(self) -> None:
"""
Deletes this emoji.
"""
await self._bot.http.delete_guild_emoji(self.guild_id, emoji_id=self.id)
@property
def guild(self) -> 'dt_guild.Guild':
"""
:return: The :class:`.Guild` this emoji object is associated with.
"""
return self._bot.guilds.get(self.guild_id)
@property
def roles(self) -> 'typing.List[dt_role.Role]':
"""
:return: A list of :class:`.Role` this emoji can be used by.
"""
if len(self.role_ids) <= 0:
return [self.guild.default_role]
return [self.guild.roles[r_id] for r_id in self.role_ids]
@property
def url(self) -> str:
"""
:return: The URL to this emoji.
"""
cdn_url = f"https://cdn.discordapp.com/emojis/{self.id}"
if not self.animated:
return f"{cdn_url}.png"
return f"{cdn_url}.gif"