From 530fbe78b8c850c08999998c0f6d58edbd0b153b Mon Sep 17 00:00:00 2001 From: Rapptz Date: Sat, 13 Feb 2016 22:34:38 -0500 Subject: [PATCH] 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. --- discord/state.py | 52 +++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/discord/state.py b/discord/state.py index 644f9a179..c929d8ff9 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)