diff --git a/discord/client.py b/discord/client.py index f61f48e8f..6304fb4e9 100644 --- a/discord/client.py +++ b/discord/client.py @@ -974,8 +974,9 @@ class Client: since = data.get('premium_since') mutual_guilds = list(filter(None, map(transform, data.get('mutual_guilds', [])))) - return Profile(premium=since is not None, + user = data['user'] + return Profile(flags=user.get('flags', 0), premium_since=utils.parse_time(since), mutual_guilds=mutual_guilds, - user=User(data=data['user'], state=state), + user=User(data=user, state=state), connected_accounts=data['connected_accounts']) diff --git a/discord/enums.py b/discord/enums.py index 51ceba8e8..a2279b677 100644 --- a/discord/enums.py +++ b/discord/enums.py @@ -28,7 +28,7 @@ from enum import Enum __all__ = ['ChannelType', 'MessageType', 'VoiceRegion', 'VerificationLevel', 'ContentFilter', 'Status', 'DefaultAvatar', 'RelationshipType', - 'AuditLogAction', 'AuditLogActionCategory', ] + 'AuditLogAction', 'AuditLogActionCategory', 'UserFlags', ] class ChannelType(Enum): text = 0 @@ -204,6 +204,11 @@ class AuditLogAction(Enum): elif v < 80: return 'message' +class UserFlags(Enum): + staff = 1 + partner = 2 + hypesquad = 4 + def try_enum(cls, val): """A function that tries to turn the value into enum ``cls``. diff --git a/discord/user.py b/discord/user.py index 634e821c2..cecd1c518 100644 --- a/discord/user.py +++ b/discord/user.py @@ -25,7 +25,7 @@ DEALINGS IN THE SOFTWARE. """ from .utils import snowflake_time, _bytes_to_base64_data, parse_time -from .enums import DefaultAvatar, RelationshipType +from .enums import DefaultAvatar, RelationshipType, UserFlags from .errors import ClientException from collections import namedtuple @@ -33,7 +33,31 @@ from collections import namedtuple import discord.abc import asyncio -Profile = namedtuple('Profile', 'premium user mutual_guilds connected_accounts premium_since') +class Profile(namedtuple('Profile', 'flags user mutual_guilds connected_accounts premium_since')): + __slots__ = () + + @property + def nitro(self): + return self.premium_since is not None + + premium = nitro + + def _has_flag(self, o): + v = o.value + return (self.flags & v) == v + + @property + def staff(self): + return self._has_flag(UserFlags.staff) + + @property + def hypesquad(self): + return self._has_flag(UserFlags.hypesquad) + + @property + def partner(self): + return self._has_flag(UserFlags.partner) + _BaseUser = discord.abc.User @@ -561,7 +585,7 @@ class User(BaseUser, discord.abc.Messageable): since = data.get('premium_since') mutual_guilds = list(filter(None, map(transform, data.get('mutual_guilds', [])))) - return Profile(premium=since is not None, + return Profile(flags=data['user'].get('flags', 0), premium_since=parse_time(since), mutual_guilds=mutual_guilds, user=self, diff --git a/docs/api.rst b/docs/api.rst index 53ce40515..bdddb6547 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -596,10 +596,22 @@ Profile .. attribute:: premium A boolean indicating if the user has premium (i.e. Discord Nitro). + .. attribute:: nitro + + An alias for :attr:`premium`. .. attribute:: premium_since A naive UTC datetime indicating how long the user has been premium since. This could be ``None`` if not applicable. + .. attribute:: staff + + A boolean indicating if the user is Discord Staff. + .. attribute:: partner + + A boolean indicating if the user is a Discord Partner. + .. attribute:: hypesquad + + A boolean indicating if the user is in Discord HypeSquad. .. attribute:: mutual_guilds A list of :class:`Guild` that the :class:`ClientUser` shares with this