Make privacy rules like in gui

This commit is contained in:
KurimuzonAkuma 2023-10-28 22:23:25 +03:00
parent 7f8c92ace8
commit 5dbc20c9c5
5 changed files with 98 additions and 116 deletions

View File

@ -26,14 +26,11 @@ class StoriesPrivacyRules(AutoName):
PUBLIC = auto() PUBLIC = auto()
"Public stories" "Public stories"
CLOSE_FRIENDS = auto()
"Close friends stories"
CONTACTS = auto() CONTACTS = auto()
"Contacts only stories" "Contacts only stories"
PRIVATE = auto() CLOSE_FRIENDS = auto()
"Private stories" "Close friends stories"
NO_CONTACTS = auto() SELECTED_USERS = auto()
"Hide stories from contacts" "Selected users stories"

View File

@ -38,10 +38,8 @@ class EditStory:
supports_streaming: bool = True, supports_streaming: bool = True,
file_name: str = None, file_name: str = None,
privacy: "enums.StoriesPrivacyRules" = None, privacy: "enums.StoriesPrivacyRules" = None,
allowed_users: List[int] = None, allowed_users: List[Union[int, str]] = None,
denied_users: List[int] = None, disallowed_users: List[Union[int, str]] = None,
allowed_chats: List[int] = None,
denied_chats: List[int] = None,
parse_mode: "enums.ParseMode" = None, parse_mode: "enums.ParseMode" = None,
caption_entities: List["types.MessageEntity"] = None, caption_entities: List["types.MessageEntity"] = None,
progress: Callable = None, progress: Callable = None,
@ -88,17 +86,16 @@ class EditStory:
Story privacy. Story privacy.
Defaults to :obj:`~pyrogram.enums.StoriesPrivacyRules.PUBLIC` Defaults to :obj:`~pyrogram.enums.StoriesPrivacyRules.PUBLIC`
allowed_chats (List of ``int``, *optional*):
List of chat_id which participant allowed to view the story.
denied_chats (List of ``int``, *optional*):
List of chat_id which participant denied to view the story.
allowed_users (List of ``int``, *optional*): allowed_users (List of ``int``, *optional*):
List of user_id whos allowed to view the story. 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
denied_users (List of ``int``, *optional*): disallowed_users (List of ``int``, *optional*):
List of user_id whos denied to view the story. 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*): parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles. By default, texts are parsed using both Markdown and HTML styles.
@ -126,7 +123,7 @@ class EditStory:
# Send new photo story # Send new photo story
photo_id = "abcd12345" photo_id = "abcd12345"
await app.send_story(photo=photo_id, caption='Hello guys.') await app.edit_story(meida=photo_id, caption='Hello guys.')
Raises: Raises:
ValueError: In case of invalid arguments. ValueError: In case of invalid arguments.
@ -198,18 +195,41 @@ class EditStory:
file=file, file=file,
) )
if allowed_chats: privacy_rules = []
chats = [await self.resolve_peer(chat_id) for chat_id in allowed_chats]
privacy_rules.append(raw.types.InputPrivacyValueAllowChatParticipants(chats=chats)) if privacy:
if denied_chats: if privacy == enums.StoriesPrivacyRules.PUBLIC:
chats = [await self.resolve_peer(chat_id) for chat_id in denied_chats] privacy_rules.append(raw.types.InputPrivacyValueAllowAll())
privacy_rules.append(raw.types.InputPrivacyValueDisallowChatParticipants(chats=chats)) if disallowed_users:
if allowed_users: users = [await self.resolve_peer(user_id) for user_id in disallowed_users]
users = [await self.resolve_peer(user_id) for user_id in allowed_users] privacy_rules.append(raw.types.InputPrivacyValueDisallowUsers(users=users))
privacy_rules.append(raw.types.InputPrivacyValueAllowUsers(users=users)) elif privacy == enums.StoriesPrivacyRules.CONTACTS:
if denied_users: privacy_rules = [raw.types.InputPrivacyValueAllowContacts()]
users = [await self.resolve_peer(user_id) for user_id in denied_users] if disallowed_users:
privacy_rules.append(raw.types.InputPrivacyValueDisallowUsers(users=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))
else:
privacy_rules.append(raw.types.InputPrivacyValueAllowAll())
while True: while True:
try: try:

