Skip to content

Commit 4005c85

Browse files
authored
Merge branch 'master' into uv-frozen
2 parents 4ebcfe8 + bc48553 commit 4005c85

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+2477
-2566
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
* @Pycord-Development/pycord-next-contributors
1+
* @Pycord-Development/pycord-next-contributors
22

33
/.github @Lulalaby
44
/crowdin.yml @Pycord-Development/maintain-translations

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ repos:
1010
- id: end-of-file-fixer
1111
exclude: \.(po|pot|yml|yaml)$
1212
- repo: https://github.com/astral-sh/ruff-pre-commit
13-
rev: v0.12.11
13+
rev: v0.13.3
1414
hooks:
1515
- id: ruff
1616
args: [ --fix ]

CHANGELOG-V3.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,17 @@ release.
1212
### Deprecated
1313

1414
### Removed
15+
16+
- `utils.filter_params`
17+
- `utils.sleep_until` use `asyncio.sleep` combined with `datetime.datetime` instead
18+
- `utils.compute_timedelta` use the `datetime` module instead
19+
- `utils.resolve_invite`
20+
- `utils.resolve_template`
21+
- `utils.parse_time` use `datetime.datetime.fromisoformat` instead
22+
- `utils.time_snowflake` use `utils.generate_snowflake` instead
23+
- `utils.warn_deprecated`
24+
- `utils.deprecated`
25+
- `utils.get` use `utils.find` with `lambda i: i.attr == val` instead
26+
- `AsyncIterator.get` use `AsyncIterator.find` with `lambda i: i.attr == val` instead
27+
- `utils.as_chunks` use `itertools.batched` on Python 3.12+ or your own implementation
28+
instead

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
⚠️ This is a testing repository, and should not be used in production.
1+
⚠️ This is a testing repository, and should not be used in production ⚠️
22

33
Please use the main repository: https://github.com/Pycord-Development/pycord
44

discord/__version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535

3636
from typing import Literal, NamedTuple
3737

38-
from .utils import deprecated
3938
from ._version import __version__, __version_tuple__
39+
from .utils.private import deprecated
4040

4141

4242
class AdvancedVersionInfo(TypedDict):

discord/abc.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
from .role import Role
5656
from .scheduled_events import ScheduledEvent
5757
from .sticker import GuildSticker, StickerItem
58+
from .utils.private import warn_deprecated
5859
from .voice_client import VoiceClient, VoiceProtocol
5960

6061
__all__ = (
@@ -98,9 +99,9 @@
9899
from .ui.view import View
99100
from .user import ClientUser
100101

101-
PartialMessageableChannel = Union[TextChannel, VoiceChannel, StageChannel, Thread, DMChannel, PartialMessageable]
102-
MessageableChannel = Union[PartialMessageableChannel, GroupChannel]
103-
SnowflakeTime = Union["Snowflake", datetime]
102+
PartialMessageableChannel = TextChannel | VoiceChannel | StageChannel | Thread | DMChannel | PartialMessageable
103+
MessageableChannel = PartialMessageableChannel | GroupChannel
104+
SnowflakeTime = "Snowflake" | datetime
104105

105106
MISSING = utils.MISSING
106107

@@ -724,7 +725,7 @@ def permissions_for(self, obj: Member | Role, /) -> Permissions:
724725
if obj.is_default():
725726
return base
726727

727-
overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id)
728+
overwrite = utils.find(lambda o: o.type == _Overwrites.ROLE and o.id == obj.id, self._overwrites)
728729
if overwrite is not None:
729730
base.handle_overwrite(overwrite.allow, overwrite.deny)
730731

