From 0a1cadb12391bb70df39382f004256f048ca8c04 Mon Sep 17 00:00:00 2001 From: dolfies Date: Mon, 26 Jun 2023 18:31:21 -0400 Subject: [PATCH] Move independent event parsing back to READY event handler --- discord/state.py | 100 ++++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/discord/state.py b/discord/state.py index cd7cff0a5..d87290014 100644 --- a/discord/state.py +++ b/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')