Skip to content

Commit ad40b8e

Browse files
committed
Merge branch 'master' of https://github.com/Rapptz/discord.py
2 parents 9cfc4fc + a005109 commit ad40b8e

40 files changed

+767
-85
lines changed

MANIFEST.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
include README.rst
22
include LICENSE
33
include requirements.txt
4-
include discord/bin/*.dll
4+
include discord/bin/*
55
include discord/py.typed

discord/abc.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
from .voice_client import VoiceClient, VoiceProtocol
6161
from .sticker import GuildSticker, StickerItem
6262
from . import utils
63+
from .flags import InviteFlags
6364

6465
__all__ = (
6566
'Snowflake',
@@ -1257,6 +1258,7 @@ async def create_invite(
12571258
target_type: Optional[InviteTarget] = None,
12581259
target_user: Optional[User] = None,
12591260
target_application_id: Optional[int] = None,
1261+
guest: bool = False,
12601262
) -> Invite:
12611263
"""|coro|
12621264
@@ -1295,6 +1297,10 @@ async def create_invite(
12951297
The id of the embedded application for the invite, required if ``target_type`` is :attr:`.InviteTarget.embedded_application`.
12961298
12971299
.. versionadded:: 2.0
1300+
guest: :class:`bool`
1301+
Whether the invite is a guest invite.
1302+
1303+
.. versionadded:: 2.6
12981304
12991305
Raises
13001306
-------
@@ -1312,6 +1318,11 @@ async def create_invite(
13121318
if target_type is InviteTarget.unknown:
13131319
raise ValueError('Cannot create invite with an unknown target type')
13141320

1321+
flags: Optional[InviteFlags] = None
1322+
if guest:
1323+
flags = InviteFlags._from_value(0)
1324+
flags.guest = True
1325+
13151326
data = await self._state.http.create_invite(
13161327
self.id,
13171328
reason=reason,
@@ -1322,6 +1333,7 @@ async def create_invite(
13221333
target_type=target_type.value if target_type else None,
13231334
target_user_id=target_user.id if target_user else None,
13241335
target_application_id=target_application_id,
1336+
flags=flags.value if flags else None,
13251337
)
13261338
return Invite.from_incomplete(data=data, state=self._state)
13271339

discord/activity.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ def __str__(self) -> str:
418418
return str(self.name)
419419

420420
def __repr__(self) -> str:
421-
return f'<Game name={self.name!r}>'
421+
return f'<Game name={self.name!r} platform={self.platform!r}>'
422422

423423
def to_dict(self) -> Dict[str, Any]:
424424
timestamps: Dict[str, Any] = {}
@@ -514,7 +514,7 @@ def __str__(self) -> str:
514514
return str(self.name)
515515

516516
def __repr__(self) -> str:
517-
return f'<Streaming name={self.name!r}>'
517+
return f'<Streaming name={self.name!r} platform={self.platform!r}>'
518518

519519
@property
520520
def twitch_name(self) -> Optional[str]:

discord/app_commands/commands.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -687,9 +687,9 @@ def __init__(
687687

688688
self._params: Dict[str, CommandParameter] = _extract_parameters_from_callback(callback, callback.__globals__)
689689
self.checks: List[Check] = getattr(callback, '__discord_app_commands_checks__', [])
690-
self._guild_ids: Optional[List[int]] = guild_ids or getattr(
691-
callback, '__discord_app_commands_default_guilds__', None
692-
)
690+
self._guild_ids: Optional[List[int]] = guild_ids
691+
if self._guild_ids is None:
692+
self._guild_ids = getattr(callback, '__discord_app_commands_default_guilds__', None)
693693
self.default_permissions: Optional[Permissions] = getattr(
694694
callback, '__discord_app_commands_default_permissions__', None
695695
)
@@ -1250,7 +1250,9 @@ def __init__(
12501250
self._param_name = param
12511251
self._annotation = annotation
12521252
self.module: Optional[str] = callback.__module__
1253-
self._guild_ids = guild_ids or getattr(callback, '__discord_app_commands_default_guilds__', None)
1253+
self._guild_ids = guild_ids
1254+
if self._guild_ids is None:
1255+
self._guild_ids = getattr(callback, '__discord_app_commands_default_guilds__', None)
12541256
self.on_error: Optional[UnboundError] = None
12551257
self.default_permissions: Optional[Permissions] = getattr(
12561258
callback, '__discord_app_commands_default_permissions__', None
@@ -1587,7 +1589,9 @@ def __init__(
15871589

15881590
self._attr: Optional[str] = None
15891591
self._owner_cls: Optional[Type[Any]] = None
1590-
self._guild_ids: Optional[List[int]] = guild_ids or getattr(cls, '__discord_app_commands_default_guilds__', None)
1592+
self._guild_ids: Optional[List[int]] = guild_ids
1593+
if self._guild_ids is None:
1594+
self._guild_ids = getattr(cls, '__discord_app_commands_default_guilds__', None)
15911595

15921596
if default_permissions is MISSING:
15931597
if cls.__discord_app_commands_default_permissions__ is MISSING:
@@ -2367,6 +2371,9 @@ def guilds(*guild_ids: Union[Snowflake, int]) -> Callable[[T], T]:
23672371
specified by this decorator become the default guilds that it's added to rather
23682372
than being a global command.
23692373
2374+
If no arguments are given, then the command will not be synced anywhere. This may
2375+
be modified later using the :meth:`CommandTree.add_command` method.
2376+
23702377
.. note::
23712378
23722379
Due to an implementation quirk and Python limitation, if this is used in conjunction

discord/app_commands/installs.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ def __init__(self, *, guild: Optional[bool] = None, user: Optional[bool] = None)
5757
self._guild: Optional[bool] = guild
5858
self._user: Optional[bool] = user
5959

60+
def __repr__(self):
61+
return f'<AppInstallationType guild={self.guild!r} user={self.user!r}>'
62+
6063
@property
6164
def guild(self) -> bool:
6265
""":class:`bool`: Whether the integration is a guild install."""
@@ -142,6 +145,9 @@ def __init__(
142145
self._dm_channel: Optional[bool] = dm_channel
143146
self._private_channel: Optional[bool] = private_channel
144147

148+
def __repr__(self) -> str:
149+
return f'<AppCommandContext guild={self.guild!r} dm_channel={self.dm_channel!r} private_channel={self.private_channel!r}>'
150+
145151
@property
146152
def guild(self) -> bool:
147153
""":class:`bool`: Whether the context allows usage in a guild."""

discord/app_commands/models.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from datetime import datetime
2727

2828
from .errors import MissingApplicationID
29-
from ..flags import AppCommandContext, AppInstallationType
29+
from ..flags import AppCommandContext, AppInstallationType, ChannelFlags
3030
from .translator import TranslationContextLocation, TranslationContext, locale_str, Translator
3131
from ..permissions import Permissions
3232
from ..enums import (
@@ -575,6 +575,35 @@ class AppCommandChannel(Hashable):
575575
the application command in that channel.
576576
guild_id: :class:`int`
577577
The guild ID this channel belongs to.
578+
category_id: Optional[:class:`int`]
579+
The category channel ID this channel belongs to, if applicable.
580+
581+
.. versionadded:: 2.6
582+
topic: Optional[:class:`str`]
583+
The channel's topic. ``None`` if it doesn't exist.
584+
585+
.. versionadded:: 2.6
586+
position: :class:`int`
587+
The position in the channel list. This is a number that starts at 0. e.g. the
588+
top channel is position 0.
589+
590+
.. versionadded:: 2.6
591+
last_message_id: Optional[:class:`int`]
592+
The last message ID of the message sent to this channel. It may
593+
*not* point to an existing or valid message.
594+
595+
.. versionadded:: 2.6
596+
slowmode_delay: :class:`int`
597+
The number of seconds a member must wait between sending messages
598+
in this channel. A value of ``0`` denotes that it is disabled.
599+
Bots and users with :attr:`~discord.Permissions.manage_channels` or
600+
:attr:`~discord.Permissions.manage_messages` bypass slowmode.
601+
602+
.. versionadded:: 2.6
603+
nsfw: :class:`bool`
604+
If the channel is marked as "not safe for work" or "age restricted".
605+
606+
.. versionadded:: 2.6
578607
"""
579608

580609
__slots__ = (
@@ -583,6 +612,14 @@ class AppCommandChannel(Hashable):
583612
'name',
584613
'permissions',
585614
'guild_id',
615+
'topic',
616+
'nsfw',
617+
'position',
618+
'category_id',
619+
'slowmode_delay',
620+
'last_message_id',
621+
'_last_pin',
622+
'_flags',
586623
'_state',
587624
)
588625

@@ -599,6 +636,14 @@ def __init__(
599636
self.type: ChannelType = try_enum(ChannelType, data['type'])
600637
self.name: str = data['name']
601638
self.permissions: Permissions = Permissions(int(data['permissions']))
639+
self.topic: Optional[str] = data.get('topic')
640+
self.position: int = data.get('position') or 0
641+
self.nsfw: bool = data.get('nsfw') or False
642+
self.category_id: Optional[int] = _get_as_snowflake(data, 'parent_id')
643+
self.slowmode_delay: int = data.get('rate_limit_per_user') or 0
644+
self.last_message_id: Optional[int] = _get_as_snowflake(data, 'last_message_id')
645+
self._last_pin: Optional[datetime] = parse_time(data.get('last_pin_timestamp'))
646+
self._flags: int = data.get('flags', 0)
602647

603648
def __str__(self) -> str:
604649
return self.name
@@ -611,6 +656,28 @@ def guild(self) -> Optional[Guild]:
611656
"""Optional[:class:`~discord.Guild`]: The channel's guild, from cache, if found."""
612657
return self._state._get_guild(self.guild_id)
613658

659+
@property
660+
def flags(self) -> ChannelFlags:
661+
""":class:`~discord.ChannelFlags`: The flags associated with this channel object.
662+
663+
.. versionadded:: 2.6
664+
"""
665+
return ChannelFlags._from_value(self._flags)
666+
667+
def is_nsfw(self) -> bool:
668+
""":class:`bool`: Checks if the channel is NSFW.
669+
670+
.. versionadded:: 2.6
671+
"""
672+
return self.nsfw
673+
674+
def is_news(self) -> bool:
675+
""":class:`bool`: Checks if the channel is a news channel.
676+
677+
.. versionadded:: 2.6
678+
"""
679+
return self.type == ChannelType.news
680+
614681
def resolve(self) -> Optional[GuildChannel]:
615682
"""Resolves the application command channel to the appropriate channel
616683
from cache if found.
@@ -1063,6 +1130,9 @@ def __init__(self, *, data: ApplicationCommandPermissions, guild: Guild, state:
10631130

10641131
self.target: Union[Object, User, Member, Role, AllChannels, GuildChannel] = _object
10651132

1133+
def __repr__(self) -> str:
1134+
return f'<AppCommandPermissions id={self.id} type={self.type!r} guild={self.guild!r} permission={self.permission}>'
1135+
10661136
def to_dict(self) -> ApplicationCommandPermissions:
10671137
return {
10681138
'id': self.target.id,
@@ -1106,6 +1176,9 @@ def __init__(self, *, data: GuildApplicationCommandPermissions, state: Connectio
11061176
AppCommandPermissions(data=value, guild=guild, state=self._state) for value in data['permissions']
11071177
]
11081178

1179+
def __repr__(self) -> str:
1180+
return f'<GuildAppCommandPermissions id={self.id!r} guild_id={self.guild_id!r} permissions={self.permissions!r}>'
1181+
11091182
def to_dict(self) -> Dict[str, Any]:
11101183
return {'permissions': [p.to_dict() for p in self.permissions]}
11111184

discord/app_commands/transformers.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
from ..abc import GuildChannel
5353
from ..threads import Thread
5454
from ..enums import Enum as InternalEnum, AppCommandOptionType, ChannelType, Locale
55-
from ..utils import MISSING, maybe_coroutine
55+
from ..utils import MISSING, maybe_coroutine, _human_join
5656
from ..user import User
5757
from ..role import Role
5858
from ..member import Member
@@ -631,7 +631,7 @@ def __init__(self, *channel_types: Type[Any]) -> None:
631631
display_name = channel_types[0].__name__
632632
types = CHANNEL_TO_TYPES[channel_types[0]]
633633
else:
634-
display_name = '{}, and {}'.format(', '.join(t.__name__ for t in channel_types[:-1]), channel_types[-1].__name__)
634+
display_name = _human_join([t.__name__ for t in channel_types])
635635
types = []
636636

637637
for t in channel_types:
@@ -689,6 +689,7 @@ async def transform(self, interaction: Interaction[ClientT], value: Any, /):
689689
ChannelType.news,
690690
ChannelType.category,
691691
ChannelType.forum,
692+
ChannelType.media,
692693
],
693694
GuildChannel: [
694695
ChannelType.stage_voice,
@@ -697,14 +698,15 @@ async def transform(self, interaction: Interaction[ClientT], value: Any, /):
697698
ChannelType.news,
698699
ChannelType.category,
699700
ChannelType.forum,
701+
ChannelType.media,
700702
],
701703
AppCommandThread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread],
702704
Thread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread],
703705
StageChannel: [ChannelType.stage_voice],
704706
VoiceChannel: [ChannelType.voice],
705707
TextChannel: [ChannelType.text, ChannelType.news],
706708
CategoryChannel: [ChannelType.category],
707-
ForumChannel: [ChannelType.forum],
709+
ForumChannel: [ChannelType.forum, ChannelType.media],
708710
}
709711

710712
BUILT_IN_TRANSFORMERS: Dict[Any, Transformer] = {

discord/audit_logs.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
DefaultReaction as DefaultReactionPayload,
7070
)
7171
from .types.invite import Invite as InvitePayload
72-
from .types.role import Role as RolePayload
72+
from .types.role import Role as RolePayload, RoleColours
7373
from .types.snowflake import Snowflake
7474
from .types.command import ApplicationCommandPermissions
7575
from .types.automod import AutoModerationAction
@@ -145,8 +145,8 @@ def _transform_applied_forum_tags(entry: AuditLogEntry, data: List[Snowflake]) -
145145
return [Object(id=tag_id, type=ForumTag) for tag_id in data]
146146

147147

148-
def _transform_overloaded_flags(entry: AuditLogEntry, data: int) -> Union[int, flags.ChannelFlags]:
149-
# The `flags` key is definitely overloaded. Right now it's for channels and threads but
148+
def _transform_overloaded_flags(entry: AuditLogEntry, data: int) -> Union[int, flags.ChannelFlags, flags.InviteFlags]:
149+
# The `flags` key is definitely overloaded. Right now it's for channels, threads and invites but
150150
# I am aware of `member.flags` and `user.flags` existing. However, this does not impact audit logs
151151
# at the moment but better safe than sorry.
152152
channel_audit_log_types = (
@@ -157,9 +157,16 @@ def _transform_overloaded_flags(entry: AuditLogEntry, data: int) -> Union[int, f
157157
enums.AuditLogAction.thread_update,
158158
enums.AuditLogAction.thread_delete,
159159
)
160+
invite_audit_log_types = (
161+
enums.AuditLogAction.invite_create,
162+
enums.AuditLogAction.invite_update,
163+
enums.AuditLogAction.invite_delete,
164+
)
160165

161166
if entry.action in channel_audit_log_types:
162167
return flags.ChannelFlags._from_value(data)
168+
elif entry.action in invite_audit_log_types:
169+
return flags.InviteFlags._from_value(data)
163170
return data
164171

165172

@@ -400,6 +407,12 @@ def __init__(self, entry: AuditLogEntry, data: List[AuditLogChangePayload]):
400407
self._handle_trigger_attr_update(self.after, self.before, entry, trigger_attr, elem['new_value']) # type: ignore
401408
continue
402409

410+
# special case for colors to set secondary and tertiary colos/colour attributes
411+
if attr == 'colors':
412+
self._handle_colours(self.before, elem['old_value']) # type: ignore # should be a RoleColours dict
413+
self._handle_colours(self.after, elem['new_value']) # type: ignore # should be a RoleColours dict
414+
continue
415+
403416
try:
404417
key, transformer = self.TRANSFORMERS[attr]
405418
except (ValueError, KeyError):
@@ -532,6 +545,16 @@ def _handle_trigger_attr_update(
532545
except (AttributeError, TypeError):
533546
pass
534547

548+
def _handle_colours(self, diff: AuditLogDiff, colours: RoleColours):
549+
# handle colours to multiple colour attributes
550+
diff.color = diff.colour = Colour(colours['primary_color'])
551+
552+
secondary_colour = colours['secondary_color']
553+
tertiary_colour = colours['tertiary_color']
554+
555+
diff.secondary_color = diff.secondary_colour = Colour(secondary_colour) if secondary_colour is not None else None
556+
diff.tertiary_color = diff.tertiary_colour = Colour(tertiary_colour) if tertiary_colour is not None else None
557+
535558
def _create_trigger(self, diff: AuditLogDiff, entry: AuditLogEntry) -> AutoModTrigger:
536559
# check if trigger has already been created
537560
if not hasattr(diff, 'trigger'):

0 commit comments

Comments
 (0)