mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-05-13 09:19:48 +00:00
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:
parent
7b135725bc
commit
530fbe78b8
@ -134,25 +134,32 @@ class ConnectionState:
|
|||||||
|
|
||||||
def parse_presence_update(self, data):
|
def parse_presence_update(self, data):
|
||||||
server = self._get_server(data.get('guild_id'))
|
server = self._get_server(data.get('guild_id'))
|
||||||
if server is not None:
|
if server is None:
|
||||||
status = data.get('status')
|
return
|
||||||
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', {})
|
status = data.get('status')
|
||||||
member.game = Game(**game) if game else None
|
user = data['user']
|
||||||
member.name = user.get('username', member.name)
|
member_id = user['id']
|
||||||
member.avatar = user.get('avatar', member.avatar)
|
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)
|
||||||
|
|
||||||
self.dispatch('member_update', old_member, member)
|
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):
|
def parse_user_update(self, data):
|
||||||
self.user = User(**data)
|
self.user = User(**data)
|
||||||
@ -192,9 +199,7 @@ class ConnectionState:
|
|||||||
|
|
||||||
self.dispatch('channel_create', channel)
|
self.dispatch('channel_create', channel)
|
||||||
|
|
||||||
def parse_guild_member_add(self, data):
|
def _add_member(self, server, data):
|
||||||
server = self._get_server(data.get('guild_id'))
|
|
||||||
|
|
||||||
roles = [server.default_role]
|
roles = [server.default_role]
|
||||||
for roleid in data.get('roles', []):
|
for roleid in data.get('roles', []):
|
||||||
role = utils.get(server.roles, id=roleid)
|
role = utils.get(server.roles, id=roleid)
|
||||||
@ -204,6 +209,11 @@ class ConnectionState:
|
|||||||
data['roles'] = roles
|
data['roles'] = roles
|
||||||
member = Member(server=server, **data)
|
member = Member(server=server, **data)
|
||||||
server._add_member(member)
|
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
|
server._member_count += 1
|
||||||
self.dispatch('member_join', member)
|
self.dispatch('member_join', member)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user