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.
This commit is contained in:
Rapptz 2016-02-13 22:34:38 -05:00
parent 7b135725bc
commit 530fbe78b8

View File

@ -134,12 +134,19 @@ class ConnectionState:
def parse_presence_update(self, data):
server = self._get_server(data.get('guild_id'))
if server is not None:
if server is None:
return
status = data.get('status')
user = data['user']
member_id = user['id']
member = server.get_member(member_id)
if member is not None:
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:
@ -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)