Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion changelog/1223.breaking.rst
Original file line number Diff line number Diff line change
@@ -1 +1 @@
:attr:`Emoji.guild_id` can now be ``None`` if the emoji is owned by an application. You can use :attr:`Emoji.is_guild_emoji` and :attr:`Emoji.is_app_emoji` to check if this is a Guild or App Emoji.
:attr:`Emoji.guild_id` can now be ``None`` if the emoji is owned by an application. You can use :meth:`Emoji.is_guild_emoji` and :meth:`Emoji.is_app_emoji` to check if this is a Guild or App Emoji.
2 changes: 1 addition & 1 deletion changelog/1223.feature.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
Add support to :class:`.Emoji` to represent application-owned emojis.
- New methods on :class:`Client`: :meth:`Client.fetch_application_emoji`, :meth:`Client.fetch_application_emojis` and :meth:`Client.create_application_emoji`.
- New attributes on :class:`.Emoji`: :attr:`Emoji.application_id`, :attr:`Emoji.is_guild_emoji` and :attr:`Emoji.is_app_emoji`.
- New attributes/methods on :class:`.Emoji`: :attr:`Emoji.application_id`, :meth:`Emoji.is_guild_emoji` and :meth:`Emoji.is_app_emoji`.
2 changes: 1 addition & 1 deletion changelog/1388.feature.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
Add support to :class:`.Emoji` to represent application-owned emojis.
- New methods on :class:`Client`: :meth:`Client.fetch_application_emoji`, :meth:`Client.fetch_application_emojis` and :meth:`Client.create_application_emoji`.
- New attributes on :class:`.Emoji`: :attr:`Emoji.application_id`, :attr:`Emoji.is_guild_emoji` and :attr:`Emoji.is_app_emoji`.
- New attributes/methods on :class:`.Emoji`: :attr:`Emoji.application_id`, :meth:`Emoji.is_guild_emoji` and :meth:`Emoji.is_app_emoji`.
3 changes: 3 additions & 0 deletions changelog/1397.feature.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Add support to :class:`.Emoji` to represent application-owned emojis.
- New methods on :class:`Client`: :meth:`Client.fetch_application_emoji`, :meth:`Client.fetch_application_emojis` and :meth:`Client.create_application_emoji`.
- New attributes/methods on :class:`.Emoji`: :attr:`Emoji.application_id`, :meth:`Emoji.is_guild_emoji` and :meth:`Emoji.is_app_emoji`.
4 changes: 2 additions & 2 deletions disnake/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -2423,7 +2423,7 @@ async def application_info(self) -> AppInfo:
data = await self.http.application_info()
return AppInfo(self._connection, data)

async def fetch_application_emoji(self, emoji_id: int) -> Emoji:
async def fetch_application_emoji(self, emoji_id: int, /) -> Emoji:
"""|coro|

Retrieves an application level :class:`~disnake.Emoji` based on its ID.
Expand Down Expand Up @@ -2482,7 +2482,7 @@ async def create_application_emoji(self, *, name: str, image: AssetBytes) -> Emo
The newly created application emoji.
"""
img = await utils._assetbytes_to_base64_data(image)
data = await self.http.create_app_emoji(self.application_id, name, img)
data = await self.http.create_app_emoji(self.application_id, name=name, image=img)
return Emoji(guild=None, state=self._connection, data=data)

async def fetch_application_emojis(self) -> List[Emoji]:
Expand Down
45 changes: 23 additions & 22 deletions disnake/emoji.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ class Emoji(_EmojiTag, AssetMixin):

.. versionchanged:: |vnext|

This class can now represent app emojis. Use :attr:`Emoji.is_app_emoji` to check for this.
To check if this is a guild emoji, use :attr:`Emoji.is_guild_emoji`.
This class can now represent app emojis. Use :meth:`Emoji.is_app_emoji` to check for this.
To check if this is a guild emoji, use :meth:`Emoji.is_guild_emoji`.

