diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index be8fc7c4..5a75368d 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -267,6 +267,10 @@ def pyrogram_api(): get_default_emoji_statuses set_emoji_status """, + stories=""" + Stories + get_stories + """, stickers=""" Stickers add_sticker_to_set diff --git a/pyrogram/methods/users/__init__.py b/pyrogram/methods/users/__init__.py index 31fda1dc..a5f72bb5 100644 --- a/pyrogram/methods/users/__init__.py +++ b/pyrogram/methods/users/__init__.py @@ -23,6 +23,7 @@ from .get_chat_photos_count import GetChatPhotosCount from .get_common_chats import GetCommonChats from .get_default_emoji_statuses import GetDefaultEmojiStatuses from .get_me import GetMe +from .get_stories import GetStories from .get_users import GetUsers from .set_emoji_status import SetEmojiStatus from .set_profile_photo import SetProfilePhoto @@ -39,6 +40,7 @@ class Users( DeleteProfilePhotos, GetUsers, GetMe, + GetStories, SetUsername, GetChatPhotosCount, UnblockUser, diff --git a/pyrogram/methods/users/get_stories.py b/pyrogram/methods/users/get_stories.py new file mode 100644 index 00000000..b7e76f9a --- /dev/null +++ b/pyrogram/methods/users/get_stories.py @@ -0,0 +1,76 @@ +# Pyrofork - Telegram MTProto API Client Library for Python +# Copyright (C) 2022-present Mayuri-Chan +# +# This file is part of Pyrofork. +# +# Pyrofork is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrofork is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrofork. If not, see . + +import logging +from typing import Union, List, Iterable + +import pyrogram +from pyrogram import raw +from pyrogram import types + +log = logging.getLogger(__name__) + +class GetStories: + async def get_stories( + self: "pyrogram.Client", + user_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. + + .. include:: /_includes/usable-by/users.rst + + Parameters: + user_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target user. + 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). + + story_ids (``int`` | Iterable of ``int``, *optional*): + Pass a single story identifier or an iterable of story ids (as integers) to get the content of the + story themselves. + + Returns: + :obj:`~pyrogram.types.Story` | List of :obj:`~pyrogram.types.Story`: In case *story_ids* was not + a list, a single story is returned, otherwise a list of stories is returned. + + Example: + .. code-block:: python + + # Get one story + await app.get_stories(user_id, 12345) + + # Get more than one story (list of stories) + await app.get_stories(user_id, [12345, 12346]) + + Raises: + ValueError: In case of invalid arguments. + """ + + peer = await self.resolve_peer(user_id) + + is_iterable = not isinstance(story_ids, int) + ids = list(story_ids) if is_iterable else [story_ids] + + rpc = raw.functions.stories.GetStoriesByID(user_id=peer, id=ids) + + r = await self.invoke(rpc, sleep_threshold=-1) + + if is_iterable: + return types.List([await types.Story._parse(self, story, user_id) for story in r.stories]) + return await types.Story._parse(self, r.stories[0], user_id)