From 0bae143d5db5c54208c478875e89079f9d95c039 Mon Sep 17 00:00:00 2001 From: Dan <14043624+delivrance@users.noreply.github.com> Date: Mon, 7 Jan 2019 09:37:26 +0100 Subject: [PATCH] Fix asyncio merge issues --- pyrogram/client/client.py | 2 +- pyrogram/client/methods/chats/get_dialogs.py | 2 +- .../client/methods/chats/iter_chat_members.py | 21 +++++++------ pyrogram/client/methods/chats/iter_dialogs.py | 31 ++++++++++--------- .../client/methods/messages/iter_history.py | 25 ++++++++------- .../types/messages_and_media/messages.py | 2 +- .../client/types/user_and_chats/dialogs.py | 4 +-- 7 files changed, 48 insertions(+), 39 deletions(-) diff --git a/pyrogram/client/client.py b/pyrogram/client/client.py index fb4552b7..2dacc26e 100644 --- a/pyrogram/client/client.py +++ b/pyrogram/client/client.py @@ -321,7 +321,7 @@ class Client(Methods, BaseClient): raise ConnectionError("Client is already stopped") if self.takeout_id: - self.send(functions.account.FinishTakeoutSession()) + await self.send(functions.account.FinishTakeoutSession()) log.warning("Takeout session {} finished".format(self.takeout_id)) await Syncer.remove(self) diff --git a/pyrogram/client/methods/chats/get_dialogs.py b/pyrogram/client/methods/chats/get_dialogs.py index 4d597425..7d2f44e3 100644 --- a/pyrogram/client/methods/chats/get_dialogs.py +++ b/pyrogram/client/methods/chats/get_dialogs.py @@ -78,4 +78,4 @@ class GetDialogs(BaseClient): else: break - return pyrogram.Dialogs._parse(self, r) + return await pyrogram.Dialogs._parse(self, r) diff --git a/pyrogram/client/methods/chats/iter_chat_members.py b/pyrogram/client/methods/chats/iter_chat_members.py index bdd8d117..f521ebc6 100644 --- a/pyrogram/client/methods/chats/iter_chat_members.py +++ b/pyrogram/client/methods/chats/iter_chat_members.py @@ -17,7 +17,9 @@ # along with Pyrogram. If not, see . from string import ascii_lowercase -from typing import Union, Generator +from typing import Union, AsyncGenerator, Optional + +from async_generator import async_generator, yield_ import pyrogram from ...ext import BaseClient @@ -37,11 +39,12 @@ QUERYABLE_FILTERS = (Filters.ALL, Filters.KICKED, Filters.RESTRICTED) class IterChatMembers(BaseClient): - def iter_chat_members(self, - chat_id: Union[int, str], - limit: int = 0, - query: str = "", - filter: str = Filters.ALL) -> Generator["pyrogram.ChatMember", None, None]: + @async_generator + async def iter_chat_members(self, + chat_id: Union[int, str], + limit: int = 0, + query: str = "", + filter: str = Filters.ALL) -> Optional[AsyncGenerator["pyrogram.ChatMember", None]]: """Use this method to iterate through the members of a chat sequentially. This convenience method does the same as repeatedly calling :meth:`get_chat_members` in a loop, thus saving you @@ -95,13 +98,13 @@ class IterChatMembers(BaseClient): offset = 0 while True: - chat_members = self.get_chat_members( + chat_members = (await self.get_chat_members( chat_id=chat_id, offset=offset, limit=limit, query=q, filter=filter - ).chat_members + )).chat_members if not chat_members: break @@ -114,7 +117,7 @@ class IterChatMembers(BaseClient): if user_id in yielded: continue - yield chat_member + await yield_(chat_member) yielded.add(chat_member.user.id) diff --git a/pyrogram/client/methods/chats/iter_dialogs.py b/pyrogram/client/methods/chats/iter_dialogs.py index 6058cd17..712254e9 100644 --- a/pyrogram/client/methods/chats/iter_dialogs.py +++ b/pyrogram/client/methods/chats/iter_dialogs.py @@ -16,30 +16,33 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from typing import Generator +from typing import AsyncGenerator, Optional + +from async_generator import async_generator, yield_ import pyrogram from ...ext import BaseClient class IterDialogs(BaseClient): - def iter_dialogs(self, - offset_date: int = 0, - limit: int = 0) -> Generator["pyrogram.Dialog", None, None]: + @async_generator + async def iter_dialogs(self, + limit: int = 0, + offset_date: int = 0) -> Optional[AsyncGenerator["pyrogram.Dialog", None]]: """Use this method to iterate through a user's dialogs sequentially. This convenience method does the same as repeatedly calling :meth:`get_dialogs` in a loop, thus saving you from the hassle of setting up boilerplate code. It is useful for getting the whole dialogs list with a single call. Args: - offset_date (``int``): - The offset date in Unix time taken from the top message of a :obj:`Dialog`. - Defaults to 0 (most recent dialog). - limit (``str``, *optional*): Limits the number of dialogs to be retrieved. By default, no limit is applied and all dialogs are returned. + offset_date (``int``): + The offset date in Unix time taken from the top message of a :obj:`Dialog`. + Defaults to 0 (most recent dialog). + Returns: A generator yielding :obj:`Dialog ` objects. @@ -50,12 +53,12 @@ class IterDialogs(BaseClient): total = limit or (1 << 31) - 1 limit = min(100, total) - pinned_dialogs = self.get_dialogs( + pinned_dialogs = (await self.get_dialogs( pinned_only=True - ).dialogs + )).dialogs for dialog in pinned_dialogs: - yield dialog + await yield_(dialog) current += 1 @@ -63,10 +66,10 @@ class IterDialogs(BaseClient): return while True: - dialogs = self.get_dialogs( + dialogs = (await self.get_dialogs( offset_date=offset_date, limit=limit - ).dialogs + )).dialogs if not dialogs: return @@ -74,7 +77,7 @@ class IterDialogs(BaseClient): offset_date = dialogs[-1].top_message.date for dialog in dialogs: - yield dialog + await yield_(dialog) current += 1 diff --git a/pyrogram/client/methods/messages/iter_history.py b/pyrogram/client/methods/messages/iter_history.py index ab587988..1a977998 100644 --- a/pyrogram/client/methods/messages/iter_history.py +++ b/pyrogram/client/methods/messages/iter_history.py @@ -16,20 +16,23 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from typing import Union, Generator +from typing import Union, Optional, AsyncGenerator + +from async_generator import async_generator, yield_ import pyrogram from ...ext import BaseClient class IterHistory(BaseClient): - def iter_history(self, - chat_id: Union[int, str], - limit: int = 0, - offset: int = 0, - offset_id: int = 0, - offset_date: int = 0, - reverse: bool = False) -> Generator["pyrogram.Message", None, None]: + @async_generator + async def iter_history(self, + chat_id: Union[int, str], + limit: int = 0, + offset: int = 0, + offset_id: int = 0, + offset_date: int = 0, + reverse: bool = False) -> Optional[AsyncGenerator["pyrogram.Message", None]]: """Use this method to iterate through a chat history sequentially. This convenience method does the same as repeatedly calling :meth:`get_history` in a loop, thus saving you from @@ -70,14 +73,14 @@ class IterHistory(BaseClient): limit = min(100, total) while True: - messages = self.get_history( + messages = (await self.get_history( chat_id=chat_id, limit=limit, offset=offset, offset_id=offset_id, offset_date=offset_date, reverse=reverse - ).messages + )).messages if not messages: return @@ -85,7 +88,7 @@ class IterHistory(BaseClient): offset_id = messages[-1].message_id + (1 if reverse else 0) for message in messages: - yield message + await yield_(message) current += 1 diff --git a/pyrogram/client/types/messages_and_media/messages.py b/pyrogram/client/types/messages_and_media/messages.py index 5b12da45..a48b6acf 100644 --- a/pyrogram/client/types/messages_and_media/messages.py +++ b/pyrogram/client/types/messages_and_media/messages.py @@ -65,7 +65,7 @@ class Messages(PyrogramType, Update): parsed_messages = [] for message in messages.messages: - parsed_messages.appen(await Message._parse(client, message, users, chats, replies=0)) + parsed_messages.append(await Message._parse(client, message, users, chats, replies=0)) if replies: messages_with_replies = {i.id: getattr(i, "reply_to_msg_id", None) for i in messages.messages} diff --git a/pyrogram/client/types/user_and_chats/dialogs.py b/pyrogram/client/types/user_and_chats/dialogs.py index 394ddd28..b3c2d773 100644 --- a/pyrogram/client/types/user_and_chats/dialogs.py +++ b/pyrogram/client/types/user_and_chats/dialogs.py @@ -47,7 +47,7 @@ class Dialogs(PyrogramType): self.dialogs = dialogs @staticmethod - def _parse(client, dialogs) -> "Dialogs": + async def _parse(client, dialogs) -> "Dialogs": users = {i.id: i for i in dialogs.users} chats = {i.id: i for i in dialogs.chats} @@ -66,7 +66,7 @@ class Dialogs(PyrogramType): else: chat_id = int("-100" + str(to_id.channel_id)) - messages[chat_id] = Message._parse(client, message, users, chats) + messages[chat_id] = await Message._parse(client, message, users, chats) return Dialogs( total_count=getattr(dialogs, "count", len(dialogs.dialogs)),