diff --git a/discord/state.py b/discord/state.py index 1769833fa..0b267390c 100644 --- a/discord/state.py +++ b/discord/state.py @@ -337,7 +337,7 @@ class MemberSidebar: return ret def handle_manual_override(self, group_members: int) -> None: - # Certain guilds like Midjourney have their member list groups manually set + # Certain guilds like MidJourney have their member list groups manually set # In these cases, the online group is removed, and most online members are not retrievable # We must update the limit to the "real" online count, and recalculate the ranges self._limit_override = group_members @@ -440,11 +440,16 @@ class MemberSidebar: if not self.subscribing and not requests: break + request_values = list(requests.values()) + all_possible_ranges = range(request_values[0][0][0], request_values[-1][-1][1] + 1) + if not requests: raise ClientException('Failed to automatically choose channels; please specify them manually') def predicate(data): - return int(data['guild_id']) == guild.id and any(op['op'] == 'SYNC' for op in data['ops']) + return int(data['guild_id']) == guild.id and any( + op['op'] == 'SYNC' and op['range'][0] in all_possible_ranges for op in data['ops'] + ) await state.subscriptions.subscribe_to_channels(guild, requests, replace=True) @@ -463,7 +468,11 @@ class MemberSidebar: # Sometimes servers require safe mode (they used to have 75k+ members) # so if we don't get a response we force safe mode and try again - _log.debug('Forcing member list scraping safe mode for guild ID %s (member count: %s).', guild.id, guild._member_count) + _log.debug( + 'Forcing member list scraping safe mode for guild ID %s (member count: %s).', + guild.id, + guild._member_count, + ) self.safe_override = True self.ranges = self.get_ranges() await self.scrape() @@ -2731,8 +2740,16 @@ class ConnectionState: # request.add_members(members + to_add) # Attempt to detect Discord overriding the member list - if not request.chunk and not request.manual_override and data['online_count'] > 0 and guild._true_online_count < data['online_count'] and 'online' not in [group['id'] for group in data['groups']]: - _log.debug(f'Detected guild {guild} with manually overriden member list groups: online members not cached by the Gateway.') + if ( + not request.chunk + and not request.manual_override + and data['online_count'] > 0 + and guild._true_online_count < data['online_count'] + and 'online' not in [group['id'] for group in data['groups']] + ): + _log.debug( + f'Detected guild {guild} with manually overriden member list groups: online members not cached by the Gateway.' + ) request.handle_manual_override(guild._true_online_count) else: for member in members: # + to_add: