Browse Source

Change abc.GuildChannel.overwrites to have Object keys if cache failed

Ultimately despite it not being the prettiest, Object keys ended up
being the sanest solution to this without destroying ergonomics.
pull/10109/head
Rapptz 3 years ago
committed by dolfies
parent
commit
fec36318f7
  1. 19
      discord/abc.py
  2. 14
      discord/channel.py
  3. 1
      docs/migrating.rst

19
discord/abc.py

@ -574,6 +574,8 @@ class GuildChannel:
if isinstance(target, Role): if isinstance(target, Role):
payload['type'] = _Overwrites.ROLE payload['type'] = _Overwrites.ROLE
elif isinstance(target, Object):
payload['type'] = _Overwrites.ROLE if target.type is Role else _Overwrites.MEMBER
else: else:
payload['type'] = _Overwrites.MEMBER payload['type'] = _Overwrites.MEMBER
@ -664,14 +666,13 @@ class GuildChannel:
""" """
return f'https://discord.com/channels/{self.guild.id}/{self.id}' return f'https://discord.com/channels/{self.guild.id}/{self.id}'
def overwrites_for(self, obj: Union[Role, User]) -> PermissionOverwrite: def overwrites_for(self, obj: Union[Role, User, Object]) -> PermissionOverwrite:
"""Returns the channel-specific overwrites for a member or a role. """Returns the channel-specific overwrites for a member or a role.
Parameters Parameters
----------- -----------
obj: Union[:class:`~discord.Role`, :class:`~discord.abc.User`] obj: Union[:class:`~discord.Role`, :class:`~discord.abc.User`, :class:`~discord.Object`]
The role or user denoting The role or user denoting whose overwrite to get.
whose overwrite to get.
Returns Returns
--------- ---------
@ -695,16 +696,19 @@ class GuildChannel:
return PermissionOverwrite() return PermissionOverwrite()
@property @property
def overwrites(self) -> Dict[Union[Object, Role, Member], PermissionOverwrite]: def overwrites(self) -> Dict[Union[Role, Member, Object], PermissionOverwrite]:
"""Returns all of the channel's overwrites. """Returns all of the channel's overwrites.
This is returned as a dictionary where the key contains the target which This is returned as a dictionary where the key contains the target which
can be either a :class:`~discord.Role` or a :class:`~discord.Member` and the value is the can be either a :class:`~discord.Role` or a :class:`~discord.Member` and the value is the
overwrite as a :class:`~discord.PermissionOverwrite`. overwrite as a :class:`~discord.PermissionOverwrite`.
.. versionchanged:: 2.0
Overwrites can now be type-aware :class:`~discord.Object` in case of cache lookup failure
Returns Returns
-------- --------
Dict[Union[:class:`~discord.Object`, :class:`~discord.Role`, :class:`~discord.Member`], :class:`~discord.PermissionOverwrite`] Dict[Union[:class:`~discord.Role`, :class:`~discord.Member`, :class:`~discord.Object`], :class:`~discord.PermissionOverwrite`]
The channel's permission overwrites. The channel's permission overwrites.
""" """
ret = {} ret = {}
@ -720,7 +724,8 @@ class GuildChannel:
target = self.guild.get_member(ow.id) target = self.guild.get_member(ow.id)
if target is None: if target is None:
target = Object(ow.id) target_type = Role if ow.is_role() else User
target = Object(id=ow.id, type=target_type) # type: ignore
ret[target] = overwrite ret[target] = overwrite
return ret return ret

14
discord/channel.py

