25
25
26
26
from __future__ import annotations
27
27
28
+ import importlib .resources
29
+ import json
28
30
import re
29
31
from typing import TYPE_CHECKING , Any , TypedDict , TypeVar
30
32
31
33
from . import utils
32
34
from .asset import Asset , AssetMixin
33
35
from .errors import InvalidArgument
34
36
37
+ with (
38
+ importlib .resources .files (__package__ )
39
+ .joinpath ("emojis.json" )
40
+ .open (encoding = "utf-8" ) as f
41
+ ):
42
+ EMOJIS_MAP = json .load (f )
43
+
35
44
__all__ = ("PartialEmoji" ,)
36
45
37
46
if TYPE_CHECKING :
@@ -127,7 +136,7 @@ def from_str(cls: type[PE], value: str) -> PE:
127
136
- ``name:id``
128
137
- ``<:name:id>``
129
138
130
- If the format does not match then it is assumed to be a unicode emoji.
139
+ 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:``) .
131
140
132
141
.. versionadded:: 2.0
133
142
@@ -141,6 +150,12 @@ def from_str(cls: type[PE], value: str) -> PE:
141
150
:class:`PartialEmoji`
142
151
The partial emoji from this string.
143
152
"""
153
+ if value .startswith (":" ) and value .endswith (":" ):
154
+ name = value [1 :- 1 ]
155
+ unicode_emoji = EMOJIS_MAP .get (name )
156
+ if unicode_emoji :
157
+ return cls (name = unicode_emoji , id = None , animated = False )
158
+
144
159
match = cls ._CUSTOM_EMOJI_RE .match (value )
145
160
if match is not None :
146
161
groups = match .groupdict ()
0 commit comments