diff options
Diffstat (limited to 'discord/audit_logs.py')
| -rw-r--r-- | discord/audit_logs.py | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/discord/audit_logs.py b/discord/audit_logs.py index a56f08fd..f1bba6ef 100644 --- a/discord/audit_logs.py +++ b/discord/audit_logs.py @@ -24,7 +24,7 @@ DEALINGS IN THE SOFTWARE. from __future__ import annotations -from typing import TYPE_CHECKING, Any, Callable, ClassVar, Dict, Generator, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Any, Callable, ClassVar, Dict, Generator, List, Optional, Tuple, Type, TypeVar, Union from . import enums, utils from .asset import Asset @@ -57,18 +57,6 @@ if TYPE_CHECKING: from .user import User -def _transform_verification_level(entry: AuditLogEntry, data: int) -> enums.VerificationLevel: - return enums.try_enum(enums.VerificationLevel, data) - - -def _transform_default_notifications(entry: AuditLogEntry, data: int) -> enums.NotificationLevel: - return enums.try_enum(enums.NotificationLevel, data) - - -def _transform_explicit_content_filter(entry: AuditLogEntry, data: int) -> enums.ContentFilter: - return enums.try_enum(enums.ContentFilter, data) - - def _transform_permissions(entry: AuditLogEntry, data: str) -> Permissions: return Permissions(int(data)) @@ -124,18 +112,6 @@ def _transform_overwrites( return overwrites -def _transform_channeltype(entry: AuditLogEntry, data: int) -> enums.ChannelType: - return enums.try_enum(enums.ChannelType, data) - - -def _transform_voiceregion(entry: AuditLogEntry, data: int) -> enums.VoiceRegion: - return enums.try_enum(enums.VoiceRegion, data) - - -def _transform_video_quality_mode(entry: AuditLogEntry, data: int) -> enums.VideoQualityMode: - return enums.try_enum(enums.VideoQualityMode, data) - - def _transform_icon(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: if data is None: return None @@ -145,10 +121,10 @@ def _transform_icon(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset def _transform_avatar(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: if data is None: return None - return Asset._from_avatar(entry._state, entry._target_id, data) + return Asset._from_avatar(entry._state, entry._target_id, data) # type: ignore -def _guild_hash_transformer(path: str) -> Callable[['AuditLogEntry', Optional[str]], Optional[Asset]]: +def _guild_hash_transformer(path: str) -> Callable[[AuditLogEntry, Optional[str]], Optional[Asset]]: def _transform(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: if data is None: return None @@ -157,6 +133,16 @@ def _guild_hash_transformer(path: str) -> Callable[['AuditLogEntry', Optional[st return _transform +T = TypeVar('T', bound=enums.Enum) + + +def _enum_transformer(enum: Type[T]) -> Callable[[AuditLogEntry, int], T]: + def _transform(entry: AuditLogEntry, data: int) -> T: + return enums.try_enum(enum, data) + + return _transform + + class AuditLogDiff: def __len__(self) -> int: return len(self.__dict__) @@ -183,8 +169,8 @@ Transformer = Callable[["AuditLogEntry", Any], Any] class AuditLogChanges: # fmt: off TRANSFORMERS: ClassVar[Dict[str, Tuple[Optional[str], Optional[Transformer]]]] = { - 'verification_level': (None, _transform_verification_level), - 'explicit_content_filter': (None, _transform_explicit_content_filter), + 'verification_level': (None, _enum_transformer(enums.VerificationLevel)), + 'explicit_content_filter': (None, _enum_transformer(enums.ContentFilter)), 'allow': (None, _transform_permissions), 'deny': (None, _transform_permissions), 'permissions': (None, _transform_permissions), @@ -205,11 +191,12 @@ class AuditLogChanges: 'icon_hash': ('icon', _transform_icon), 'avatar_hash': ('avatar', _transform_avatar), 'rate_limit_per_user': ('slowmode_delay', None), - 'default_message_notifications': ('default_notifications', _transform_default_notifications), - 'region': (None, _transform_voiceregion), - 'rtc_region': (None, _transform_voiceregion), - 'video_quality_mode': (None, _transform_video_quality_mode), - 'type': (None, _transform_channeltype), + 'default_message_notifications': ('default_notifications', _enum_transformer(enums.NotificationLevel)), + 'region': (None, _enum_transformer(enums.VoiceRegion)), + 'rtc_region': (None, _enum_transformer(enums.VoiceRegion)), + 'video_quality_mode': (None, _enum_transformer(enums.VideoQualityMode)), + 'privacy_level': (None, _enum_transformer(enums.StagePrivacyLevel)), + 'type': (None, _enum_transformer(enums.ChannelType)), } # fmt: on @@ -308,6 +295,10 @@ class _AuditLogProxyPinAction: message_id: int +class _AuditLogProxyStageInstanceAction: + channel: abc.GuildChannel + + class AuditLogEntry(Hashable): r"""Represents an Audit Log entry. @@ -404,6 +395,10 @@ class AuditLogEntry(Hashable): role = Object(id=instance_id) role.name = self.extra.get('role_name') # type: ignore self.extra: Role = role + elif self.action.name.startswith('stage_instance'): + channel_id = int(self.extra['channel_id']) + elems = {'channel': self.guild.get_channel(channel_id) or Object(id=channel_id)} + self.extra: _AuditLogProxyStageInstanceAction = type('_AuditLogProxy', (), elems)() # fmt: off self.extra: Union[ @@ -411,6 +406,7 @@ class AuditLogEntry(Hashable): _AuditLogProxyMemberMoveOrMessageDelete, _AuditLogProxyMemberDisconnect, _AuditLogProxyPinAction, + _AuditLogProxyStageInstanceAction, Member, User, None, Role, ] |