Browse Source

Merge remote-tracking branch 'upstream/master' into new-pins-endpoint

pull/10205/head
Soheab_ 4 weeks ago
parent
commit
25cf99dd38
  1. 4
      discord/activity.py
  2. 6
      discord/app_commands/installs.py
  3. 6
      discord/app_commands/models.py
  4. 8
      discord/app_commands/transformers.py
  5. 5
      discord/client.py
  6. 2
      discord/embeds.py
  7. 3
      discord/ext/commands/parameters.py
  8. 19
      discord/guild.py
  9. 2
      discord/http.py
  10. 3
      discord/interactions.py
  11. 5
      discord/invite.py
  12. 3
      discord/message.py

4
discord/activity.py

@ -418,7 +418,7 @@ class Game(BaseActivity):
return str(self.name) return str(self.name)
def __repr__(self) -> str: def __repr__(self) -> str:
return f'<Game name={self.name!r}>' return f'<Game name={self.name!r} platform={self.platform!r}>'
def to_dict(self) -> Dict[str, Any]: def to_dict(self) -> Dict[str, Any]:
timestamps: Dict[str, Any] = {} timestamps: Dict[str, Any] = {}
@ -514,7 +514,7 @@ class Streaming(BaseActivity):
return str(self.name) return str(self.name)
def __repr__(self) -> str: def __repr__(self) -> str:
return f'<Streaming name={self.name!r}>' return f'<Streaming name={self.name!r} platform={self.platform!r}>'
@property @property
def twitch_name(self) -> Optional[str]: def twitch_name(self) -> Optional[str]:

6
discord/app_commands/installs.py

@ -57,6 +57,9 @@ class AppInstallationType:
self._guild: Optional[bool] = guild self._guild: Optional[bool] = guild
self._user: Optional[bool] = user self._user: Optional[bool] = user
def __repr__(self):
return f'<AppInstallationType guild={self.guild!r} user={self.user!r}>'
@property @property
def guild(self) -> bool: def guild(self) -> bool:
""":class:`bool`: Whether the integration is a guild install.""" """:class:`bool`: Whether the integration is a guild install."""
@ -142,6 +145,9 @@ class AppCommandContext:
self._dm_channel: Optional[bool] = dm_channel self._dm_channel: Optional[bool] = dm_channel
self._private_channel: Optional[bool] = private_channel self._private_channel: Optional[bool] = private_channel
def __repr__(self) -> str:
return f'<AppCommandContext guild={self.guild!r} dm_channel={self.dm_channel!r} private_channel={self.private_channel!r}>'
@property @property
def guild(self) -> bool: def guild(self) -> bool:
""":class:`bool`: Whether the context allows usage in a guild.""" """:class:`bool`: Whether the context allows usage in a guild."""

6
discord/app_commands/models.py

@ -1063,6 +1063,9 @@ class AppCommandPermissions:
self.target: Union[Object, User, Member, Role, AllChannels, GuildChannel] = _object self.target: Union[Object, User, Member, Role, AllChannels, GuildChannel] = _object
def __repr__(self) -> str:
return f'<AppCommandPermissions id={self.id} type={self.type!r} guild={self.guild!r} permission={self.permission}>'
def to_dict(self) -> ApplicationCommandPermissions: def to_dict(self) -> ApplicationCommandPermissions:
return { return {
'id': self.target.id, 'id': self.target.id,
@ -1106,6 +1109,9 @@ class GuildAppCommandPermissions:
AppCommandPermissions(data=value, guild=guild, state=self._state) for value in data['permissions'] AppCommandPermissions(data=value, guild=guild, state=self._state) for value in data['permissions']
] ]
def __repr__(self) -> str:
return f'<GuildAppCommandPermissions id={self.id!r} guild_id={self.guild_id!r} permissions={self.permissions!r}>'
def to_dict(self) -> Dict[str, Any]: def to_dict(self) -> Dict[str, Any]:
return {'permissions': [p.to_dict() for p in self.permissions]} return {'permissions': [p.to_dict() for p in self.permissions]}

8
discord/app_commands/transformers.py

