Skip to content

feat: Added support for emoji aliases like :smile: in PartialEmoji.from_str (redo) #2815

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 14 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 6 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: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ These changes are available on the `master` branch, but have not yet been releas
([#2761](https://github.com/Pycord-Development/pycord/pull/2761))
- Updated `valid_locales` to support `in` and `es-419`.
([#2767](https://github.com/Pycord-Development/pycord/pull/2767))
- Added support for emoji aliases like `:smile:` in PartialEmoji.from_str.
([#2815](https://github.com/Pycord-Development/pycord/pull/2815))
- Fixed `Webhook.edit` not working with `attachments=[]`.
([#2779](https://github.com/Pycord-Development/pycord/pull/2779))
- Fixed GIF-based `Sticker` returning the wrong `url`.
Expand Down
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ include LICENSE
include requirements.txt
include discord/bin/*.dll
include discord/py.typed
include discord/emojis.json

prune .github
prune docs
Expand Down
1 change: 1 addition & 0 deletions discord/emojis.json

Large diffs are not rendered by default.

18 changes: 16 additions & 2 deletions discord/ext/commands/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
)

import discord
from discord.partial_emoji import EMOJIS_MAP

from .errors import *

Expand Down Expand Up @@ -851,7 +852,8 @@ async def convert(self, ctx: Context, argument: str) -> discord.GuildEmoji:
class PartialEmojiConverter(Converter[discord.PartialEmoji]):
"""Converts to a :class:`~discord.PartialEmoji`.

This is done by extracting the animated flag, name and ID from the emoji.
This is done by extracting the animated flag, name, and ID for custom emojis,
or by using the standard Unicode emojis supported by Discord.

.. versionchanged:: 1.5
Raise :exc:`.PartialEmojiConversionFailure` instead of generic :exc:`.BadArgument`
Expand All @@ -872,6 +874,14 @@ async def convert(self, ctx: Context, argument: str) -> discord.PartialEmoji:
id=emoji_id,
)

if argument in EMOJIS_MAP.values():
return discord.PartialEmoji.with_state(
ctx.bot._connection,
animated=False,
name=argument,
id=None,
)

raise PartialEmojiConversionFailure(argument)


Expand Down Expand Up @@ -1094,7 +1104,11 @@ def get_converter(param: inspect.Parameter) -> Any:


def is_generic_type(tp: Any, *, _GenericAlias: type = _GenericAlias) -> bool:
return isinstance(tp, type) and issubclass(tp, Generic) or isinstance(tp, _GenericAlias) # type: ignore
return (
isinstance(tp, type)
and issubclass(tp, Generic)
or isinstance(tp, _GenericAlias)
) # type: ignore


CONVERTER_MAPPING: dict[type[Any], Any] = {
Expand Down
15 changes: 14 additions & 1 deletion discord/partial_emoji.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,22 @@

from __future__ import annotations

import importlib.resources
import json
import re
from typing import TYPE_CHECKING, Any, TypedDict, TypeVar

from . import utils
from .asset import Asset, AssetMixin
from .errors import InvalidArgument

with (
importlib.resources.files(__package__)
.joinpath("emojis.json")
.open(encoding="utf-8") as f
):
EMOJIS_MAP = json.load(f)

__all__ = ("PartialEmoji",)

if TYPE_CHECKING:
Expand Down Expand Up @@ -127,7 +136,7 @@ def from_str(cls: type[PE], value: str) -> PE:
- ``name:id``
- ``<:name:id>``

If the format does not match then it is assumed to be a unicode emoji.
If the format does not match then it is assumed to be a unicode emoji, either as Unicode characters or as a Discord alias (``:smile:``).

.. versionadded:: 2.0

Expand All @@ -141,6 +150,10 @@ def from_str(cls: type[PE], value: str) -> PE:
:class:`PartialEmoji`
The partial emoji from this string.
"""
if value.startswith(":") and value.endswith(":") and len(value) > 2:
name = value[1:-1]
if unicode_emoji := EMOJIS_MAP.get(name):
return cls(name=unicode_emoji, id=None, animated=False)
match = cls._CUSTOM_EMOJI_RE.match(value)
if match is not None:
groups = match.groupdict()
Expand Down