aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2016-02-13 22:34:38 -0500
committerRapptz <[email protected]>2016-02-13 22:34:38 -0500
commit530fbe78b8c850c08999998c0f6d58edbd0b153b (patch)
treebe2889ad7b428a0966acc2d5f1c47cece57f3cd4
parentAdd Server.member_count property for actual member count. (diff)
downloaddiscord.py-530fbe78b8c850c08999998c0f6d58edbd0b153b.tar.xz
discord.py-530fbe78b8c850c08999998c0f6d58edbd0b153b.zip
Handle case where PRESENCE_UPDATE adds members to cache.
When we don't request offline members, members that are going from offline to online in the server will become available via the PRESENCE_UPDATE event. This should be transparent to the user since technically the member exists in the server and thus on_member_update is used instead of on_member_join.
-rw-r--r--discord/state.py52
1 files changed, 31 insertions, 21 deletions
diff --git a/discord/state.py b/discord/state.py
index 644f9a17..c929d8ff 100644
--- a/discord/state.py
+++ b/discord/state.py
@@ -134,25 +134,32 @@ class ConnectionState:
def parse_presence_update(self, data):
server = self._get_server(data.get('guild_id'))
- if server is not None:
- status = data.get('status')
- user = data['user']
- member_id = user['id']
- member = server.get_member(member_id)
- if member is not None:
- old_member = copy.copy(member)
- member.status = data.get('status')
- try:
- member.status = Status(member.status)
- except:
- pass
-
- game = data.get('game', {})
- member.game = Game(**game) if game else None
- member.name = user.get('username', member.name)
- member.avatar = user.get('avatar', member.avatar)
+ if server is None:
+ return
- self.dispatch('member_update', old_member, member)
+ status = data.get('status')
+ user = data['user']
+ member_id = user['id']
+ member = server.get_member(member_id)
+ if member is None:
+ # if the member is not in cache then it's being "lazily"
+ # loaded due to large_threshold so we need to add it into
+ # the cache and then update that instead.
+ member = self._add_member(server, data)
+
+ old_member = copy.copy(member)
+ member.status = data.get('status')
+ try:
+ member.status = Status(member.status)
+ except:
+ pass
+
+ game = data.get('game', {})
+ member.game = Game(**game) if game else None
+ member.name = user.get('username', member.name)
+ member.avatar = user.get('avatar', member.avatar)
+
+ self.dispatch('member_update', old_member, member)
def parse_user_update(self, data):
self.user = User(**data)
@@ -192,9 +199,7 @@ class ConnectionState:
self.dispatch('channel_create', channel)
- def parse_guild_member_add(self, data):
- server = self._get_server(data.get('guild_id'))
-
+ def _add_member(self, server, data):
roles = [server.default_role]
for roleid in data.get('roles', []):
role = utils.get(server.roles, id=roleid)
@@ -204,6 +209,11 @@ class ConnectionState:
data['roles'] = roles
member = Member(server=server, **data)
server._add_member(member)
+ return member
+
+ def parse_guild_member_add(self, data):
+ server = self._get_server(data.get('guild_id'))
+ self._add_member(server, data)
server._member_count += 1
self.dispatch('member_join', member)