Browse Source

Add support for ApplicationFlags

pull/6755/head
Nadir Chowdhury 4 years ago
committed by GitHub
parent
commit
631a0b1e13
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      discord/client.py
  2. 82
      discord/flags.py
  3. 4
      discord/state.py
  4. 8
      docs/api.rst

9
discord/client.py

@ -41,6 +41,7 @@ from .enums import ChannelType
from .mentions import AllowedMentions from .mentions import AllowedMentions
from .errors import * from .errors import *
from .enums import Status, VoiceRegion from .enums import Status, VoiceRegion
from .flags import ApplicationFlags
from .gateway import * from .gateway import *
from .activity import BaseActivity, create_activity from .activity import BaseActivity, create_activity
from .voice_client import VoiceClient from .voice_client import VoiceClient
@ -290,6 +291,14 @@ class Client:
""" """
return self._connection.application_id return self._connection.application_id
@property
def application_flags(self) -> ApplicationFlags:
""":class:`ApplicationFlags`: The client's application flags.
.. versionadded: 2.0
"""
return self._connection.application_flags # type: ignore
def is_ready(self): def is_ready(self):
""":class:`bool`: Specifies if the client's internal cache is ready for use.""" """:class:`bool`: Specifies if the client's internal cache is ready for use."""
return self._ready.is_set() return self._ready.is_set()

82
discord/flags.py

@ -34,11 +34,13 @@ __all__ = (
'PublicUserFlags', 'PublicUserFlags',
'Intents', 'Intents',
'MemberCacheFlags', 'MemberCacheFlags',
'ApplicationFlags',
) )
FV = TypeVar('FV', bound='flag_value') FV = TypeVar('FV', bound='flag_value')
BF = TypeVar('BF', bound='BaseFlags') BF = TypeVar('BF', bound='BaseFlags')
class flag_value(Generic[BF]): class flag_value(Generic[BF]):
def __init__(self, func: Callable[[Any], int]): def __init__(self, func: Callable[[Any], int]):
self.flag = func(None) self.flag = func(None)
@ -63,16 +65,20 @@ class flag_value(Generic[BF]):
def __repr__(self): def __repr__(self):
return f'<flag_value flag={self.flag!r}>' return f'<flag_value flag={self.flag!r}>'
class alias_flag_value(flag_value): class alias_flag_value(flag_value):
pass pass
def fill_with_flags(*, inverted: bool = False): def fill_with_flags(*, inverted: bool = False):
def decorator(cls: Type[BF]): def decorator(cls: Type[BF]):
# fmt: off
cls.VALID_FLAGS = { cls.VALID_FLAGS = {
name: value.flag name: value.flag
for name, value in cls.__dict__.items() for name, value in cls.__dict__.items()
if isinstance(value, flag_value) if isinstance(value, flag_value)
} }
# fmt: on
if inverted: if inverted:
max_bits = max(cls.VALID_FLAGS.values()).bit_length() max_bits = max(cls.VALID_FLAGS.values()).bit_length()
@ -81,8 +87,10 @@ def fill_with_flags(*, inverted: bool = False):
cls.DEFAULT_VALUE = 0 cls.DEFAULT_VALUE = 0
return cls return cls
return decorator return decorator
# n.b. flags must inherit from this and use the decorator above # n.b. flags must inherit from this and use the decorator above
class BaseFlags: class BaseFlags:
VALID_FLAGS: ClassVar[Dict[str, int]] VALID_FLAGS: ClassVar[Dict[str, int]]
@ -136,6 +144,7 @@ class BaseFlags:
else: else:
raise TypeError(f'Value to set for {self.__class__.__name__} must be a bool.') raise TypeError(f'Value to set for {self.__class__.__name__} must be a bool.')
@fill_with_flags(inverted=True) @fill_with_flags(inverted=True)
class SystemChannelFlags(BaseFlags): class SystemChannelFlags(BaseFlags):
r"""Wraps up a Discord system channel flag value. r"""Wraps up a Discord system channel flag value.
@ -270,6 +279,7 @@ class MessageFlags(BaseFlags):
""" """
return 16 return 16
@fill_with_flags() @fill_with_flags()
class PublicUserFlags(BaseFlags): class PublicUserFlags(BaseFlags):
r"""Wraps up the Discord User Public flags. r"""Wraps up the Discord User Public flags.
@ -808,6 +818,7 @@ class Intents(BaseFlags):
""" """
return 1 << 14 return 1 << 14
@fill_with_flags() @fill_with_flags()
class MemberCacheFlags(BaseFlags): class MemberCacheFlags(BaseFlags):
"""Controls the library's cache policy when it comes to members. """Controls the library's cache policy when it comes to members.
@ -936,3 +947,74 @@ class MemberCacheFlags(BaseFlags):
@property @property
def _voice_only(self): def _voice_only(self):
return self.value == 1 return self.value == 1
@fill_with_flags()
class ApplicationFlags(BaseFlags):
r"""Wraps up the Discord Application flags.
.. container:: operations
.. describe:: x == y
Checks if two ApplicationFlags are equal.
.. describe:: x != y
Checks if two ApplicationFlags are not equal.
.. 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.
.. versionadded:: 2.0
Attributes
-----------
value: :class:`int`
The raw value. You should query flags via the properties
rather than using this raw value.
"""
@flag_value
def gateway_presence(self):
""":class:`bool`: Returns ``True`` if the application is verified and is allowed to
receive presence information over the gateway.
"""
return 1 << 12
@flag_value
def gateway_presence_limited(self):
""":class:`bool`: Returns ``True`` if the application is allowed to receive limited
presence information over the gateway.
"""
return 1 << 13
@flag_value
def gateway_guild_members(self):
""":class:`bool`: Returns ``True`` if the application is verified and is allowed to
receive guild members information over the gateway.
"""
return 1 << 14
@flag_value
def gateway_guild_members_limited(self):
""":class:`bool`: Returns ``True`` if the application is allowed to receive limited
guild members information over the gateway.
"""
return 1 << 15
@flag_value
def verification_pending_guild_limit(self):
""":class:`bool`: Returns ``True`` if the application is currently pending verification
and has hit the guild limit.
"""
return 1 << 16
@flag_value
def embedded(self):
""":class:`bool`: Returns ``True`` if the application is embedded within the Discord client."""
return 1 << 17

