diff --git a/discord/flags.py b/discord/flags.py index 001dcfce52ca..116ac8e8f706 100644 --- a/discord/flags.py +++ b/discord/flags.py @@ -58,6 +58,7 @@ 'ChannelFlags', 'AutoModPresets', 'MemberFlags', + 'AttachmentFlags', ) BF = TypeVar('BF', bound='BaseFlags') @@ -1824,3 +1825,76 @@ def bypasses_verification(self): def started_onboarding(self): """:class:`bool`: Returns ``True`` if the member has started onboarding.""" return 1 << 3 + + +@fill_with_flags() +class AttachmentFlags(BaseFlags): + r"""Wraps up the Discord Attachment flags + + .. versionadded:: 2.4 + + .. container:: operations + + .. describe:: x == y + + Checks if two AttachmentFlags are equal. + + .. describe:: x != y + + Checks if two AttachmentFlags are not equal. + + .. describe:: x | y, x |= y + + Returns a AttachmentFlags instance with all enabled flags from + both x and y. + + .. describe:: x & y, x &= y + + Returns a AttachmentFlags instance with only flags enabled on + both x and y. + + .. describe:: x ^ y, x ^= y + + Returns a AttachmentFlags instance with only flags enabled on + only one of x or y, not on both. + + .. describe:: ~x + + Returns a AttachmentFlags instance with all flags inverted from x. + + .. describe:: hash(x) + + Return the flag's hash. + + .. describe:: iter(x) + + Returns an iterator of ``(name, value)`` pairs. This allows it + to be, for example, constructed as a dict or a list of pairs. + Note that aliases are not shown. + + .. describe:: bool(b) + + Returns whether any flag is set to ``True``. + + + Attributes + ----------- + value: :class:`int` + The raw value. You should query flags via the properties + rather than using this raw value. + """ + + @flag_value + def clip(self): + """:class:`bool`: Returns ``True`` if the attachment is a clip.""" + return 1 << 0 + + @flag_value + def thumbnail(self): + """:class:`bool`: Returns ``True`` if the attachment is a thumbnail.""" + return 1 << 1 + + @flag_value + def remix(self): + """:class:`bool`: Returns ``True`` if the attachment has been edited using the remix feature.""" + return 1 << 2 diff --git a/discord/message.py b/discord/message.py index 338d9c33eb4a..c40fed6a6dad 100644 --- a/discord/message.py +++ b/discord/message.py @@ -54,7 +54,7 @@ from .components import _component_factory from .embeds import Embed from .member import Member -from .flags import MessageFlags +from .flags import MessageFlags, AttachmentFlags from .file import File from .utils import escape_mentions, MISSING from .http import handle_message_parameters @@ -207,6 +207,7 @@ class Attachment(Hashable): 'ephemeral', 'duration', 'waveform', + '_flags', ) def __init__(self, *, data: AttachmentPayload, state: ConnectionState): @@ -226,6 +227,13 @@ def __init__(self, *, data: AttachmentPayload, state: ConnectionState): waveform = data.get('waveform') self.waveform: Optional[bytes] = utils._base64_to_bytes(waveform) if waveform is not None else None + self._flags: int = data.get('flags', 0) + + @property + def flags(self) -> AttachmentFlags: + """:class:`AttachmentFlags`: The attachment's flags.""" + return AttachmentFlags._from_value(self._flags) + def is_spoiler(self) -> bool: """:class:`bool`: Whether this attachment contains a spoiler.""" return self.filename.startswith('SPOILER_') diff --git a/discord/types/message.py b/discord/types/message.py index 1157100fcf91..48b301ca2d8e 100644 --- a/discord/types/message.py +++ b/discord/types/message.py @@ -70,6 +70,7 @@ class Attachment(TypedDict): ephemeral: NotRequired[bool] duration_secs: NotRequired[float] waveform: NotRequired[str] + flags: NotRequired[int] MessageActivityType = Literal[1, 2, 3, 5] diff --git a/docs/api.rst b/docs/api.rst index 29bb530ba007..49777d842577 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -4970,6 +4970,14 @@ MemberFlags .. autoclass:: MemberFlags :members: +AttachmentFlags +~~~~~~~~~~~~~~~~ + +.. attributetable:: AttachmentFlags + +.. autoclass:: AttachmentFlags + :members: + ForumTag ~~~~~~~~~