@ -37,6 +37,7 @@ from typing import (
TYPE_CHECKING, TYPE_CHECKING,
Sequence, Sequence,
Tuple, Tuple,
TypeVar,
Union, Union,
overload, overload,
) )
@ -74,6 +75,7 @@ if TYPE_CHECKING:
from .types.threads import ThreadArchiveDuration from .types.threads import ThreadArchiveDuration
from .client import Client from .client import Client
from .role import Role from .role import Role
from .object import Object
from .member import Member, VoiceState from .member import Member, VoiceState
from .abc import Snowflake, SnowflakeTime, T as ConnectReturn from .abc import Snowflake, SnowflakeTime, T as ConnectReturn
from .message import Message, PartialMessage from .message import Message, PartialMessage
@ -98,6 +100,8 @@ if TYPE_CHECKING:
from .types.snowflake import SnowflakeList from .types.snowflake import SnowflakeList
OverwriteKeyT = TypeVar('OverwriteKeyT', Role, BaseUser, Object, Union[Role, Member, Object])
class ThreadWithMessage(NamedTuple): class ThreadWithMessage(NamedTuple):
thread: Thread thread: Thread
@ -289,7 +293,7 @@ class TextChannel(discord.abc.Messageable, discord.abc.GuildChannel, Hashable):
slowmode_delay: int = ..., slowmode_delay: int = ...,
default_auto_archive_duration: ThreadArchiveDuration = ..., default_auto_archive_duration: ThreadArchiveDuration = ...,
type: ChannelType = ..., type: ChannelType = ...,
overwrites: Mapping[Union[Role, Member, Snowflake], PermissionOverwrite] = ..., overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ...,
) -> TextChannel: ) -> TextChannel:
... ...
@ -1274,7 +1278,7 @@ class VoiceChannel(discord.abc.Messageable, VocalGuildChannel):
position: int = ..., position: int = ...,
sync_permissions: int = ..., sync_permissions: int = ...,
category: Optional[CategoryChannel] = ..., category: Optional[CategoryChannel] = ...,
overwrites: Mapping[Union[Role, Member], PermissionOverwrite] = ..., overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ...,
rtc_region: Optional[str] = ..., rtc_region: Optional[str] = ...,
video_quality_mode: VideoQualityMode = ..., video_quality_mode: VideoQualityMode = ...,
reason: Optional[str] = ..., reason: Optional[str] = ...,
@ -1570,7 +1574,7 @@ class StageChannel(VocalGuildChannel):
position: int = ..., position: int = ...,
sync_permissions: int = ..., sync_permissions: int = ...,
category: Optional[CategoryChannel] = ..., category: Optional[CategoryChannel] = ...,
overwrites: Mapping[Union[Role, Member], PermissionOverwrite] = ..., overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ...,
rtc_region: Optional[str] = ..., rtc_region: Optional[str] = ...,
video_quality_mode: VideoQualityMode = ..., video_quality_mode: VideoQualityMode = ...,
reason: Optional[str] = ..., reason: Optional[str] = ...,
@ -1739,7 +1743,7 @@ class CategoryChannel(discord.abc.GuildChannel, Hashable):
name: str = ..., name: str = ...,
position: int = ..., position: int = ...,
nsfw: bool = ..., nsfw: bool = ...,
overwrites: Mapping[Union[Role, Member], PermissionOverwrite] = ..., overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ...,
reason: Optional[str] = ..., reason: Optional[str] = ...,
) -> CategoryChannel: ) -> CategoryChannel:
... ...
@ -2047,7 +2051,7 @@ class ForumChannel(discord.abc.GuildChannel, Hashable):
slowmode_delay: int = ..., slowmode_delay: int = ...,
default_auto_archive_duration: ThreadArchiveDuration = ..., default_auto_archive_duration: ThreadArchiveDuration = ...,
type: ChannelType = ..., type: ChannelType = ...,
overwrites: Mapping[Union[Role, Member, Snowflake], PermissionOverwrite] = ..., overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ...,
) -> ForumChannel: ) -> ForumChannel:
... ...

1
docs/migrating.rst

@ -1027,6 +1027,7 @@ The following changes have been made:
- :attr:`AuditLogEntry.target` may now be a :class:`PartialMessageable`. - :attr:`AuditLogEntry.target` may now be a :class:`PartialMessageable`.
- :attr:`PartialMessage.channel` may now be a :class:`PartialMessageable`. - :attr:`PartialMessage.channel` may now be a :class:`PartialMessageable`.
- :attr:`Guild.preferred_locale` is now of type :class:`Locale`. - :attr:`Guild.preferred_locale` is now of type :class:`Locale`.
- :attr:`abc.GuildChannel.overwrites` keys can now have :class:`Object` in them.
Removals Removals
---------- ----------

Loading…
Cancel
Save