Fix iter_participants in non-channels

This commit is contained in:
Lonami Exo 2019-03-02 21:17:36 +01:00
parent 4cc2a17765
commit 6799295115
2 changed files with 12 additions and 6 deletions

View File

@ -35,6 +35,9 @@ class _ParticipantsIter(RequestIter):
else: else:
self.filter_entity = lambda ent: True self.filter_entity = lambda ent: True
# Only used for channels, but we should always set the attribute
self.requests = []
if isinstance(entity, types.InputPeerChannel): if isinstance(entity, types.InputPeerChannel):
self.total = (await self.client( self.total = (await self.client(
functions.channels.GetFullChannelRequest(entity) functions.channels.GetFullChannelRequest(entity)
@ -45,21 +48,21 @@ class _ParticipantsIter(RequestIter):
self.seen = set() self.seen = set()
if aggressive and not filter: if aggressive and not filter:
self.requests = [functions.channels.GetParticipantsRequest( self.requests.extend(functions.channels.GetParticipantsRequest(
channel=entity, channel=entity,
filter=types.ChannelParticipantsSearch(x), filter=types.ChannelParticipantsSearch(x),
offset=0, offset=0,
limit=_MAX_PARTICIPANTS_CHUNK_SIZE, limit=_MAX_PARTICIPANTS_CHUNK_SIZE,
hash=0 hash=0
) for x in (search or string.ascii_lowercase)] ) for x in (search or string.ascii_lowercase))
else: else:
self.requests = [functions.channels.GetParticipantsRequest( self.requests.append(functions.channels.GetParticipantsRequest(
channel=entity, channel=entity,
filter=filter or types.ChannelParticipantsSearch(search), filter=filter or types.ChannelParticipantsSearch(search),
offset=0, offset=0,
limit=_MAX_PARTICIPANTS_CHUNK_SIZE, limit=_MAX_PARTICIPANTS_CHUNK_SIZE,
hash=0 hash=0
)] ))
elif isinstance(entity, types.InputPeerChat): elif isinstance(entity, types.InputPeerChat):
full = await self.client( full = await self.client(

View File

@ -47,13 +47,16 @@ class RequestIter(abc.ABC):
This method may ``raise StopAsyncIteration`` if it cannot continue. This method may ``raise StopAsyncIteration`` if it cannot continue.
This method may actually fill the initial buffer if it needs to. This method may actually fill the initial buffer if it needs to,
and similarly to `_load_next_chunk`, ``return True`` to indicate
that this is the last iteration (just the initial load).
""" """
async def __anext__(self): async def __anext__(self):
if self.buffer is None: if self.buffer is None:
self.buffer = [] self.buffer = []
await self._init(**self.kwargs) if await self._init(**self.kwargs):
self.left = len(self.buffer)
if self.left <= 0: # <= 0 because subclasses may change it if self.left <= 0: # <= 0 because subclasses may change it
raise StopAsyncIteration raise StopAsyncIteration