@ -52,7 +52,7 @@ from ..channel import StageChannel, VoiceChannel, TextChannel, CategoryChannel,
from ..abc import GuildChannel from ..abc import GuildChannel
from ..threads import Thread from ..threads import Thread
from ..enums import Enum as InternalEnum, AppCommandOptionType, ChannelType, Locale from ..enums import Enum as InternalEnum, AppCommandOptionType, ChannelType, Locale
from ..utils import MISSING, maybe_coroutine from ..utils import MISSING, maybe_coroutine, _human_join
from ..user import User from ..user import User
from ..role import Role from ..role import Role
from ..member import Member from ..member import Member
@ -631,7 +631,7 @@ class BaseChannelTransformer(Transformer[ClientT]):
display_name = channel_types[0].__name__ display_name = channel_types[0].__name__
types = CHANNEL_TO_TYPES[channel_types[0]] types = CHANNEL_TO_TYPES[channel_types[0]]
else: else:
display_name = '{}, and {}'.format(', '.join(t.__name__ for t in channel_types[:-1]), channel_types[-1].__name__) display_name = _human_join([t.__name__ for t in channel_types])
types = [] types = []
for t in channel_types: for t in channel_types:
@ -689,6 +689,7 @@ CHANNEL_TO_TYPES: Dict[Any, List[ChannelType]] = {
ChannelType.news, ChannelType.news,
ChannelType.category, ChannelType.category,
ChannelType.forum, ChannelType.forum,
ChannelType.media,
], ],
GuildChannel: [ GuildChannel: [
ChannelType.stage_voice, ChannelType.stage_voice,
@ -697,6 +698,7 @@ CHANNEL_TO_TYPES: Dict[Any, List[ChannelType]] = {
ChannelType.news, ChannelType.news,
ChannelType.category, ChannelType.category,
ChannelType.forum, ChannelType.forum,
ChannelType.media,
], ],
AppCommandThread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread], AppCommandThread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread],
Thread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread], Thread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread],
@ -704,7 +706,7 @@ CHANNEL_TO_TYPES: Dict[Any, List[ChannelType]] = {
VoiceChannel: [ChannelType.voice], VoiceChannel: [ChannelType.voice],
TextChannel: [ChannelType.text, ChannelType.news], TextChannel: [ChannelType.text, ChannelType.news],
CategoryChannel: [ChannelType.category], CategoryChannel: [ChannelType.category],
ForumChannel: [ChannelType.forum], ForumChannel: [ChannelType.forum, ChannelType.media],
} }
BUILT_IN_TRANSFORMERS: Dict[Any, Transformer] = { BUILT_IN_TRANSFORMERS: Dict[Any, Transformer] = {

5
discord/client.py

@ -2550,7 +2550,7 @@ class Client:
) )
return Invite.from_incomplete(state=self._connection, data=data) return Invite.from_incomplete(state=self._connection, data=data)
async def delete_invite(self, invite: Union[Invite, str], /) -> None: async def delete_invite(self, invite: Union[Invite, str], /) -> Invite:
"""|coro| """|coro|
Revokes an :class:`.Invite`, URL, or ID to an invite. Revokes an :class:`.Invite`, URL, or ID to an invite.
@ -2578,7 +2578,8 @@ class Client:
""" """
resolved = utils.resolve_invite(invite) resolved = utils.resolve_invite(invite)
await self.http.delete_invite(resolved.code) data = await self.http.delete_invite(resolved.code)
return Invite.from_incomplete(state=self._connection, data=data)
# Miscellaneous stuff # Miscellaneous stuff

2
discord/embeds.py

@ -743,7 +743,7 @@ class Embed:
# fmt: off # fmt: off
result = { result = {
key[1:]: getattr(self, key) key[1:]: getattr(self, key)
for key in self.__slots__ for key in Embed.__slots__
if key[0] == '_' and hasattr(self, key) if key[0] == '_' and hasattr(self, key)
} }
# fmt: on # fmt: on

3
discord/ext/commands/parameters.py

