Browse Source

Move independent event parsing back to READY event handler

pull/10109/head
dolfies 2 years ago
parent
commit
0a1cadb123
  1. 100
      discord/state.py

100
discord/state.py

@ -958,21 +958,65 @@ class ConnectionState:
self._ready_task = None
def parse_ready(self, data: gw.ReadyEvent) -> None:
# Before parsing, we wait for READY_SUPPLEMENTAL
# This has voice state objects, as well as an initial member cache
self._ready_data = data
# Clear the ACK token
self.http.ack_token = None
def parse_ready_supplemental(self, extra_data: gw.ReadySupplementalEvent) -> None:
if self._ready_task is not None:
self._ready_task.cancel()
self.clear()
# Clear the ACK token
self.http.ack_token = None
# Self parsing
self.user = user = ClientUser(state=self, data=data['user'])
self._users[user.id] = user # type: ignore
# Read state parsing
read_states = data.get('read_state', {})
for read_state in read_states['entries']:
item = ReadState(state=self, data=read_state)
self.store_read_state(item)
self.read_state_version = read_states.get('version', 0)
# Experiments
self.experiments = {exp[0]: UserExperiment(state=self, data=exp) for exp in data.get('experiments', [])}
self.guild_experiments = {exp[0]: GuildExperiment(state=self, data=exp) for exp in data.get('guild_experiments', [])}
# Extras
self.analytics_token = data.get('analytics_token')
self.preferred_rtc_regions = data.get('geo_ordered_rtc_regions', ['us-central'])
self.settings = UserSettings(self, data.get('user_settings_proto', ''))
self.guild_settings = {
utils._get_as_snowflake(entry, 'guild_id'): GuildSettings(data=entry, state=self)
for entry in data.get('user_guild_settings', {}).get('entries', [])
}
self.consents = TrackingSettings(data=data.get('consents', {}), state=self)
self.country_code = data.get('country_code', 'US')
self.api_code_version = data.get('api_code_version', 1)
self.session_type = data.get('session_type', 'normal')
self.auth_session_id = data.get('auth_session_id_hash')
self.connections = {c['id']: Connection(state=self, data=c) for c in data.get('connected_accounts', [])}
self.pending_payments = {int(p['id']): Payment(state=self, data=p) for p in data.get('pending_payments', [])}
self.required_action = try_enum(RequiredActionType, data['required_action']) if 'required_action' in data else None
self.friend_suggestion_count = data.get('friend_suggestion_count', 0)
if 'sessions' in data:
self.parse_sessions_replace(data['sessions'], from_ready=True)
if 'auth_token' in data:
self.http._token(data['auth_token'])
if 'tutorial' in data and data['tutorial']:
self.tutorial = Tutorial(state=self, data=data['tutorial'])
# Before parsing the rest, we wait for READY_SUPPLEMENTAL
# This has voice state objects, as well as an initial member cache
self._ready_data = data
def parse_ready_supplemental(self, extra_data: gw.ReadySupplementalEvent) -> None:
data = self._ready_data
# Temp user parsing
user = self.user
temp_users: Dict[int, PartialUserPayload] = {int(data['user']['id']): data['user']}
for u in data.get('users', []):
u_id = int(u['id'])
@ -1010,10 +1054,6 @@ class ConnectionState:
if member:
voice_state['member'] = member
# Self parsing
self.user = user = ClientUser(state=self, data=data['user'])
self._users[user.id] = user # type: ignore
# Guild parsing
for guild_data in data.get('guilds', []):
self._add_guild_from_data(guild_data)
@ -1041,44 +1081,6 @@ class ConnectionState:
pm['recipients'] = [temp_users[int(u_id)] for u_id in pm.pop('recipient_ids')]
self._add_private_channel(factory(me=user, data=pm, state=self)) # type: ignore
# Read state parsing
read_states = data.get('read_state', {})
for read_state in read_states['entries']:
item = ReadState(state=self, data=read_state)
self.store_read_state(item)
self.read_state_version = read_states.get('version', 0)
# Extras
self.analytics_token = data.get('analytics_token')
self.preferred_rtc_regions = data.get('geo_ordered_rtc_regions', ['us-central'])
self.settings = UserSettings(self, data.get('user_settings_proto', ''))
self.guild_settings = {
utils._get_as_snowflake(entry, 'guild_id'): GuildSettings(data=entry, state=self)
for entry in data.get('user_guild_settings', {}).get('entries', [])
}
self.consents = TrackingSettings(data=data.get('consents', {}), state=self)
self.country_code = data.get('country_code', 'US')
self.api_code_version = data.get('api_code_version', 1)
self.session_type = data.get('session_type', 'normal')
self.auth_session_id = data.get('auth_session_id_hash')
self.connections = {c['id']: Connection(state=self, data=c) for c in data.get('connected_accounts', [])}
self.pending_payments = {int(p['id']): Payment(state=self, data=p) for p in data.get('pending_payments', [])}
self.required_action = try_enum(RequiredActionType, data['required_action']) if 'required_action' in data else None
self.friend_suggestion_count = data.get('friend_suggestion_count', 0)
# Experiments
self.experiments = {exp[0]: UserExperiment(state=self, data=exp) for exp in data.get('experiments', [])}
self.guild_experiments = {exp[0]: GuildExperiment(state=self, data=exp) for exp in data.get('guild_experiments', [])}
if 'sessions' in data:
self.parse_sessions_replace(data['sessions'], from_ready=True)
if 'auth_token' in data:
self.http._token(data['auth_token'])
if 'tutorial' in data and data['tutorial']:
self.tutorial = Tutorial(state=self, data=data['tutorial'])
# We're done
del self._ready_data
self.call_handlers('connect')

Loading…
Cancel
Save