Skip to content

Commit 4fb0254

Browse files
authored
Merge pull request #686 from DeltaXWizard/unstable_core_3
feat!: Architecture import fix, Localisation support, HTTP tweaks, misc fixes.
2 parents 0a0d5c9 + d7d218e commit 4fb0254

File tree

18 files changed

+223
-67
lines changed

18 files changed

+223
-67
lines changed

.github/FUNDING.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# These are supported funding model platforms
22

33
github: [goverfl0w]
4-
open_collective: discordinteractions
4+
open_collective: interactions-py

interactions/__init__.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,6 @@
99
1010
(c) 2021 interactions-py.
1111
"""
12-
from .api.models.channel import * # noqa: F401 F403
13-
from .api.models.flags import * # noqa: F401 F403
14-
from .api.models.guild import * # noqa: F401 F403
15-
from .api.models.gw import * # noqa: F401 F403
16-
from .api.models.member import * # noqa: F401 F403
17-
from .api.models.message import * # noqa: F401 F403
18-
from .api.models.misc import * # noqa: F401 F403
19-
from .api.models.presence import * # noqa: F401 F403
20-
from .api.models.role import * # noqa: F401 F403
21-
from .api.models.team import * # noqa: F401 F403
22-
from .api.models.user import * # noqa: F401 F403
12+
from .client import * # noqa: F401 F403 isort: skip
13+
from .api import * # noqa: F401 F403
2314
from .base import * # noqa: F401 F403
24-
from .client.bot import * # noqa: F401 F403
25-
from .client.context import * # noqa: F401 F403
26-
from .client.decor import * # noqa: F401 F403
27-
from .client.enums import * # noqa: F401 F403
28-
from .client.models.command import * # noqa: F401 F403
29-
from .client.models.component import * # noqa: F401 F403
30-
from .client.models.misc import * # noqa: F401 F403

interactions/api/__init__.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22
interactions.api
33
44
This section of the library maintains and
5-
handles all of the Gateway and HTTP
6-
work.
5+
handles all the Gateway and HTTP work.
76
"""
8-
from ..base import * # noqa: F401 F403
97
from .cache import * # noqa: F401 F403
108
from .enums import * # noqa: F401 F403
119
from .error import * # noqa: F401 F403
12-
from .gateway.client import * # noqa: F401 F403
13-
from .gateway.heartbeat import * # noqa: F401 F403
10+
from .gateway import * # noqa: F401 F403
1411
from .http import * # noqa: F401 F403
1512
from .models import * # noqa: F401 F403
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from asyncio import AbstractEventLoop, Event
22

3-
class _Heartbeat:
3+
class _Heartbeat():
44
event: Event
55
delay: float
66
def __init__(self, loop: AbstractEventLoop) -> None: ...

interactions/api/http/guild.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,14 +507,35 @@ async def remove_guild_ban(
507507
reason=reason,
508508
)
509509

510-
async def get_guild_bans(self, guild_id: int) -> List[dict]:
510+
async def get_guild_bans(
511+
self,
512+
guild_id: int,
513+
limit: Optional[int] = 1000,
514+
before: Optional[int] = None,
515+
after: Optional[int] = None,
516+
) -> List[dict]:
511517
"""
512518
Gets a list of banned users.
513519
520+
.. note::
521+
If both ``before`` and ``after`` are provided, only ``before`` is respected.
522+
514523
:param guild_id: Guild ID snowflake.
524+
:param limit: Number of users to return. Defaults to 1000.
525+
:param before: Consider only users before the given User ID snowflake.
526+
:param after: Consider only users after the given User ID snowflake.
515527
:return: A list of banned users.
516528
"""
517-
return await self._req.request(Route("GET", f"/guilds/{guild_id}/bans"))
529+
530+
params = {}
531+
if limit is not None:
532+
params["limit"] = limit
533+
if before:
534+
params["before"] = before
535+
if after:
536+
params["after"] = after
537+
538+
return await self._req.request(Route("GET", f"/guilds/{guild_id}/bans"), params=params)
518539