@ -109,6 +109,9 @@ class Parameter(inspect.Parameter):
self._fallback = False self._fallback = False
self._displayed_name = displayed_name self._displayed_name = displayed_name
def __repr__(self) -> str:
return f'<{self.__class__.__name__} name={self._name!r} required={self.required}>'
def replace( def replace(
self, self,
*, *,

19
discord/guild.py

@ -1800,6 +1800,7 @@ class Guild(Hashable):
category: Optional[CategoryChannel] = None, category: Optional[CategoryChannel] = None,
slowmode_delay: int = MISSING, slowmode_delay: int = MISSING,
nsfw: bool = MISSING, nsfw: bool = MISSING,
media: bool = MISSING,
overwrites: Mapping[Union[Role, Member, Object], PermissionOverwrite] = MISSING, overwrites: Mapping[Union[Role, Member, Object], PermissionOverwrite] = MISSING,
reason: Optional[str] = None, reason: Optional[str] = None,
default_auto_archive_duration: int = MISSING, default_auto_archive_duration: int = MISSING,
@ -1862,12 +1863,17 @@ class Guild(Hashable):
.. versionadded:: 2.3 .. versionadded:: 2.3
default_layout: :class:`ForumLayoutType` default_layout: :class:`ForumLayoutType`
The default layout for posts in this forum. The default layout for posts in this forum.
This cannot be set if ``media`` is set to ``True``.
.. versionadded:: 2.3 .. versionadded:: 2.3
available_tags: Sequence[:class:`ForumTag`] available_tags: Sequence[:class:`ForumTag`]
The available tags for this forum channel. The available tags for this forum channel.
.. versionadded:: 2.1 .. versionadded:: 2.1
media: :class:`bool`
Whether to create a media forum channel.
.. versionadded:: 2.6
Raises Raises
------- -------
@ -1919,7 +1925,7 @@ class Guild(Hashable):
else: else:
raise ValueError(f'default_reaction_emoji parameter must be either Emoji, PartialEmoji, or str') raise ValueError(f'default_reaction_emoji parameter must be either Emoji, PartialEmoji, or str')
if default_layout is not MISSING: if not media and default_layout is not MISSING:
if not isinstance(default_layout, ForumLayoutType): if not isinstance(default_layout, ForumLayoutType):
raise TypeError( raise TypeError(
f'default_layout parameter must be a ForumLayoutType not {default_layout.__class__.__name__}' f'default_layout parameter must be a ForumLayoutType not {default_layout.__class__.__name__}'
@ -1931,10 +1937,17 @@ class Guild(Hashable):
options['available_tags'] = [t.to_dict() for t in available_tags] options['available_tags'] = [t.to_dict() for t in available_tags]
data = await self._create_channel( data = await self._create_channel(
name=name, overwrites=overwrites, channel_type=ChannelType.forum, category=category, reason=reason, **options name=name,
overwrites=overwrites,
channel_type=ChannelType.forum if not media else ChannelType.media,
category=category,
reason=reason,
**options,
) )
channel = ForumChannel(state=self._state, guild=self, data=data) channel = ForumChannel(
state=self._state, guild=self, data=data # pyright: ignore[reportArgumentType] # it's the correct data
)
# temporarily add to the cache # temporarily add to the cache
self._channels[channel.id] = channel self._channels[channel.id] = channel

2
discord/http.py

@ -1890,7 +1890,7 @@ class HTTPClient:
def invites_from_channel(self, channel_id: Snowflake) -> Response[List[invite.Invite]]: def invites_from_channel(self, channel_id: Snowflake) -> Response[List[invite.Invite]]:
return self.request(Route('GET', '/channels/{channel_id}/invites', channel_id=channel_id)) return self.request(Route('GET', '/channels/{channel_id}/invites', channel_id=channel_id))
def delete_invite(self, invite_id: str, *, reason: Optional[str] = None) -> Response[None]: def delete_invite(self, invite_id: str, *, reason: Optional[str] = None) -> Response[invite.Invite]:
return self.request(Route('DELETE', '/invites/{invite_id}', invite_id=invite_id), reason=reason) return self.request(Route('DELETE', '/invites/{invite_id}', invite_id=invite_id), reason=reason)
# Role management # Role management

3
discord/interactions.py

@ -712,6 +712,9 @@ class InteractionCallbackResponse(Generic[ClientT]):
self.type: InteractionResponseType = type self.type: InteractionResponseType = type
self._update(data) self._update(data)
def __repr__(self) -> str:
return f'<InteractionCallbackResponse id={self.id} type={self.type!r}>'
def _update(self, data: InteractionCallbackPayload) -> None: def _update(self, data: InteractionCallbackPayload) -> None:
interaction = data['interaction'] interaction = data['interaction']

5
discord/invite.py

@ -546,7 +546,7 @@ class Invite(Hashable):
return self return self
async def delete(self, *, reason: Optional[str] = None) -> None: async def delete(self, *, reason: Optional[str] = None) -> Self:
"""|coro| """|coro|
Revokes the instant invite. Revokes the instant invite.
@ -568,4 +568,5 @@ class Invite(Hashable):
Revoking the invite failed. Revoking the invite failed.
""" """
await self._state.http.delete_invite(self.code, reason=reason) data = await self._state.http.delete_invite(self.code, reason=reason)
return self.from_incomplete(state=self._state, data=data)

3
discord/message.py

@ -989,6 +989,9 @@ class MessageApplication:
self._icon: Optional[str] = data['icon'] self._icon: Optional[str] = data['icon']
self._cover_image: Optional[str] = data.get('cover_image') self._cover_image: Optional[str] = data.get('cover_image')
def __str__(self) -> str:
return self.name
def __repr__(self) -> str: def __repr__(self) -> str:
return f'<MessageApplication id={self.id} name={self.name!r}>' return f'<MessageApplication id={self.id} name={self.name!r}>'

Loading…
Cancel
Save