aboutsummaryrefslogtreecommitdiff
path: root/discord/member.py
diff options
context:
space:
mode:
authorMichael H <[email protected]>2020-06-04 23:38:11 -0400
committerGitHub <[email protected]>2020-06-04 23:38:11 -0400
commit7bef78284f744f548653f53791ea0b4f46e664ba (patch)
tree2ec8e178b162a99501dee1259d05d4a108dc6c24 /discord/member.py
parentFix possibility of PartialEmoji.id being a string (diff)
downloaddiscord.py-7bef78284f744f548653f53791ea0b4f46e664ba.tar.xz
discord.py-7bef78284f744f548653f53791ea0b4f46e664ba.zip
Removes the caching behavior of Member.roles
- fixes 4087 - This intentionally uses some internals in both Member.roles and Member.top_role to retain as much performance as possible while removing the cache
Diffstat (limited to 'discord/member.py')
-rw-r--r--discord/member.py19
1 files changed, 7 insertions, 12 deletions
diff --git a/discord/member.py b/discord/member.py
index e25e92e8..8d73417c 100644
--- a/discord/member.py
+++ b/discord/member.py
@@ -161,7 +161,7 @@ class Member(discord.abc.Messageable, _BaseUser):
Nitro boost on the guild, if available. This could be ``None``.
"""
- __slots__ = ('_roles', '_cs_roles', 'joined_at', 'premium_since', '_client_status',
+ __slots__ = ('_roles', 'joined_at', 'premium_since', '_client_status',
'activities', 'guild', 'nick', '_user', '_state')
def __init__(self, *, data, guild, state):
@@ -234,11 +234,6 @@ class Member(discord.abc.Messageable, _BaseUser):
self.activities = member.activities
self._state = member._state
- try:
- del self._cs_roles
- except AttributeError:
- pass
-
# Reference will not be copied unless necessary by PRESENCE_UPDATE
# See below
self._user = member._user
@@ -250,10 +245,6 @@ class Member(discord.abc.Messageable, _BaseUser):
def _update_roles(self, data):
self._roles = utils.SnowflakeList(map(int, data['roles']))
- try:
- del self._cs_roles
- except AttributeError:
- pass
def _update(self, data):
# the nickname change is optional,
@@ -344,7 +335,7 @@ class Member(discord.abc.Messageable, _BaseUser):
"""
return self.colour
- @utils.cached_slot_property('_cs_roles')
+ @property
def roles(self):
"""List[:class:`Role`]: A :class:`list` of :class:`Role` that the member belongs to. Note
that the first element of this list is always the default '@everyone'
@@ -434,7 +425,11 @@ class Member(discord.abc.Messageable, _BaseUser):
This is useful for figuring where a member stands in the role
hierarchy chain.
"""
- return self.roles[-1]
+ guild = self.guild
+ if len(self._roles) == 0:
+ return guild.default_role
+
+ return max(guild.get_role(rid) or guild.default_role for rid in self._roles)
@property
def guild_permissions(self):