4
discord/state.py

@ -48,7 +48,7 @@ from .member import Member
from .role import Role from .role import Role
from .enums import ChannelType, try_enum, Status from .enums import ChannelType, try_enum, Status
from . import utils from . import utils
from .flags import Intents, MemberCacheFlags from .flags import ApplicationFlags, Intents, MemberCacheFlags
from .object import Object from .object import Object
from .invite import Invite from .invite import Invite
from .interactions import Interaction from .interactions import Interaction
@ -452,6 +452,7 @@ class ConnectionState:
pass pass
else: else:
self.application_id = utils._get_as_snowflake(application, 'id') self.application_id = utils._get_as_snowflake(application, 'id')
self.application_flags = ApplicationFlags._from_value(application['flags'])
for guild_data in data['guilds']: for guild_data in data['guilds']:
self._add_guild_from_data(guild_data) self._add_guild_from_data(guild_data)
@ -1144,6 +1145,7 @@ class AutoShardedConnectionState(ConnectionState):
pass pass
else: else:
self.application_id = utils._get_as_snowflake(application, 'id') self.application_id = utils._get_as_snowflake(application, 'id')
self.application_flags = ApplicationFlags._from_value(application['flags'])
for guild_data in data['guilds']: for guild_data in data['guilds']:
self._add_guild_from_data(guild_data) self._add_guild_from_data(guild_data)

8
docs/api.rst

@ -3119,6 +3119,14 @@ MemberCacheFlags
.. autoclass:: MemberCacheFlags .. autoclass:: MemberCacheFlags
:members: :members:
ApplicationFlags
~~~~~~~~~~~~~~~~~
.. attributetable:: ApplicationFlags
.. autoclass:: ApplicationFlags
:members:
File File
~~~~~ ~~~~~

Loading…
Cancel
Save