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

6
discord/app_commands/installs.py

@ -57,6 +57,9 @@ class AppInstallationType:
self._guild: Optional[bool] = guild
self._user: Optional[bool] = user
def __repr__(self):
return f'<AppInstallationType guild={self.guild!r} user={self.user!r}>'
@property
def guild(self) -> bool:
""":class:`bool`: Whether the integration is a guild install."""
@ -142,6 +145,9 @@ class AppCommandContext:
self._dm_channel: Optional[bool] = dm_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
def guild(self) -> bool:
""":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
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:
return {
'id': self.target.id,
@ -1106,6 +1109,9 @@ class GuildAppCommandPermissions:
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]:
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 ..threads import Thread
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 ..role import Role
from ..member import Member
@ -631,7 +631,7 @@ class BaseChannelTransformer(Transformer[ClientT]):
display_name = channel_types[0].__name__
types = CHANNEL_TO_TYPES[channel_types[0]]
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 = []
for t in channel_types:
@ -689,6 +689,7 @@ CHANNEL_TO_TYPES: Dict[Any, List[ChannelType]] = {
ChannelType.news,
ChannelType.category,
ChannelType.forum,
ChannelType.media,
],
GuildChannel: [
ChannelType.stage_voice,
@ -697,6 +698,7 @@ CHANNEL_TO_TYPES: Dict[Any, List[ChannelType]] = {
ChannelType.news,
ChannelType.category,
ChannelType.forum,
ChannelType.media,
],
AppCommandThread: [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],
TextChannel: [ChannelType.text, ChannelType.news],
CategoryChannel: [ChannelType.category],
ForumChannel: [ChannelType.forum],
ForumChannel: [ChannelType.forum, ChannelType.media],
}
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)
async def delete_invite(self, invite: Union[Invite, str], /) -> None:
async def delete_invite(self, invite: Union[Invite, str], /) -> Invite:
"""|coro|
Revokes an :class:`.Invite`, URL, or ID to an invite.
@ -2578,7 +2578,8 @@ class Client:
"""
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

2
discord/embeds.py

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

3
discord/ext/commands/parameters.py

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

19
discord/guild.py

@ -1800,6 +1800,7 @@ class Guild(Hashable):
category: Optional[CategoryChannel] = None,
slowmode_delay: int = MISSING,
nsfw: bool = MISSING,
media: bool = MISSING,
overwrites: Mapping[Union[Role, Member, Object], PermissionOverwrite] = MISSING,
reason: Optional[str] = None,
default_auto_archive_duration: int = MISSING,
@ -1862,12 +1863,17 @@ class Guild(Hashable):
.. versionadded:: 2.3
default_layout: :class:`ForumLayoutType`
The default layout for posts in this forum.
This cannot be set if ``media`` is set to ``True``.
.. versionadded:: 2.3
available_tags: Sequence[:class:`ForumTag`]
The available tags for this forum channel.
.. versionadded:: 2.1
media: :class:`bool`
Whether to create a media forum channel.
.. versionadded:: 2.6
Raises
-------
@ -1919,7 +1925,7 @@ class Guild(Hashable):
else:
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):
raise TypeError(
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]
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
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]]:
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)
# Role management

3
discord/interactions.py

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

5
discord/invite.py

@ -546,7 +546,7 @@ class Invite(Hashable):
return self
async def delete(self, *, reason: Optional[str] = None) -> None:
async def delete(self, *, reason: Optional[str] = None) -> Self:
"""|coro|
Revokes the instant invite.
@ -568,4 +568,5 @@ class Invite(Hashable):
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._cover_image: Optional[str] = data.get('cover_image')
def __str__(self) -> str:
return self.name
def __repr__(self) -> str:
return f'<MessageApplication id={self.id} name={self.name!r}>'

Loading…
Cancel
Save