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.
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
--------------------------------------------------

View File

@ -184,27 +184,8 @@ class _ParticipantsIter(requestiter.RequestIter):
if self.request.offset > self.limit:
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)
if self.total is None:
# Will only get here if there was one request with a filter that matched all users.
self.total = participants.count
self.total = participants.count
self.request.offset += len(participants.participants)
users = {user.id: user for user in participants.users}