From 4c0b3e4090560e32858ca0dd4750f1261521bc97 Mon Sep 17 00:00:00 2001 From: wulan17 Date: Mon, 25 Dec 2023 17:49:34 +0700 Subject: [PATCH] Pyrofork: Refactor Story Signed-off-by: wulan17 --- pyrogram/methods/users/delete_stories.py | 8 ++-- pyrogram/methods/users/edit_story.py | 8 ++-- pyrogram/methods/users/export_story_link.py | 8 ++-- pyrogram/methods/users/forward_story.py | 6 +-- pyrogram/methods/users/get_peer_stories.py | 8 ++-- pyrogram/methods/users/get_stories.py | 10 ++--- pyrogram/methods/users/get_stories_history.py | 8 ++-- pyrogram/methods/users/send_story.py | 8 ++-- pyrogram/types/messages_and_media/message.py | 6 +-- .../types/messages_and_media/message_story.py | 42 +++++++++++++++---- pyrogram/types/messages_and_media/story.py | 23 +++++----- 11 files changed, 80 insertions(+), 55 deletions(-) diff --git a/pyrogram/methods/users/delete_stories.py b/pyrogram/methods/users/delete_stories.py index 0bbee7567..b8b97eafc 100644 --- a/pyrogram/methods/users/delete_stories.py +++ b/pyrogram/methods/users/delete_stories.py @@ -29,7 +29,7 @@ class DeleteStories: async def delete_stories( self: "pyrogram.Client", story_ids: Union[int, Iterable[int]], - channel_id: int = None + chat_id: int = None ) -> bool: """Delete one or more story by using story identifiers. @@ -40,7 +40,7 @@ async def delete_stories( Pass a single story identifier or an iterable of story ids (as integers) to get the content of the story themselves. - channel_id (``int``, *optional*): + chat_id (``int``, *optional*): Unique identifier (int) of the target channel. Returns: @@ -59,8 +59,8 @@ async def delete_stories( is_iterable = not isinstance(story_ids, int) ids = list(story_ids) if is_iterable else [story_ids] - if channel_id: - peer = await self.resolve_peer(channel_id) + if chat_id: + peer = await self.resolve_peer(chat_id) else: peer = await self.resolve_peer("me") diff --git a/pyrogram/methods/users/edit_story.py b/pyrogram/methods/users/edit_story.py index 079d7a540..9939263c4 100644 --- a/pyrogram/methods/users/edit_story.py +++ b/pyrogram/methods/users/edit_story.py @@ -31,7 +31,7 @@ def _split(self, message, entities, *args, **kwargs): async def edit_story( self: "pyrogram.Client", story_id: int, - channel_id: int = None, + chat_id: int = None, privacy: "enums.StoriesPrivacyRules" = None, allowed_users: List[int] = None, denied_users: List[int] = None, @@ -53,7 +53,7 @@ async def edit_story( story_id (``int``): Unique identifier (int) of the target story. - channel_id (``int``, *optional*): + chat_id (``int``, *optional*): Unique identifier (int) of the target channel. animation (``str`` | ``BinaryIO``, *optional*): @@ -113,8 +113,8 @@ async def edit_story( ValueError: In case of invalid arguments. """ - if channel_id: - peer = await self.resolve_peer(channel_id) + if chat_id: + peer = await self.resolve_peer(chat_id) else: peer = await self.resolve_peer("me") diff --git a/pyrogram/methods/users/export_story_link.py b/pyrogram/methods/users/export_story_link.py index d5141da5b..f411150b0 100644 --- a/pyrogram/methods/users/export_story_link.py +++ b/pyrogram/methods/users/export_story_link.py @@ -28,7 +28,7 @@ class ExportStoryLink: async def export_story_link( self: "pyrogram.Client", - from_id: Union[int, str], + chat_id: Union[int, str], story_id: int, ) -> types.ExportedStoryLink: """Get one story link from an user by using story identifiers. @@ -36,7 +36,7 @@ async def export_story_link( .. include:: /_includes/usable-by/users.rst Parameters: - from_id (``int`` | ``str``): + chat_id (``int`` | ``str``): Unique identifier (int) or username (str) of the target user/channel. For your personal story you can simply use "me" or "self". For a contact that exists in your Telegram address book you can use his phone number (str). @@ -51,13 +51,13 @@ async def export_story_link( .. code-block:: python # Get story link - await app.export_story_link(from_id, 12345) + await app.export_story_link(chat_id, 12345) Raises: ValueError: In case of invalid arguments. """ - peer = await self.resolve_peer(from_id) + peer = await self.resolve_peer(chat_id) rpc = raw.functions.stories.ExportStoryLink(peer=peer, id=story_id) diff --git a/pyrogram/methods/users/forward_story.py b/pyrogram/methods/users/forward_story.py index 132db2f30..7a3e4cc0e 100644 --- a/pyrogram/methods/users/forward_story.py +++ b/pyrogram/methods/users/forward_story.py @@ -29,7 +29,7 @@ async def forward_story( self: "pyrogram.Client", from_chat_id: Union[int, str], from_story_id: int, - channel_id: int = None, + chat_id: int = None, privacy: "enums.StoriesPrivacyRules" = None, allowed_users: List[int] = None, denied_users: List[int] = None, @@ -55,7 +55,7 @@ async def forward_story( from_story_id (``int``): Unique identifier of original story. - channel_id (``int``, *optional*): + chat_id (``int``, *optional*): Unique identifier (int) of the target channel. If you want to forward story to a channel. @@ -105,7 +105,7 @@ async def forward_story( """ return await self.send_story( - channel_id=channel_id, + chat_id=chat_id, privacy=privacy, allowed_users=allowed_users, denied_users=denied_users, diff --git a/pyrogram/methods/users/get_peer_stories.py b/pyrogram/methods/users/get_peer_stories.py index 6bbf35087..72ad9ef78 100644 --- a/pyrogram/methods/users/get_peer_stories.py +++ b/pyrogram/methods/users/get_peer_stories.py @@ -28,14 +28,14 @@ class GetPeerStories: async def get_peer_stories( self: "pyrogram.Client", - from_id: Union[int, str] + chat_id: Union[int, str] ) -> Optional[AsyncGenerator["types.Story", None]]: """Get all active stories from an user/channel by using user identifiers. .. include:: /_includes/usable-by/users.rst Parameters: - from_id (``int`` | ``str``): + chat_id (``int`` | ``str``): Unique identifier (int) or username (str) of the target user/channel. For your personal story you can simply use "me" or "self". For a contact that exists in your Telegram address book you can use his phone number (str). @@ -47,14 +47,14 @@ async def get_peer_stories( .. code-block:: python # Get all active story from spesific user/channel - async for story in app.get_peer_stories(from_id): + async for story in app.get_peer_stories(chat_id): print(story) Raises: ValueError: In case of invalid arguments. """ - peer = await self.resolve_peer(from_id) + peer = await self.resolve_peer(chat_id) rpc = raw.functions.stories.GetPeerStories(peer=peer) diff --git a/pyrogram/methods/users/get_stories.py b/pyrogram/methods/users/get_stories.py index 7d1a2408d..18965cdc1 100644 --- a/pyrogram/methods/users/get_stories.py +++ b/pyrogram/methods/users/get_stories.py @@ -28,7 +28,7 @@ class GetStories: async def get_stories( self: "pyrogram.Client", - from_id: Union[int, str], + chat_id: Union[int, str], story_ids: Union[int, Iterable[int]], ) -> Union["types.Story", List["types.Story"]]: """Get one or more story from an user by using story identifiers. @@ -36,7 +36,7 @@ async def get_stories( .. include:: /_includes/usable-by/users.rst Parameters: - from_id (``int`` | ``str``): + chat_id (``int`` | ``str``): Unique identifier (int) or username (str) of the target user/channel. For your personal story you can simply use "me" or "self". For a contact that exists in your Telegram address book you can use his phone number (str). @@ -53,16 +53,16 @@ async def get_stories( .. code-block:: python # Get one story - await app.get_stories(from_id, 12345) + await app.get_stories(chat_id, 12345) # Get more than one story (list of stories) - await app.get_stories(from_id, [12345, 12346]) + await app.get_stories(chat_id, [12345, 12346]) Raises: ValueError: In case of invalid arguments. """ - peer = await self.resolve_peer(from_id) + peer = await self.resolve_peer(chat_id) is_iterable = not isinstance(story_ids, int) ids = list(story_ids) if is_iterable else [story_ids] diff --git a/pyrogram/methods/users/get_stories_history.py b/pyrogram/methods/users/get_stories_history.py index aaf3267a0..6a07e2c9f 100644 --- a/pyrogram/methods/users/get_stories_history.py +++ b/pyrogram/methods/users/get_stories_history.py @@ -28,7 +28,7 @@ class GetUserStoriesHistory: async def get_stories_history( self: "pyrogram.Client", - channel_id: int = None, + chat_id: int = None, limit: int = 0, offset_id: int = 0 ) -> Optional[AsyncGenerator["types.Story", None]]: @@ -37,7 +37,7 @@ async def get_stories_history( .. include:: /_includes/usable-by/users.rst Parameters: - channel_id (``int``, *optional*): + chat_id (``int``, *optional*): Unique identifier (int) of the target channel. limit (``int``, *optional*): @@ -61,8 +61,8 @@ async def get_stories_history( ValueError: In case of invalid arguments. """ - if channel_id: - peer = await self.resolve_peer(channel_id) + if chat_id: + peer = await self.resolve_peer(chat_id) else: peer = await self.resolve_peer("me") diff --git a/pyrogram/methods/users/send_story.py b/pyrogram/methods/users/send_story.py index f53b735e6..72218809f 100644 --- a/pyrogram/methods/users/send_story.py +++ b/pyrogram/methods/users/send_story.py @@ -30,7 +30,7 @@ def _split(self, message, entities, *args, **kwargs): async def send_story( self: "pyrogram.Client", - channel_id: int = None, + chat_id: int = None, privacy: "enums.StoriesPrivacyRules" = None, allowed_users: List[int] = None, denied_users: List[int] = None, @@ -56,7 +56,7 @@ async def send_story( Note: You must pass one of following paramater *animation*, *photo*, *video* Parameters: - channel_id (``int``, *optional*): + chat_id (``int``, *optional*): Unique identifier (int) of the target channel. animation (``str`` | ``BinaryIO``, *optional*): @@ -137,8 +137,8 @@ async def send_story( ValueError: In case of invalid arguments. """ - if channel_id: - peer = await self.resolve_peer(channel_id) + if chat_id: + peer = await self.resolve_peer(chat_id) else: peer = await self.resolve_peer("me") diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index ac2fb3ac8..679fb0516 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -198,7 +198,7 @@ class Message(Object, Update): giveaway (:obj:`~pyrogram.types.Giveaway`, *optional*): Message is a giveaway, information about the giveaway. - story (:obj:`~pyrogram.types.MessageStory`, *optional*): + story (:obj:`~pyrogram.types.MessageStory` | :obj:`~pyrogram.types.Story`, *optional*): Message is a forwarded story, information about the forwarded story. video (:obj:`~pyrogram.types.Video`, *optional*): @@ -411,7 +411,7 @@ def __init__( animation: "types.Animation" = None, game: "types.Game" = None, giveaway: "types.Giveaway" = None, - story: "types.MessageStory" = None, + story: Union["types.MessageStory", "types.Story"] = None, video: "types.Video" = None, voice: "types.Voice" = None, video_note: "types.VideoNote" = None, @@ -886,7 +886,7 @@ async def _parse( giveaway = await types.Giveaway._parse(client, message) media_type = enums.MessageMediaType.GIVEAWAY elif isinstance(media, raw.types.MessageMediaStory): - story = types.MessageStory._parse(media) + story = await types.MessageStory._parse(client, media) media_type = enums.MessageMediaType.STORY elif isinstance(media, raw.types.MessageMediaDocument): doc = media.document diff --git a/pyrogram/types/messages_and_media/message_story.py b/pyrogram/types/messages_and_media/message_story.py index d7742e715..693fb15db 100644 --- a/pyrogram/types/messages_and_media/message_story.py +++ b/pyrogram/types/messages_and_media/message_story.py @@ -16,7 +16,9 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrofork. If not, see . -from pyrogram import raw +import pyrogram + +from pyrogram import raw, types, utils from ..object import Object @@ -24,8 +26,11 @@ class MessageStory(Object): """Contains information about a forwarded story. Parameters: - from_id (``int``): - Unique user/channel identifier of story sender. + from_user (:obj:`~pyrogram.types.User`, *optional*): + Sender of the story. + + sender_chat (:obj:`~pyrogram.types.Chat`, *optional*): + Sender of the story. If the story is from channel. story_id (``int``): Unique story identifier. @@ -34,21 +39,40 @@ class MessageStory(Object): def __init__( self, *, - from_id: int, + from_user: "types.User" = None, + sender_chat: "types.Chat" = None, story_id: int ): super().__init__() - self.from_id = from_id + self.from_user = from_user + self.sender_chat = sender_chat self.story_id = story_id @staticmethod - def _parse(message_story: "raw.types.MessageMediaStory") -> "MessageStory": + async def _parse( + client: "pyrogram.Client", + message_story: "raw.types.MessageMediaStory" + ) -> "MessageStory": + from_user = None + sender_chat = None + user_id = None + chat_id = None if isinstance(message_story.peer, raw.types.PeerChannel): - from_id = message_story.peer.channel_id + chat_id = utils.get_channel_id(message_story.peer.channel_id) + chat = await client.invoke( + raw.functions.channels.GetChannels( + id=[await client.resolve_peer(chat_id)] + ) + ) + sender_chat = types.Chat._parse_chat(client, chat.chats[0]) else: - from_id = message_story.peer.user_id + user_id = message_story.peer.user_id + from_user = await client.get_users(user_id) + if not client.me.is_bot: + return await client.get_stories(user_id or chat_id, message_story.id) return MessageStory( - from_id=from_id, + from_user=from_user, + sender_chat=sender_chat, story_id=message_story.id ) diff --git a/pyrogram/types/messages_and_media/story.py b/pyrogram/types/messages_and_media/story.py index 97e8796f8..5f1816b83 100644 --- a/pyrogram/types/messages_and_media/story.py +++ b/pyrogram/types/messages_and_media/story.py @@ -246,6 +246,7 @@ async def _parse( if stories.fwd_from is not None: forward_from = await types.StoryForwardHeader._parse(client, stories.fwd_from) + media_areas = None if stories.media_areas is not None and len(stories.media_areas) > 0: media_areas = [ await types.MediaArea._parse(client, media_area) @@ -1399,7 +1400,7 @@ async def delete(self): RPCError: In case of a Telegram RPC error. """ return await self._client.delete_stories( - channel_id=self.sender_chat.id if self.sender_chat else None, + chat_id=self.sender_chat.id if self.sender_chat else None, story_ids=self.id ) @@ -1434,7 +1435,7 @@ async def edit_animation( RPCError: In case of a Telegram RPC error. """ return await self._client.edit_story( - channel_id=self.sender_chat.id if self.sender_chat else None, + chat_id=self.sender_chat.id if self.sender_chat else None, story_id=self.id, animation=animation ) @@ -1524,7 +1525,7 @@ async def edit( RPCError: In case of a Telegram RPC error. """ return await self._client.edit_story( - channel_id=self.sender_chat.id if self.sender_chat else None, + chat_id=self.sender_chat.id if self.sender_chat else None, story_id=self.id, privacy=privacy, #allowed_chats=allowed_chats, @@ -1580,7 +1581,7 @@ async def edit_caption( RPCError: In case of a Telegram RPC error. """ return await self._client.edit_story( - channel_id=self.sender_chat.id if self.sender_chat else None, + chat_id=self.sender_chat.id if self.sender_chat else None, story_id=self.id, caption=caption, parse_mode=parse_mode, @@ -1618,7 +1619,7 @@ async def edit_photo( RPCError: In case of a Telegram RPC error. """ return await self._client.edit_story( - channel_id=self.sender_chat.id if self.sender_chat else None, + chat_id=self.sender_chat.id if self.sender_chat else None, story_id=self.id, photo=photo ) @@ -1664,7 +1665,7 @@ async def edit_privacy( RPCError: In case of a Telegram RPC error. """ return await self._client.edit_story( - channel_id=self.sender_chat.id if self.sender_chat else None, + chat_id=self.sender_chat.id if self.sender_chat else None, story_id=self.id, privacy=privacy, #allowed_chats=allowed_chats, @@ -1704,7 +1705,7 @@ async def edit_video( RPCError: In case of a Telegram RPC error. """ return await self._client.edit_story( - channel_id=self.sender_chat.id if self.sender_chat else None, + chat_id=self.sender_chat.id if self.sender_chat else None, story_id=self.id, video=video ) @@ -1732,11 +1733,11 @@ async def export_link(self) -> "types.ExportedStoryLink": Raises: RPCError: In case of a Telegram RPC error. """ - return await self._client.export_story_link(from_id=self.from_user.id if self.from_user else self.sender_chat.id, story_id=self.id) + return await self._client.export_story_link(chat_id=self.from_user.id if self.from_user else self.sender_chat.id, story_id=self.id) async def forward( self, - channel_id: int = None, + chat_id: int = None, privacy: "enums.StoriesPrivacyRules" = None, allowed_users: List[int] = None, denied_users: List[int] = None, @@ -1762,7 +1763,7 @@ async def forward( ) Parameters: - channel_id (``int``, *optional*): + chat_id (``int``, *optional*): Unique identifier (int) of the target channel. If you want to forward story to a channel. @@ -1805,7 +1806,7 @@ async def forward( ValueError: In case of invalid arguments. """ return await self._client.send_story( - channel_id=channel_id, + chat_id=chat_id, privacy=privacy, allowed_users=allowed_users, denied_users=denied_users,