Skip to content

Commit 53407b1

Browse files
authored
Merge pull request #985 from interactions-py/unstable
chore: Merge unstable to stable
2 parents e636d4e + a8f076a commit 53407b1

File tree

17 files changed

+173
-142
lines changed

17 files changed

+173
-142
lines changed

interactions/api/gateway/client.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -372,13 +372,9 @@ def _dispatch_event(self, event: str, data: dict) -> None:
372372
elif data["type"] == InteractionType.MODAL_SUBMIT:
373373
_name = f"modal_{_context.data.custom_id}"
374374

375-
if _context.data._json.get("components"):
375+
if _context.data.components:
376376
for component in _context.data.components:
377-
if component.get("components"):
378-
__args.append(
379-
[_value["value"] for _value in component["components"]][0]
380-
)
381-
else:
377+
if component.components:
382378
__args.append([_value.value for _value in component.components][0])
383379

384380
self._dispatch.dispatch("on_modal", _context)
@@ -466,7 +462,10 @@ def __modify_guild_cache():
466462
self._dispatch.dispatch(f"on_{name}", obj)
467463
__modify_guild_cache()
468464

469-
elif "_update" in name and hasattr(obj, "id"):
465+
elif "_update" in name:
466+
self._dispatch.dispatch(f"on_raw_{name}", obj)
467+
if not hasattr(obj, "id"):
468+
return
470469
old_obj = self._http.cache[model].get(id)
471470
if old_obj:
472471
before = model(**old_obj._json)
@@ -481,7 +480,6 @@ def __modify_guild_cache():
481480
self._dispatch.dispatch(
482481
f"on_{name}", before, old_obj
483482
) # give previously stored and new one
484-
return
485483

486484
elif "_remove" in name or "_delete" in name:
487485
self._dispatch.dispatch(f"on_raw_{name}", obj)

interactions/api/http/emoji.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from typing import List, Optional
22

33
from ...api.cache import Cache
4-
from ...api.models.guild import Emoji, Guild
5-
from ...api.models.misc import Snowflake
4+
from ..models.emoji import Emoji
5+
from ..models.guild import Guild
6+
from ..models.misc import Snowflake
67
from .request import _Request
78
from .route import Route
89

interactions/api/http/invite.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from .request import _Request
55
from .route import Route
66

7-
__all__ = ["InviteRequest"]
7+
__all__ = ("InviteRequest",)
88

99

1010
class InviteRequest:

interactions/api/http/member.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from typing import List, Optional
22

33
from ...api.cache import Cache
4-
from ...api.models.guild import Guild
5-
from ...api.models.member import Member
6-
from ...api.models.misc import Snowflake
4+
from ..models.guild import Guild
5+
from ..models.member import Member
6+
from ..models.misc import Snowflake
77
from .request import _Request
88
from .route import Route
99

interactions/api/http/request.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]:
163163
self.buckets[route.endpoint] = _bucket
164164
# real-time replacement/update/add if needed.
165165
if isinstance(data, dict) and (
166-
data.get("errors") or (data.get("code") and data.get("code") != 429)
166+
data.get("errors")
167+
or ((code := data.get("code")) and code != 429 and data.get("message"))
167168
):
168169
log.debug(
169170
f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}"

interactions/api/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from .attrs_utils import * # noqa: F401 F403
99
from .audit_log import * # noqa: F401 F403
1010
from .channel import * # noqa: F401 F403
11+
from .emoji import * # noqa: F401 F403
1112
from .flags import * # noqa: F401 F403
1213
from .guild import * # noqa: F401 F403
1314
from .gw import * # noqa: F401 F403

interactions/api/models/attrs_utils.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,23 @@ def __init__(self, kwargs_dict: dict = None, /, **other_kwargs):
5050
if value is not None and attrib.metadata.get("add_client"):
5151
if isinstance(value, list):
5252
for item in value:
53-
item["_client"] = client
53+
if isinstance(item, dict):
54+
item["_client"] = client
55+
elif isinstance(item, DictSerializerMixin):
56+
item._client = client
5457
else:
55-
value["_client"] = client
58+
if isinstance(value, dict):
59+
value["_client"] = client
60+
elif isinstance(value, DictSerializerMixin):
61+
value._client = client
62+
63+
# make sure json is recursively handled
64+
if isinstance(value, list):
65+
self._json[attrib_name] = [
66+
i._json if isinstance(i, DictSerializerMixin) else i for i in value
67+
]
68+
elif isinstance(value, DictSerializerMixin):
69+
self._json[attrib_name] = value._json # type: ignore
5670

5771
passed_kwargs[attrib_name] = value
5872

interactions/api/models/emoji.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
from typing import TYPE_CHECKING, List, Optional, Union
2+
3+
from ..error import LibraryException
4+
from .attrs_utils import ClientSerializerMixin, convert_list, define, field
5+
from .misc import Snowflake
6+
from .user import User
7+
8+
if TYPE_CHECKING:
9+
from ..http import HTTPClient
10+
from .guild import Guild
11+
12+
__all__ = ("Emoji",)
13+
14+
15+
@define()
16+
class Emoji(ClientSerializerMixin):
17+
"""
18+
A class objecting representing an emoji.
19+
20+
:ivar Optional[Snowflake] id?: Emoji id
21+
:ivar Optional[str] name?: Emoji name.
22+
:ivar Optional[List[int]] roles?: Roles allowed to use this emoji
23+
:ivar Optional[User] user?: User that created this emoji
24+
:ivar Optional[bool] require_colons?: Status denoting of this emoji must be wrapped in colons
25+
:ivar Optional[bool] managed?: Status denoting if this emoji is managed (by an integration)
26+
:ivar Optional[bool] animated?: Status denoting if this emoji is animated
27+
:ivar Optional[bool] available?: Status denoting if this emoji can be used. (Can be false via server boosting)
28+
"""
29+
30+
id: Optional[Snowflake] = field(converter=Snowflake, default=None)
31+
name: Optional[str] = field(default=None)
32+
roles: Optional[List[int]] = field(converter=convert_list(int), default=None)
33+
user: Optional[User] = field(converter=User, default=None)
34+
require_colons: Optional[bool] = field(default=None)
35+
managed: Optional[bool] = field(default=None)
36+
animated: Optional[bool] = field(default=None)
37+
available: Optional[bool] = field(default=None)
38+
39+
@classmethod
40+
async def get(
41+
cls,
42+
guild_id: Union[int, Snowflake, "Guild"],
43+
emoji_id: Union[int, Snowflake],
44+
client: "HTTPClient",
45+
) -> "Emoji":
46+
"""
47+
Gets an emoji.
48+
49+
:param guild_id: The id of the guild of the emoji
50+
:type guild_id: Union[int, Snowflake, "Guild"]
51+
:param emoji_id: The id of the emoji
52+
:type emoji_id: Union[int, Snowflake]
53+
:param client: The HTTPClient of your bot. Equals to ``bot._http``
54+
:type client: HTTPClient
55+
:return: The Emoji as object
56+
:rtype: Emoji
57+
"""
58+
59+
_guild_id = int(guild_id) if isinstance(guild_id, (int, Snowflake)) else int(guild_id.id)
60+
61+
res = await client.get_guild_emoji(guild_id=_guild_id, emoji_id=int(emoji_id))
62+
return cls(**res, _client=client)
63+
64+
@classmethod
65+
async def get_all_of_guild(
66+
cls,
67+
guild_id: Union[int, Snowflake, "Guild"],
68+
client: "HTTPClient",
69+
) -> List["Emoji"]:
70+
"""
71+
Gets all emoji of a guild.
72+
73+
:param guild_id: The id of the guild to get the emojis of
74+
:type guild_id: Union[int, Snowflake, "Guild"]
75+
:param client: The HTTPClient of your bot. Equals to ``bot._http``
76+
:type client: HTTPClient
77+
:return: The Emoji as list
78+
:rtype: List[Emoji]
79+
"""
80+
81+
_guild_id = int(guild_id) if isinstance(guild_id, (int, Snowflake)) else int(guild_id.id)
82+
83+
res = await client.get_all_emoji(guild_id=_guild_id)
84+
return [cls(**emoji, _client=client) for emoji in res]
85+
86+
async def delete(
87+
self,
88+
guild_id: Union[int, Snowflake, "Guild"],
89+
reason: Optional[str] = None,
90+
) -> None:
91+
"""
92+
Deletes the emoji.
93+
94+
:param guild_id: The guild id to delete the emoji from
95+
:type guild_id: Union[int, Snowflake, "Guild"]
96+
:param reason?: The reason of the deletion
97+
:type reason?: Optional[str]
98+
"""
99+
if not self._client:
100+
raise LibraryException(code=13)
101+
102+
_guild_id = int(guild_id) if isinstance(guild_id, (int, Snowflake)) else int(guild_id.id)
103+
104+
return await self._client.delete_guild_emoji(
105+
guild_id=_guild_id, emoji_id=int(self.id), reason=reason
106+
)
107+
108+
@property
109+
def url(self) -> str:
110+
"""
111+
Returns the emoji's URL.
112+
113+
:return: URL of the emoji
114+
:rtype: str
115+
"""
116+
url = f"https://cdn.discordapp.com/emojis/{self.id}"
117+
url += ".gif" if self.animated else ".png"
118+
return url

interactions/api/models/guild.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
)
1414
from .audit_log import AuditLogEvents, AuditLogs
1515
from .channel import Channel, ChannelType, Thread, ThreadMember
16+
from .emoji import Emoji
1617
from .member import Member
17-
from .message import Emoji, Sticker
18+
from .message import Sticker
1819
from .misc import (
1920
AutoModAction,
2021
AutoModTriggerMetadata,

interactions/api/models/gw.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
field,
1313
)
1414
from .channel import Channel, ThreadMember
15+
from .emoji import Emoji
1516
from .guild import EventMetadata
1617
from .member import Member
17-
from .message import Embed, Emoji, Message, MessageInteraction, Sticker
18+
from .message import Embed, Message, MessageInteraction, Sticker
1819
from .misc import (
1920
AutoModAction,
2021
AutoModTriggerMetadata,
@@ -341,7 +342,7 @@ async def kick(
341342
async def add_role(
342343
self,
343344
role: Union[Role, int],
344-
reason: Optional[str],
345+
reason: Optional[str] = None,
345346
) -> None:
346347
"""
347348
This method adds a role to a member.
@@ -371,7 +372,7 @@ async def add_role(
371372
async def remove_role(
372373
self,
373374
role: Union[Role, int],
374-
reason: Optional[str],
375+
reason: Optional[str] = None,
375376
) -> None:
376377
"""
377378
This method removes a role from a member.

0 commit comments

Comments
 (0)