Skip to content

Commit

Permalink
Remove edit_story method
Browse files Browse the repository at this point in the history
  • Loading branch information
KurimuzonAkuma committed Dec 7, 2023
1 parent fc0d9af commit b09cbd7
Show file tree
Hide file tree
Showing 5 changed files with 233 additions and 122 deletions.
4 changes: 3 additions & 1 deletion compiler/docs/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,9 @@ def get_title_list(s: str) -> list:
can_send_story
copy_story
delete_stories
edit_story
edit_story_caption
edit_story_media
edit_story_privacy
export_story_link
forward_story
get_all_stories
Expand Down
8 changes: 6 additions & 2 deletions pyrogram/methods/stories/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
from .can_send_story import CanSendStory
from .copy_story import CopyStory
from .delete_stories import DeleteStories
from .edit_story import EditStory
from .edit_story_caption import EditStoryCaption
from .edit_story_media import EditStoryMedia
from .edit_story_privacy import EditStoryPrivacy
from .export_story_link import ExportStoryLink
from .forward_story import ForwardStory
from .get_all_stories import GetAllStories
Expand All @@ -37,7 +39,9 @@ class Stories(
CanSendStory,
CopyStory,
DeleteStories,
EditStory,
EditStoryCaption,
EditStoryMedia,
EditStoryPrivacy,
ExportStoryLink,
ForwardStory,
GetAllStories,
Expand Down
83 changes: 83 additions & 0 deletions pyrogram/methods/stories/edit_story_caption.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# This file is part of Pyrogram.
#
# Pyrogram 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.
#
# Pyrogram 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 Pyrogram. If not, see <http://www.gnu.org/licenses/>.

from typing import List, Union

import pyrogram
from pyrogram import enums, raw, types, utils

class EditStoryCaption:
async def edit_story_caption(
self: "pyrogram.Client",
chat_id: Union[int, str],
story_id: int,
caption: str,
parse_mode: "enums.ParseMode" = None,
caption_entities: List["types.MessageEntity"] = None,
) -> "types.Story":
"""Edit the caption of story.
.. include:: /_includes/usable-by/users.rst
Parameters:
chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat.
For your personal cloud (Saved Messages) you can simply use "me" or "self".
story_id (``int``):
Story identifier in the chat specified in chat_id.
caption (``str``):
New caption of the story, 0-1024 characters.
parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of *parse_mode*.
Returns:
:obj:`~pyrogram.types.Story`: On success, the edited story is returned.
Example:
.. code-block:: python
await app.edit_story(chat_id, story_id, "new media caption")
"""

message, entities = (await utils.parse_text_entities(self, caption, parse_mode, caption_entities)).values()

r = await self.invoke(
raw.functions.stories.EditStory(
peer=await self.resolve_peer(chat_id),
id=story_id,
caption=message,
entities=entities,
)
)

for i in r.updates:
if isinstance(i, raw.types.UpdateStory):
return await types.Story._parse(
self,
i.story,
{i.id: i for i in r.users},
{i.id: i for i in r.chats},
i.peer
)
Original file line number Diff line number Diff line change
Expand Up @@ -17,52 +17,45 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.

import os
from typing import List, Union, BinaryIO, Callable
from typing import Union, BinaryIO, Callable

import pyrogram
from pyrogram import enums, raw, types, utils, StopTransmission
from pyrogram import raw, types, utils, StopTransmission
from pyrogram.errors import FilePartMissing

class EditStory:
async def edit_story(
class EditStoryMedia:
async def edit_story_media(
self: "pyrogram.Client",
chat_id: Union[int, str],
story_id: int,
media: Union[str, BinaryIO] = None,
caption: str = None,
duration: int = 0,
width: int = 0,
height: int = 0,
thumb: Union[str, BinaryIO] = None,
supports_streaming: bool = True,
file_name: str = None,
privacy: "enums.StoriesPrivacyRules" = None,
allowed_users: List[Union[int, str]] = None,
disallowed_users: List[Union[int, str]] = None,
parse_mode: "enums.ParseMode" = None,
caption_entities: List["types.MessageEntity"] = None,
progress: Callable = None,
progress_args: tuple = ()
) -> "types.Story":
"""Edit story.
"""Edit story media.
.. include:: /_includes/usable-by/users.rst
Parameters:
chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat.
For your personal cloud (Saved Messages) 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_id (``int``):
Story identifier in the chat specified in chat_id.
media (``str`` | ``BinaryIO``, *optional*):
Video or photo to send.
Pass a file_id as string to send a animation that exists on the Telegram servers,
pass a file path as string to upload a new animation that exists on your local machine, or
pass a binary file-like object with its attribute ".name" set for in-memory uploads.
caption (``str``, *optional*):
Story caption, 0-1024 characters.
duration (``int``, *optional*):
Duration of sent video in seconds.
Expand All @@ -78,27 +71,6 @@ async def edit_story(
A thumbnail's width and height should not exceed 320 pixels.
Thumbnails can't be reused and can be only uploaded as a new file.
privacy (:obj:`~pyrogram.enums.StoriesPrivacyRules`, *optional*):
Story privacy.
allowed_users (List of ``int``, *optional*):
List of user_id or chat_id of chat users who are allowed to view stories.
Note: chat_id available only with :obj:`~pyrogram.enums.StoriesPrivacyRules.SELECTED_USERS`.
Works with :obj:`~pyrogram.enums.StoriesPrivacyRules.CLOSE_FRIENDS`
and :obj:`~pyrogram.enums.StoriesPrivacyRules.SELECTED_USERS` only
disallowed_users (List of ``int``, *optional*):
List of user_id whos disallow to view the stories.
Note: Works with :obj:`~pyrogram.enums.StoriesPrivacyRules.PUBLIC`
and :obj:`~pyrogram.enums.StoriesPrivacyRules.CONTACTS` only
parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of *parse_mode*.
progress (``Callable``, *optional*):
Pass a callback function to view the file transmission progress.
The function must take *(current, total)* as positional arguments (look at Other Parameters below for a
Expand All @@ -111,58 +83,19 @@ async def edit_story(
object or a Client instance in order to edit the message with the updated progress status.
Returns:
:obj:`~pyrogram.types.Story` a single story is returned.
:obj:`~pyrogram.types.Story`: On success, the edited story is returned.
Example:
.. code-block:: python
# Edit story in your profile
await app.edit_story("me", "story.png", caption='My new story!')
# Replace the current media with a local photo
await app.edit_story_media(chat_id, story_id, "new_photo.jpg")
# Edit story in channel
await app.edit_story(123456, "story.png", caption='My new story!')
Raises:
ValueError: In case of invalid arguments.
# Replace the current media with a local video
await app.edit_story_media(chat_id, story_id, "new_video.mp4")
"""
# TODO: media_areas

message, entities = (await utils.parse_text_entities(self, caption, parse_mode, caption_entities)).values()

privacy_rules = []

if privacy:
if privacy == enums.StoriesPrivacyRules.PUBLIC:
privacy_rules.append(raw.types.InputPrivacyValueAllowAll())
if disallowed_users:
users = [await self.resolve_peer(user_id) for user_id in disallowed_users]
privacy_rules.append(raw.types.InputPrivacyValueDisallowUsers(users=users))
elif privacy == enums.StoriesPrivacyRules.CONTACTS:
privacy_rules = [raw.types.InputPrivacyValueAllowContacts()]
if disallowed_users:
users = [await self.resolve_peer(user_id) for user_id in disallowed_users]
privacy_rules.append(raw.types.InputPrivacyValueDisallowUsers(users=users))
elif privacy == enums.StoriesPrivacyRules.CLOSE_FRIENDS:
privacy_rules = [raw.types.InputPrivacyValueAllowCloseFriends()]
if allowed_users:
users = [await self.resolve_peer(user_id) for user_id in allowed_users]
privacy_rules.append(raw.types.InputPrivacyValueAllowUsers(users=users))
elif privacy == enums.StoriesPrivacyRules.SELECTED_USERS:
_allowed_users = []
_allowed_chats = []

for user in allowed_users:
peer = await self.resolve_peer(user)
if isinstance(peer, raw.types.InputPeerUser):
_allowed_users.append(peer)
elif isinstance(peer, raw.types.InputPeerChat):
_allowed_chats.append(peer)

if _allowed_users:
privacy_rules.append(raw.types.InputPrivacyValueAllowUsers(users=_allowed_users))
if _allowed_chats:
privacy_rules.append(raw.types.InputPrivacyValueAllowChatParticipants(chats=_allowed_chats))

try:
if isinstance(media, str):
if os.path.isfile(media):
Expand Down Expand Up @@ -213,52 +146,13 @@ async def edit_story(
file=file,
)

privacy_rules = []

if privacy:
if privacy == enums.StoriesPrivacyRules.PUBLIC:
privacy_rules.append(raw.types.InputPrivacyValueAllowAll())
if disallowed_users:
users = [await self.resolve_peer(user_id) for user_id in disallowed_users]
privacy_rules.append(raw.types.InputPrivacyValueDisallowUsers(users=users))
elif privacy == enums.StoriesPrivacyRules.CONTACTS:
privacy_rules = [raw.types.InputPrivacyValueAllowContacts()]
if disallowed_users:
users = [await self.resolve_peer(user_id) for user_id in disallowed_users]
privacy_rules.append(raw.types.InputPrivacyValueDisallowUsers(users=users))
elif privacy == enums.StoriesPrivacyRules.CLOSE_FRIENDS:
privacy_rules = [raw.types.InputPrivacyValueAllowCloseFriends()]
if allowed_users:
users = [await self.resolve_peer(user_id) for user_id in allowed_users]
privacy_rules.append(raw.types.InputPrivacyValueAllowUsers(users=users))
elif privacy == enums.StoriesPrivacyRules.SELECTED_USERS:
_allowed_users = []
_allowed_chats = []

for user in allowed_users:
peer = await self.resolve_peer(user)
if isinstance(peer, raw.types.InputPeerUser):
_allowed_users.append(peer)
elif isinstance(peer, (raw.types.InputPeerChat, raw.types.InputPeerChannel)):
_allowed_chats.append(peer)

if _allowed_users:
privacy_rules.append(raw.types.InputPrivacyValueAllowUsers(users=_allowed_users))
if _allowed_chats:
privacy_rules.append(raw.types.InputPrivacyValueAllowChatParticipants(chats=_allowed_chats))
else:
privacy_rules.append(raw.types.InputPrivacyValueAllowAll())

while True:
try:
r = await self.invoke(
raw.functions.stories.EditStory(
peer=await self.resolve_peer(chat_id),
id=story_id,
media=media,
caption=message,
entities=entities,
privacy_rules=privacy_rules,
)
)
except FilePartMissing as e:
Expand Down
Loading

0 comments on commit b09cbd7

Please sign in to comment.