Return correct total participant count when a filter is desired

This commit is contained in:
Lonami Exo 2021-09-17 20:16:01 +02:00
parent 1036c3cb52
commit 6e9ad9e31c
2 changed files with 11 additions and 20 deletions

View File

@ -225,6 +225,16 @@ The "aggressive" hack in ``get_participants`` (and ``iter_participants``) is now
It was not reliable, and was a cause of flood wait errors. It was not reliable, and was a cause of flood wait errors.
The total value when getting participants has changed
-----------------------------------------------------
Before, it used to always be the total amount of people inside the chat. Now the filter is also
considered. If you were running ``client.get_participants`` with a ``filter`` other than the
default and accessing the ``list.total``, you will now get a different result. You will need to
perform a separate request with no filter to fetch the total without filter (this is what the
library used to do).
The TelegramClient is no longer made out of mixins The TelegramClient is no longer made out of mixins
-------------------------------------------------- --------------------------------------------------

View File

@ -184,27 +184,8 @@ class _ParticipantsIter(requestiter.RequestIter):
if self.request.offset > self.limit: if self.request.offset > self.limit:
return True return True
if self.total is None:
f = self.request.filter
if (
not isinstance(f, _tl.ChannelParticipantsRecent)
and (not isinstance(f, _tl.ChannelParticipantsSearch) or f.q)
):
# Only do an additional getParticipants here to get the total
# if there's a filter which would reduce the real total number.
# getParticipants is cheaper than getFull.
self.total = (await self.client(_tl.fn.channels.GetParticipants(
channel=self.request.channel,
filter=_tl.ChannelParticipantsRecent(),
offset=0,
limit=1,
hash=0
))).count
participants = await self.client(self.request) participants = await self.client(self.request)
if self.total is None: self.total = participants.count
# Will only get here if there was one request with a filter that matched all users.
self.total = participants.count
self.request.offset += len(participants.participants) self.request.offset += len(participants.participants)
users = {user.id: user for user in participants.users} users = {user.id: user for user in participants.users}