519540
async def get_user_ban(self, guild_id: int, user_id: int) -> Optional[dict]:
520541
"""

interactions/api/http/request.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]:
9898
"""
9999

100100
kwargs["headers"] = {**self._headers, **kwargs.get("headers", {})}
101-
kwargs["headers"]["Content-Type"] = "application/json"
101+
if kwargs.get("json"):
102+
kwargs["headers"]["Content-Type"] = "application/json"
102103

103104
reason = kwargs.pop("reason", None)
104105
if reason:
@@ -165,22 +166,28 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]:
165166
# This "redundant" debug line is for debug use and tracing back the error codes.
166167

167168
raise HTTPException(data["code"], message=data["message"])
168-
elif remaining and not int(remaining):
169-
if response.status == 429:
169+
170+
if response.status == 429:
171+
if not is_global:
170172
log.warning(
171173
f"The HTTP client has encountered a per-route ratelimit. Locking down future requests for {reset_after} seconds."
172174
)
173175
_limiter.reset_after = reset_after
174176
await asyncio.sleep(_limiter.reset_after)
175177
continue
176-
elif is_global:
178+
else:
177179
log.warning(
178180
f"The HTTP client has encountered a global ratelimit. Locking down future requests for {reset_after} seconds."
179181
)
180182
self._global_lock.reset_after = reset_after
181183
self._loop.call_later(
182184
self._global_lock.reset_after, self._global_lock.lock.release
183185
)
186+
elif int(remaining) == 0:
187+
log.warning(
188+
f"The HTTP client has exhausted a per-route ratelimit. Locking route for {reset_after} seconds."
189+
)
190+
self._loop.call_later(reset_after, _limiter.release_lock())
184191

185192
log.debug(f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}")
186193

interactions/api/models/gw.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from datetime import datetime
22
from typing import List, Optional, Union
33

4-
from ...models.component import ActionRow, Button, SelectMenu
4+
from ...client.models.component import ActionRow, Button, SelectMenu
55
from .channel import Channel, ThreadMember
66
from .member import Member
77
from .message import Embed, Emoji, Message, MessageInteraction, Sticker

interactions/api/models/member.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Member(DictSerializerMixin):
4545
"permissions",
4646
"communication_disabled_until",
4747
"hoisted_role",
48+
"flags",
4849
"_client",
4950
)
5051

interactions/api/models/member.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ class Member(DictSerializerMixin):
2525
pending: Optional[bool]
2626
permissions: Optional[Permissions]
2727
communication_disabled_until: Optional[datetime.isoformat]
28-
hoisted_role: Any # TODO: post-v4: Investigate what this is for when documented by Discord.
28+
hoisted_role: Any # TODO: Investigate what this is for when documented by Discord.
29+
flags: int # TODO: Investigate what this is for when documented by Discord.
2930
def __init__(self, **kwargs): ...
3031
def __repr__(self) -> str: ...
3132
@property

interactions/api/models/message.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,11 +1042,11 @@ class Embed(DictSerializerMixin):
10421042

10431043
def __init__(self, **kwargs):
10441044
super().__init__(**kwargs)
1045-
self.timestamp = (
1046-
datetime.fromisoformat(self._json.get("timestamp"))
1047-
if self._json.get("timestamp")
1048-
else datetime.utcnow()
1049-
)
1045+
if isinstance(self._json.get("timestamp"), str):
1046+
self.timestamp = datetime.fromisoformat(
1047+
self._json.get("timestamp")
1048+
) # readability on non `_json` attr.
1049+
10501050
self.footer = EmbedFooter(**self.footer) if isinstance(self.footer, dict) else self.footer
10511051
self.image = EmbedImageStruct(**self.image) if isinstance(self.image, dict) else self.image
10521052
self.thumbnail = (
@@ -1064,7 +1064,6 @@ def __init__(self, **kwargs):
10641064
if self._json.get("fields")
10651065
else None
10661066
)
1067-
10681067
# (Complete partial fix.)
10691068
# The issue seems to be that this itself is not updating
10701069
# JSON result correctly. After numerous attempts I seem to

0 commit comments

Comments
 (0)