@@ -911,8 +912,8 @@ async def set_permissions(self, target, *, overwrite=MISSING, reason=None, **per
911912
raise InvalidArgument("No overwrite provided.")
912913
try:
913914
overwrite = PermissionOverwrite(**permissions)
914-
except (ValueError, TypeError):
915-
raise InvalidArgument("Invalid permissions given to keyword arguments.")
915+
except (ValueError, TypeError) as e:
916+
raise InvalidArgument("Invalid permissions given to keyword arguments.") from e
916917
elif len(permissions) > 0:
917918
raise InvalidArgument("Cannot mix overwrite and keyword arguments.")
918919

@@ -1529,7 +1530,7 @@ async def send(
15291530
from .message import MessageReference # noqa: PLC0415
15301531

15311532
if not isinstance(reference, MessageReference):
1532-
utils.warn_deprecated(
1533+
warn_deprecated(
15331534
f"Passing {type(reference).__name__} to reference",
15341535
"MessageReference",
15351536
"2.7",
@@ -1752,8 +1753,8 @@ def can_send(self, *objects) -> bool:
17521753
if obj.guild_id == channel.guild.id:
17531754
continue
17541755

1755-
except (KeyError, AttributeError):
1756-
raise TypeError(f"The object {obj} is of an invalid type.")
1756+
except (KeyError, AttributeError) as e:
1757+
raise TypeError(f"The object {obj} is of an invalid type.") from e
17571758

17581759
if not getattr(channel.permissions_for(channel.guild.me), permission):
17591760
return False

discord/activity.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from .colour import Colour
3333
from .enums import ActivityType, try_enum
3434
from .partial_emoji import PartialEmoji
35-
from .utils import _get_as_snowflake
35+
from .utils.private import get_as_snowflake
3636

3737
__all__ = (
3838
"BaseActivity",
@@ -226,7 +226,7 @@ def __init__(self, **kwargs):
226226
self.timestamps: ActivityTimestamps = kwargs.pop("timestamps", {})
227227
self.assets: ActivityAssets = kwargs.pop("assets", {})
228228
self.party: ActivityParty = kwargs.pop("party", {})
229-
self.application_id: int | None = _get_as_snowflake(kwargs, "application_id")
229+
self.application_id: int | None = get_as_snowflake(kwargs, "application_id")
230230
self.url: str | None = kwargs.pop("url", None)
231231
self.flags: int = kwargs.pop("flags", 0)
232232
self.sync_id: str | None = kwargs.pop("sync_id", None)
@@ -805,7 +805,7 @@ def __repr__(self) -> str:
805805
return f"<CustomActivity name={self.name!r} emoji={self.emoji!r}>"
806806

807807

808-
ActivityTypes = Union[Activity, Game, CustomActivity, Streaming, Spotify]
808+
ActivityTypes = Activity | Game | CustomActivity | Streaming | Spotify
809809

810810

811811
@overload

discord/appinfo.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from . import utils
3131
from .asset import Asset
3232
from .permissions import Permissions
33+
from .utils.private import get_as_snowflake, warn_deprecated
3334

3435
if TYPE_CHECKING:
3536
from .guild import Guild
@@ -200,9 +201,9 @@ def __init__(self, state: ConnectionState, data: AppInfoPayload):
200201
self._summary: str = data["summary"]
201202
self.verify_key: str = data["verify_key"]
202203

203-
self.guild_id: int | None = utils._get_as_snowflake(data, "guild_id")
204+
self.guild_id: int | None = get_as_snowflake(data, "guild_id")
204205

205-
self.primary_sku_id: int | None = utils._get_as_snowflake(data, "primary_sku_id")
206+
self.primary_sku_id: int | None = get_as_snowflake(data, "primary_sku_id")
206207
self.slug: str | None = data.get("slug")
207208
self._cover_image: str | None = data.get("cover_image")
208209
self.terms_of_service_url: str | None = data.get("terms_of_service_url")
@@ -261,7 +262,7 @@ def summary(self) -> str | None:
261262
.. versionadded:: 1.3
262263
.. deprecated:: 2.7
263264
"""
264-
utils.warn_deprecated(
265+
warn_deprecated(
265266
"summary",
266267
"description",
267268
reference="https://discord.com/developers/docs/resources/application#application-object-application-structure",

discord/asset.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@
4747
MISSING = utils.MISSING
4848

4949

50+
def _valid_icon_size(size: int) -> bool:
51+
"""Icons must be power of 2 within [16, 4096]."""
52+
return not size & (size - 1) and 4096 >= size >= 16
53+
54+
5055
class AssetMixin:
5156
url: str
5257
_state: Any | None
@@ -373,7 +378,7 @@ def replace(
373378
url = url.with_path(f"{path}.{static_format}")
374379

375380
if size is not MISSING:
376-
if not utils.valid_icon_size(size):
381+
if not _valid_icon_size(size):
377382
raise InvalidArgument("size must be a power of 2 between 16 and 4096")
378383
url = url.with_query(size=size)
379384
else:
@@ -400,7 +405,7 @@ def with_size(self, size: int, /) -> Asset:
400405
InvalidArgument
401406
The asset had an invalid size.
402407
"""
403-
if not utils.valid_icon_size(size):
408+
if not _valid_icon_size(size):
404409
raise InvalidArgument("size must be a power of 2 between 16 and 4096")
405410

406411
url = str(yarl.URL(self._url).with_query(size=size))

discord/audit_logs.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
from __future__ import annotations
2727

28+
from functools import cached_property
2829
from typing import TYPE_CHECKING, Any, Callable, ClassVar, Generator, TypeVar
2930

3031
from . import enums, utils
@@ -35,6 +36,7 @@
3536
from .mixins import Hashable
3637
from .object import Object
3738
from .permissions import PermissionOverwrite, Permissions
39+
from .utils.private import get_as_snowflake
3840

3941
__all__ = (
4042
"AuditLogDiff",
@@ -381,7 +383,7 @@ def _handle_role(
381383
elem: list[RolePayload],
382384
) -> None:
383385
if not hasattr(first, "roles"):
384-
setattr(first, "roles", [])
386+
first.roles = []
385387

386388
data = []
387389
g: Guild = entry.guild # type: ignore
@@ -396,7 +398,7 @@ def _handle_role(
396398

397399
data.append(role)
398400

399-
setattr(second, "roles", data)
401+
second.roles = data
400402

401403
def _handle_trigger_metadata(
402404
self,
@@ -407,13 +409,13 @@ def _handle_trigger_metadata(
407409
attr: str,
408410
) -> None:
409411
if not hasattr(first, "trigger_metadata"):
410-
setattr(first, "trigger_metadata", None)
412+
first.trigger_metadata = None
411413

412414
key = attr.split("_", 1)[-1]
413415
data = {key: elem}
414416
tm = AutoModTriggerMetadata.from_dict(data)
415417

416-
setattr(second, "trigger_metadata", tm)
418+
second.trigger_metadata = tm
417419

418420

419421
class _AuditLogProxyMemberPrune:
@@ -559,21 +561,21 @@ def _from_data(self, data: AuditLogEntryPayload) -> None:
559561
# into meaningful data when requested
560562
self._changes = data.get("changes", [])
561563

562-
self.user = self._get_member(utils._get_as_snowflake(data, "user_id")) # type: ignore
563-
self._target_id = utils._get_as_snowflake(data, "target_id")
564+
self.user = self._get_member(get_as_snowflake(data, "user_id")) # type: ignore
565+
self._target_id = get_as_snowflake(data, "target_id")
564566

565567
def _get_member(self, user_id: int) -> Member | User | None:
566568
return self.guild.get_member(user_id) or self._users.get(user_id)
567569

568570
def __repr__(self) -> str:
569571
return f"<AuditLogEntry id={self.id} action={self.action} user={self.user!r}>"
570572

571-
@property
573+
@cached_property
572574
def created_at(self) -> datetime.datetime:
573575
"""Returns the entry's creation time in UTC."""
574576
return utils.snowflake_time(self.id)
575577

576-
@property
578+
@cached_property
577579
def target(
578580
self,
579581
) -> (
@@ -602,7 +604,7 @@ def category(self) -> enums.AuditLogActionCategory:
602604
"""The category of the action, if applicable."""
603605
return self.action.category
604606

605-
@property
607+
@cached_property
606608
def changes(self) -> AuditLogChanges:
607609
"""The list of changes this entry has."""
608610
obj = AuditLogChanges(self, self._changes, state=self._state)

0 commit comments

Comments
 (0)