View File

@ -38,10 +38,8 @@ class SendStory:
supports_streaming: bool = True, supports_streaming: bool = True,
file_name: str = None, file_name: str = None,
privacy: "enums.StoriesPrivacyRules" = None, privacy: "enums.StoriesPrivacyRules" = None,
allowed_users: List[int] = None, allowed_users: List[Union[int, str]] = None,
denied_users: List[int] = None, disallowed_users: List[Union[int, str]] = None,
allowed_chats: List[int] = None,
denied_chats: List[int] = None,
pinned: bool = None, pinned: bool = None,
protect_content: bool = None, protect_content: bool = None,
parse_mode: "enums.ParseMode" = None, parse_mode: "enums.ParseMode" = None,
@ -59,7 +57,6 @@ class SendStory:
chat_id (``int`` | ``str``): chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat. Unique identifier (int) or username (str) of the target chat.
For your personal cloud (Saved Messages) you can simply use "me" or "self". 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).
media (``str`` | ``BinaryIO``): media (``str`` | ``BinaryIO``):
Video or photo to send. Video or photo to send.
@ -94,17 +91,16 @@ class SendStory:
Story privacy. Story privacy.
Defaults to :obj:`~pyrogram.enums.StoriesPrivacyRules.PUBLIC` Defaults to :obj:`~pyrogram.enums.StoriesPrivacyRules.PUBLIC`
allowed_chats (List of ``int``, *optional*):
List of chat_id which participant allowed to view the story.
denied_chats (List of ``int``, *optional*):
List of chat_id which participant denied to view the story.
allowed_users (List of ``int``, *optional*): allowed_users (List of ``int``, *optional*):
List of user_id whos allowed to view the story. 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
denied_users (List of ``int``, *optional*): disallowed_users (List of ``int``, *optional*):
List of user_id whos denied to view the story. 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
pinned (``bool``, *optional*): pinned (``bool``, *optional*):
if True, the story will be pinned. if True, the story will be pinned.
@ -138,20 +134,14 @@ class SendStory:
Example: Example:
.. code-block:: python .. code-block:: python
# Send new photo story # Send new story
photo_id = "abcd12345" await app.send_story(media=file_id, caption='Hello guys.')
await app.send_story(photo=photo_id, caption='Hello guys.')
Raises: Raises:
ValueError: In case of invalid arguments. ValueError: In case of invalid arguments.
""" """
# TODO: media_areas # TODO: media_areas
if privacy:
privacy_rules = [types.StoriesPrivacyRules(type=privacy)]
else:
privacy_rules = [types.StoriesPrivacyRules(type=enums.StoriesPrivacyRules.PUBLIC)]
message, entities = (await utils.parse_text_entities(self, caption, parse_mode, caption_entities)).values() message, entities = (await utils.parse_text_entities(self, caption, parse_mode, caption_entities)).values()
try: try:
@ -214,18 +204,41 @@ class SendStory:
file=file, file=file,
) )
if allowed_chats: privacy_rules = []
chats = [await self.resolve_peer(chat_id) for chat_id in allowed_chats]
privacy_rules.append(raw.types.InputPrivacyValueAllowChatParticipants(chats=chats)) if privacy:
if denied_chats: if privacy == enums.StoriesPrivacyRules.PUBLIC:
chats = [await self.resolve_peer(chat_id) for chat_id in denied_chats] privacy_rules.append(raw.types.InputPrivacyValueAllowAll())
privacy_rules.append(raw.types.InputPrivacyValueDisallowChatParticipants(chats=chats)) if disallowed_users:
if allowed_users: users = [await self.resolve_peer(user_id) for user_id in disallowed_users]
users = [await self.resolve_peer(user_id) for user_id in allowed_users] privacy_rules.append(raw.types.InputPrivacyValueDisallowUsers(users=users))
privacy_rules.append(raw.types.InputPrivacyValueAllowUsers(users=users)) elif privacy == enums.StoriesPrivacyRules.CONTACTS:
if denied_users: privacy_rules = [raw.types.InputPrivacyValueAllowContacts()]
users = [await self.resolve_peer(user_id) for user_id in denied_users] if disallowed_users:
privacy_rules.append(raw.types.InputPrivacyValueDisallowUsers(users=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))
else:
privacy_rules.append(raw.types.InputPrivacyValueAllowAll())
while True: while True:
try: try:

