From 25a1d8c3004d061946533fffb901b225c38fdd66 Mon Sep 17 00:00:00 2001
From: Rapptz <rapptz@gmail.com>
Date: Fri, 30 Jun 2017 18:49:49 -0400
Subject: [PATCH] Add support for user flags in Profile.

---
 discord/client.py |  5 +++--
 discord/enums.py  |  7 ++++++-
 discord/user.py   | 30 +++++++++++++++++++++++++++---
 docs/api.rst      | 12 ++++++++++++
 4 files changed, 48 insertions(+), 6 deletions(-)

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