Attributes
----------
Expand Down Expand Up @@ -196,19 +196,21 @@ def application_id(self) -> Optional[int]:
return None
return self._state.application_id

@property
def is_guild_emoji(self) -> bool:
""":class:`bool`: Whether this emoji is a guild emoji.
"""Whether this emoji is a guild emoji.

.. versionadded:: |vnext|

:return type: :class:`bool`
"""
return self.guild_id is not None

@property
def is_app_emoji(self) -> bool:
""":class:`bool`: Whether this emoji is an application emoji.
"""Whether this emoji is an application emoji.

.. versionadded:: |vnext|

:return type: :class:`bool`
"""
return self.guild_id is None

Expand All @@ -221,10 +223,8 @@ def is_usable(self) -> bool:
"""
if not self.available:
return False
if not self.guild:
# if we don't have a guild, this is an app emoji
return self.available
if not self._roles:
# if we don't have a guild, this is an app emoji
if not self.guild or not self._roles:
return True
emoji_roles, my_roles = self._roles, self.guild.me._roles
return any(my_roles.has(role_id) for role_id in emoji_roles)
Expand Down Expand Up @@ -253,8 +253,8 @@ async def delete(self, *, reason: Optional[str] = None) -> None:
InvalidData
The emoji data is invalid and cannot be processed.
"""
# this is an app emoji
if self.guild is None:
if self.guild_id is None:
# this is an app emoji
if self.application_id is None:
# should never happen
msg = (
Expand All @@ -264,7 +264,7 @@ async def delete(self, *, reason: Optional[str] = None) -> None:
raise InvalidData(msg)

return await self._state.http.delete_app_emoji(self.application_id, self.id)
await self._state.http.delete_custom_emoji(self.guild.id, self.id, reason=reason)
await self._state.http.delete_custom_emoji(self.guild_id, self.id, reason=reason)

async def edit(
self, *, name: str = MISSING, roles: List[Snowflake] = MISSING, reason: Optional[str] = None
Expand Down Expand Up @@ -310,13 +310,8 @@ async def edit(
:class:`Emoji`
The newly updated emoji.
"""
payload = {}
if name is not MISSING:
payload["name"] = name
if roles is not MISSING:
payload["roles"] = [role.id for role in roles]

if self.guild is None:
if self.guild_id is None:
# this is an app emoji
if self.application_id is None:
# should never happen
msg = (
Expand All @@ -325,9 +320,15 @@ async def edit(
)
raise InvalidData(msg)

data = await self._state.http.edit_app_emoji(self.application_id, self.id, name)
data = await self._state.http.edit_app_emoji(self.application_id, self.id, name=name)
else:
payload = {}
if name is not MISSING:
payload["name"] = name
if roles is not MISSING:
payload["roles"] = [role.id for role in roles]

data = await self._state.http.edit_custom_emoji(
self.guild.id, self.id, payload=payload, reason=reason
self.guild_id, self.id, payload=payload, reason=reason
)
return Emoji(guild=self.guild, data=data, state=self._state)
6 changes: 4 additions & 2 deletions disnake/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -1774,7 +1774,9 @@ def get_custom_emoji(self, guild_id: Snowflake, emoji_id: Snowflake) -> Response
)
)

def create_app_emoji(self, app_id: Snowflake, name: str, image: str) -> Response[emoji.Emoji]:
def create_app_emoji(
self, app_id: Snowflake, *, name: str, image: str
) -> Response[emoji.Emoji]:
payload: Dict[str, Any] = {
"name": name,
"image": image,
Expand All @@ -1784,7 +1786,7 @@ def create_app_emoji(self, app_id: Snowflake, name: str, image: str) -> Response
return self.request(r, json=payload)

def edit_app_emoji(
self, app_id: Snowflake, emoji_id: Snowflake, name: str
self, app_id: Snowflake, emoji_id: Snowflake, *, name: str
) -> Response[emoji.Emoji]:
payload: Dict[str, Any] = {
"name": name,
Expand Down
Loading