View File

@ -38,7 +38,6 @@ from .poll_option import PollOption
from .reaction import Reaction from .reaction import Reaction
from .sticker import Sticker from .sticker import Sticker
from .stripped_thumbnail import StrippedThumbnail from .stripped_thumbnail import StrippedThumbnail
from .stories_privacy_rules import StoriesPrivacyRules
from .story import Story from .story import Story
from .story_deleted import StoryDeleted from .story_deleted import StoryDeleted
from .story_skipped import StorySkipped from .story_skipped import StorySkipped
@ -57,7 +56,7 @@ __all__ = [
"Animation", "Audio", "Contact", "Document", "ForumTopic", "ForumTopicCreated", "Animation", "Audio", "Contact", "Document", "ForumTopic", "ForumTopicCreated",
"ForumTopicClosed", "ForumTopicReopened", "ForumTopicEdited", "GeneralTopicHidden", "ForumTopicClosed", "ForumTopicReopened", "ForumTopicEdited", "GeneralTopicHidden",
"GeneralTopicUnhidden", "Game", "Location", "Message", "MessageEntity", "Photo", "Thumbnail", "GeneralTopicUnhidden", "Game", "Location", "Message", "MessageEntity", "Photo", "Thumbnail",
"StrippedThumbnail", "Story", "StoryDeleted", "StorySkipped", "StoryViews", "StoriesPrivacyRules", "Poll", "PollOption", "Sticker", "StrippedThumbnail", "Story", "StoryDeleted", "StorySkipped", "StoryViews", "Poll", "PollOption", "Sticker",
"Venue", "Video", "VideoNote", "Voice", "WebPage", "Dice", "Reaction", "WebAppData", "Venue", "Video", "VideoNote", "Voice", "WebPage", "Dice", "Reaction", "WebAppData",
"MessageReactions", "MessageStory" "MessageReactions", "MessageStory"
] ]

View File

@ -1,47 +0,0 @@
# 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 pyrogram import enums, raw
from ..object import Object
class StoriesPrivacyRules(Object):
"""A story privacy rules.
Parameters:
type (:obj:`~pyrogram.enums.StoriesPrivacyRules`):
Story privacy type.
"""
def __init__(
self, *,
type: "enums.StoriesPrivacyRules"
):
super().__init__()
self.type = type
def write(self):
if self.type == enums.StoriesPrivacyRules.PUBLIC:
return raw.types.InputPrivacyValueAllowAll().write()
if self.type == enums.StoriesPrivacyRules.CLOSE_FRIENDS:
return raw.types.InputPrivacyValueAllowCloseFriends().write()
if self.type == enums.StoriesPrivacyRules.CONTACTS:
return raw.types.InputPrivacyValueAllowContacts().write()
if self.type == enums.StoriesPrivacyRules.NO_CONTACTS:
return raw.types.InputPrivacyValueDisallowContacts().write()
if self.type == enums.StoriesPrivacyRules.PRIVATE:
return raw.types.InputPrivacyValueDisallowAll().write()