From bbad58a83f5ec9e295233c97743365c99757eec1 Mon Sep 17 00:00:00 2001 From: Dan <14043624+delivrance@users.noreply.github.com> Date: Sun, 24 Apr 2022 11:56:06 +0200 Subject: [PATCH] Add enumerations --- docs/source/api/enums/ChatAction.rst | 8 + docs/source/api/enums/ChatEventAction.rst | 8 + docs/source/api/enums/ChatMemberStatus.rst | 8 + docs/source/api/enums/ChatMembersFilter.rst | 8 + docs/source/api/enums/ChatType.rst | 8 + docs/source/api/enums/MessageEntityType.rst | 8 + docs/source/api/enums/MessageMedia.rst | 8 + docs/source/api/enums/MessageService.rst | 8 + docs/source/api/enums/MessagesFilter.rst | 8 + docs/source/api/enums/ParseMode.rst | 8 + docs/source/api/enums/PollType.rst | 8 + docs/source/api/enums/SentCodeType.rst | 8 + docs/source/api/enums/UserStatus.rst | 8 + docs/source/api/enums/cleanup.html | 9 + docs/source/api/enums/index.rst | 45 ++++ docs/source/index.rst | 2 + pyrogram/__init__.py | 2 +- pyrogram/client.py | 48 ++--- pyrogram/enums/__init__.py | 31 +++ pyrogram/enums/auto_name.py | 24 +++ pyrogram/enums/chat_action.py | 72 +++++++ pyrogram/enums/chat_event_action.py | 127 ++++++++++++ pyrogram/enums/chat_member_status.py | 43 ++++ pyrogram/enums/chat_members_filter.py | 42 ++++ pyrogram/enums/chat_type.py | 40 ++++ pyrogram/enums/message_entity_type.py | 81 ++++++++ pyrogram/enums/message_media.py | 70 +++++++ pyrogram/enums/message_service.py | 70 +++++++ pyrogram/enums/messages_filter.py | 75 +++++++ pyrogram/enums/parse_mode.py | 37 ++++ pyrogram/enums/poll_type.py | 31 +++ pyrogram/enums/sent_code_type.py | 39 ++++ pyrogram/enums/user_status.py | 43 ++++ pyrogram/filters.py | 7 +- pyrogram/methods/chats/get_chat_members.py | 14 +- pyrogram/methods/messages/copy_message.py | 9 +- .../methods/messages/edit_inline_caption.py | 9 +- pyrogram/methods/messages/edit_inline_text.py | 9 +- .../methods/messages/edit_message_caption.py | 9 +- .../methods/messages/edit_message_text.py | 9 +- pyrogram/methods/messages/search_global.py | 51 +---- .../methods/messages/search_global_count.py | 30 +-- pyrogram/methods/messages/search_messages.py | 67 +----- .../methods/messages/search_messages_count.py | 33 +-- pyrogram/methods/messages/send_animation.py | 9 +- pyrogram/methods/messages/send_audio.py | 9 +- .../methods/messages/send_cached_media.py | 9 +- pyrogram/methods/messages/send_chat_action.py | 62 ++---- pyrogram/methods/messages/send_document.py | 9 +- pyrogram/methods/messages/send_message.py | 9 +- pyrogram/methods/messages/send_photo.py | 9 +- pyrogram/methods/messages/send_poll.py | 12 +- pyrogram/methods/messages/send_video.py | 9 +- pyrogram/methods/messages/send_voice.py | 9 +- pyrogram/parser/html.py | 6 +- pyrogram/parser/markdown.py | 10 +- pyrogram/parser/parser.py | 28 +-- pyrogram/scaffold.py | 6 +- pyrogram/types/authorization/sent_code.py | 40 +--- .../bots_and_keyboards/callback_query.py | 16 +- .../bots_and_keyboards/game_high_score.py | 2 +- .../inline_keyboard_button.py | 2 +- pyrogram/types/inline_mode/inline_query.py | 19 +- .../inline_query_result_animation.py | 9 +- .../inline_mode/inline_query_result_audio.py | 13 +- .../inline_mode/inline_query_result_photo.py | 9 +- .../inline_mode/inline_query_result_video.py | 9 +- .../input_media/input_media_animation.py | 8 +- .../types/input_media/input_media_audio.py | 8 +- .../types/input_media/input_media_document.py | 8 +- .../types/input_media/input_media_photo.py | 8 +- .../types/input_media/input_media_video.py | 8 +- .../input_text_message_content.py | 9 +- pyrogram/types/messages_and_media/message.py | 166 ++++++--------- .../messages_and_media/message_entity.py | 100 ++------- pyrogram/types/messages_and_media/poll.py | 10 +- pyrogram/types/object.py | 4 + pyrogram/types/user_and_chats/chat.py | 34 ++- pyrogram/types/user_and_chats/chat_event.py | 194 ++++++------------ .../types/user_and_chats/chat_event_filter.py | 8 +- pyrogram/types/user_and_chats/chat_member.py | 37 ++-- .../user_and_chats/invite_link_importer.py | 2 +- pyrogram/types/user_and_chats/user.py | 43 ++-- 83 files changed, 1376 insertions(+), 868 deletions(-) create mode 100644 docs/source/api/enums/ChatAction.rst create mode 100644 docs/source/api/enums/ChatEventAction.rst create mode 100644 docs/source/api/enums/ChatMemberStatus.rst create mode 100644 docs/source/api/enums/ChatMembersFilter.rst create mode 100644 docs/source/api/enums/ChatType.rst create mode 100644 docs/source/api/enums/MessageEntityType.rst create mode 100644 docs/source/api/enums/MessageMedia.rst create mode 100644 docs/source/api/enums/MessageService.rst create mode 100644 docs/source/api/enums/MessagesFilter.rst create mode 100644 docs/source/api/enums/ParseMode.rst create mode 100644 docs/source/api/enums/PollType.rst create mode 100644 docs/source/api/enums/SentCodeType.rst create mode 100644 docs/source/api/enums/UserStatus.rst create mode 100644 docs/source/api/enums/cleanup.html create mode 100644 docs/source/api/enums/index.rst create mode 100644 pyrogram/enums/__init__.py create mode 100644 pyrogram/enums/auto_name.py create mode 100644 pyrogram/enums/chat_action.py create mode 100644 pyrogram/enums/chat_event_action.py create mode 100644 pyrogram/enums/chat_member_status.py create mode 100644 pyrogram/enums/chat_members_filter.py create mode 100644 pyrogram/enums/chat_type.py create mode 100644 pyrogram/enums/message_entity_type.py create mode 100644 pyrogram/enums/message_media.py create mode 100644 pyrogram/enums/message_service.py create mode 100644 pyrogram/enums/messages_filter.py create mode 100644 pyrogram/enums/parse_mode.py create mode 100644 pyrogram/enums/poll_type.py create mode 100644 pyrogram/enums/sent_code_type.py create mode 100644 pyrogram/enums/user_status.py diff --git a/docs/source/api/enums/ChatAction.rst b/docs/source/api/enums/ChatAction.rst new file mode 100644 index 00000000..b66df5fd --- /dev/null +++ b/docs/source/api/enums/ChatAction.rst @@ -0,0 +1,8 @@ +ChatAction +========== + +.. autoclass:: pyrogram.enums.ChatAction() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/ChatEventAction.rst b/docs/source/api/enums/ChatEventAction.rst new file mode 100644 index 00000000..0403e781 --- /dev/null +++ b/docs/source/api/enums/ChatEventAction.rst @@ -0,0 +1,8 @@ +ChatEventAction +=============== + +.. autoclass:: pyrogram.enums.ChatEventAction() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/ChatMemberStatus.rst b/docs/source/api/enums/ChatMemberStatus.rst new file mode 100644 index 00000000..bff23eda --- /dev/null +++ b/docs/source/api/enums/ChatMemberStatus.rst @@ -0,0 +1,8 @@ +ChatMemberStatus +================ + +.. autoclass:: pyrogram.enums.ChatMemberStatus() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/ChatMembersFilter.rst b/docs/source/api/enums/ChatMembersFilter.rst new file mode 100644 index 00000000..5a970ffc --- /dev/null +++ b/docs/source/api/enums/ChatMembersFilter.rst @@ -0,0 +1,8 @@ +ChatMembersFilter +================= + +.. autoclass:: pyrogram.enums.ChatMembersFilter() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/ChatType.rst b/docs/source/api/enums/ChatType.rst new file mode 100644 index 00000000..dd653055 --- /dev/null +++ b/docs/source/api/enums/ChatType.rst @@ -0,0 +1,8 @@ +ChatType +======== + +.. autoclass:: pyrogram.enums.ChatType() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/MessageEntityType.rst b/docs/source/api/enums/MessageEntityType.rst new file mode 100644 index 00000000..c7a8965f --- /dev/null +++ b/docs/source/api/enums/MessageEntityType.rst @@ -0,0 +1,8 @@ +MessageEntityType +================= + +.. autoclass:: pyrogram.enums.MessageEntityType() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/MessageMedia.rst b/docs/source/api/enums/MessageMedia.rst new file mode 100644 index 00000000..f42693f0 --- /dev/null +++ b/docs/source/api/enums/MessageMedia.rst @@ -0,0 +1,8 @@ +MessageMedia +============ + +.. autoclass:: pyrogram.enums.MessageMedia() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/MessageService.rst b/docs/source/api/enums/MessageService.rst new file mode 100644 index 00000000..7b7ee4e2 --- /dev/null +++ b/docs/source/api/enums/MessageService.rst @@ -0,0 +1,8 @@ +MessageService +============== + +.. autoclass:: pyrogram.enums.MessageService() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/MessagesFilter.rst b/docs/source/api/enums/MessagesFilter.rst new file mode 100644 index 00000000..09090707 --- /dev/null +++ b/docs/source/api/enums/MessagesFilter.rst @@ -0,0 +1,8 @@ +MessagesFilter +============== + +.. autoclass:: pyrogram.enums.MessagesFilter() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/ParseMode.rst b/docs/source/api/enums/ParseMode.rst new file mode 100644 index 00000000..1bcc74da --- /dev/null +++ b/docs/source/api/enums/ParseMode.rst @@ -0,0 +1,8 @@ +ParseMode +========= + +.. autoclass:: pyrogram.enums.ParseMode() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/PollType.rst b/docs/source/api/enums/PollType.rst new file mode 100644 index 00000000..d00f9ce8 --- /dev/null +++ b/docs/source/api/enums/PollType.rst @@ -0,0 +1,8 @@ +PollType +======== + +.. autoclass:: pyrogram.enums.PollType() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/SentCodeType.rst b/docs/source/api/enums/SentCodeType.rst new file mode 100644 index 00000000..d738b195 --- /dev/null +++ b/docs/source/api/enums/SentCodeType.rst @@ -0,0 +1,8 @@ +SentCodeType +============ + +.. autoclass:: pyrogram.enums.SentCodeType() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/UserStatus.rst b/docs/source/api/enums/UserStatus.rst new file mode 100644 index 00000000..c9a77e1b --- /dev/null +++ b/docs/source/api/enums/UserStatus.rst @@ -0,0 +1,8 @@ +UserStatus +========== + +.. autoclass:: pyrogram.enums.UserStatus() + :members: + +.. raw:: html + :file: ./cleanup.html \ No newline at end of file diff --git a/docs/source/api/enums/cleanup.html b/docs/source/api/enums/cleanup.html new file mode 100644 index 00000000..bb9db780 --- /dev/null +++ b/docs/source/api/enums/cleanup.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/docs/source/api/enums/index.rst b/docs/source/api/enums/index.rst new file mode 100644 index 00000000..7dfa1f3c --- /dev/null +++ b/docs/source/api/enums/index.rst @@ -0,0 +1,45 @@ +Enumerations +============ + +This page is about Pyrogram enumerations. +Enumerations are types that hold a group of related values to be used whenever a constant value is required. +They will help you deal with those values in a type-safe way and also enable code completion so that you can be sure +to apply only a valid value among the expected ones. + +----- + +.. currentmodule:: pyrogram.enums + +.. autosummary:: + :nosignatures: + + ChatAction + ChatEventAction + ChatMemberStatus + ChatMembersFilter + ChatType + MessageEntityType + MessageMedia + MessageService + MessagesFilter + ParseMode + PollType + SentCodeType + UserStatus + +.. toctree:: + :hidden: + + ChatAction + ChatEventAction + ChatMemberStatus + ChatMembersFilter + ChatType + MessageEntityType + MessageMedia + MessageService + MessagesFilter + ParseMode + PollType + SentCodeType + UserStatus \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 8838c3db..910d031f 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -92,6 +92,7 @@ API Reference - :doc:`Pyrogram Client `: Reference details about the Client class. - :doc:`Available Methods `: List of available high-level methods. - :doc:`Available Types `: List of available high-level types. + - :doc:`Enumerations `: List of available enumerations. - :doc:`Bound Methods `: List of convenient bound methods. Meta @@ -130,6 +131,7 @@ Meta api/methods/index api/types/index api/bound-methods/index + api/enums/index api/handlers api/decorators api/errors/index diff --git a/pyrogram/__init__.py b/pyrogram/__init__.py index e102a89d..5e5ea69c 100644 --- a/pyrogram/__init__.py +++ b/pyrogram/__init__.py @@ -37,7 +37,7 @@ class ContinuePropagation(StopAsyncIteration): import asyncio -from . import raw, types, filters, handlers, emoji +from . import raw, types, filters, handlers, emoji, enums from .client import Client from .sync import idle diff --git a/pyrogram/client.py b/pyrogram/client.py index 7d3dbd37..cf3b8ec3 100644 --- a/pyrogram/client.py +++ b/pyrogram/client.py @@ -33,6 +33,7 @@ from typing import Union, List, Optional import pyrogram from pyrogram import __version__, __license__ +from pyrogram import enums from pyrogram import raw from pyrogram import utils from pyrogram.crypto import aes @@ -146,7 +147,7 @@ class Client(Methods, Scaffold): Your Smart Plugins settings as dict, e.g.: *dict(root="plugins")*. This is an alternative way to setup plugins if you don't want to use the *config.ini* file. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): The parse mode, can be any of: *"combined"*, for the default combined mode. *"markdown"* or *"md"* to force Markdown-only styles. *"html"* to force HTML-only styles. *None* to disable the parser completely. @@ -197,7 +198,7 @@ class Client(Methods, Scaffold): workdir: str = Scaffold.WORKDIR, config_file: str = Scaffold.CONFIG_FILE, plugins: dict = None, - parse_mode: str = Scaffold.PARSE_MODES[0], + parse_mode: "enums.ParseMode" = enums.ParseMode.DEFAULT, no_updates: bool = None, takeout: bool = None, sleep_threshold: int = Session.SLEEP_THRESHOLD, @@ -394,44 +395,21 @@ class Client(Methods, Scaffold): return signed_up - @property - def parse_mode(self): - return self._parse_mode - - @parse_mode.setter - def parse_mode(self, parse_mode: Optional[str] = "combined"): - if isinstance(parse_mode, str): - parse_mode = parse_mode.lower() - - if parse_mode not in self.PARSE_MODES: - raise ValueError('parse_mode must be one of {} or None. Not "{}"'.format( - ", ".join(f'"{m}"' for m in self.PARSE_MODES[:-1]), - parse_mode - )) - - self._parse_mode = parse_mode - - # TODO: redundant, remove in next major version - def set_parse_mode(self, parse_mode: Optional[str] = "combined"): + def set_parse_mode(self, parse_mode: Optional["enums.ParseMode"]): """Set the parse mode to be used globally by the client. When setting the parse mode with this method, all other methods having a *parse_mode* parameter will follow the - global value by default. The default value *"combined"* enables both Markdown and HTML styles to be used and - combined together. + global value by default. Parameters: - parse_mode (``str``): - The new parse mode, can be any of: *"combined"*, for the default combined mode. *"markdown"* or *"md"* - to force Markdown-only styles. *"html"* to force HTML-only styles. *None* to disable the parser - completely. - - Raises: - ValueError: In case the provided *parse_mode* is not a valid parse mode. + parse_mode (:obj:`~pyrogram.enums.ParseMode`): + By default, texts are parsed using both Markdown and HTML styles. + You can combine both syntaxes together. Example: .. code-block:: python - from pyrogram import Client + from pyrogram import Client, enums app = Client("my_account") @@ -440,19 +418,19 @@ class Client(Methods, Scaffold): app.send_message("me", "1. **markdown** and html") # Force Markdown-only, HTML is disabled - app.set_parse_mode("markdown") + app.set_parse_mode(enums.ParseMode.MARKDOWN) app.send_message("me", "2. **markdown** and html") # Force HTML-only, Markdown is disabled - app.set_parse_mode("html") + app.set_parse_mode(enums.ParseMode.HTML) app.send_message("me", "3. **markdown** and html") # Disable the parser completely - app.set_parse_mode(None) + app.set_parse_mode(enums.ParseMode.DISABLED) app.send_message("me", "4. **markdown** and html") # Bring back the default combined mode - app.set_parse_mode() + app.set_parse_mode(enums.ParseMode.DEFAULT) app.send_message("me", "5. **markdown** and html") """ diff --git a/pyrogram/enums/__init__.py b/pyrogram/enums/__init__.py new file mode 100644 index 00000000..50c85f60 --- /dev/null +++ b/pyrogram/enums/__init__.py @@ -0,0 +1,31 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from .chat_action import ChatAction +from .chat_event_action import ChatEventAction +from .chat_member_status import ChatMemberStatus +from .chat_members_filter import ChatMembersFilter +from .chat_type import ChatType +from .message_entity_type import MessageEntityType +from .message_media import MessageMedia +from .message_service import MessageService +from .messages_filter import MessagesFilter +from .parse_mode import ParseMode +from .poll_type import PollType +from .sent_code_type import SentCodeType +from .user_status import UserStatus diff --git a/pyrogram/enums/auto_name.py b/pyrogram/enums/auto_name.py new file mode 100644 index 00000000..b1d10d10 --- /dev/null +++ b/pyrogram/enums/auto_name.py @@ -0,0 +1,24 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import Enum + + +class AutoName(Enum): + def _generate_next_value_(self, *args): + return self.lower() diff --git a/pyrogram/enums/chat_action.py b/pyrogram/enums/chat_action.py new file mode 100644 index 00000000..167937e0 --- /dev/null +++ b/pyrogram/enums/chat_action.py @@ -0,0 +1,72 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from pyrogram import raw +from .auto_name import AutoName + + +class ChatAction(AutoName): + """Chat action enumeration used in :obj:`~pyrogram.types.ChatEvent`.""" + + TYPING = raw.types.SendMessageTypingAction + "Typing text message" + + UPLOAD_PHOTO = raw.types.SendMessageUploadPhotoAction + "Uploading photo" + + RECORD_VIDEO = raw.types.SendMessageRecordVideoAction + "Recording video" + + UPLOAD_VIDEO = raw.types.SendMessageUploadVideoAction + "Uploading video" + + RECORD_AUDIO = raw.types.SendMessageRecordAudioAction + "Recording audio" + + UPLOAD_AUDIO = raw.types.SendMessageUploadAudioAction + "Uploading audio" + + UPLOAD_DOCUMENT = raw.types.SendMessageUploadDocumentAction + "Uploading document" + + FIND_LOCATION = raw.types.SendMessageGeoLocationAction + "Finding location" + + RECORD_VIDEO_NOTE = raw.types.SendMessageRecordRoundAction + "Recording video note" + + UPLOAD_VIDEO_NOTE = raw.types.SendMessageUploadRoundAction + "Uploading video note" + + PLAYING = raw.types.SendMessageGamePlayAction + "Playing game" + + CHOOSE_CONTACT = raw.types.SendMessageChooseContactAction + "Choosing contact" + + SPEAKING = raw.types.SpeakingInGroupCallAction + "Speaking in group call" + + IMPORT_HISTORY = raw.types.SendMessageHistoryImportAction + "Importing history" + + CHOOSE_STICKER = raw.types.SendMessageChooseStickerAction + "Choosing sticker" + + CANCEL = raw.types.SendMessageCancelAction + "Cancel ongoing chat action" diff --git a/pyrogram/enums/chat_event_action.py b/pyrogram/enums/chat_event_action.py new file mode 100644 index 00000000..9b73de91 --- /dev/null +++ b/pyrogram/enums/chat_event_action.py @@ -0,0 +1,127 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import auto + +from .auto_name import AutoName + + +class ChatEventAction(AutoName): + """Chat event action enumeration used in :meth:`~pyrogram.Client.get_chat_event_log`.""" + + DESCRIPTION_CHANGED = auto() + "The chat description has been changed (see ``old_description`` and ``new_description``)" + + HISTORY_TTL_CHANGED = auto() + "The history time-to-live has been changed (see ``old_history_ttl`` and ``new_history_ttl``)" + + LINKED_CHAT_CHANGED = auto() + "The linked chat has been changed (see ``old_linked_chat`` and ``new_linked_chat``)" + + # LOCATION_CHANGED = auto() + "" + + PHOTO_CHANGED = auto() + "The chat photo has been changed (see ``old_photo`` and ``new_photo``)" + + # STICKER_SET_CHANGED = auto() + "" + + TITLE_CHANGED = auto() + "the chat title has been changed (see ``old_title`` and ``new_title``)" + + USERNAME_CHANGED = auto() + "the chat username has been changed (see ``old_username`` and ``new_username``)" + + CHAT_PERMISSIONS_CHANGED = auto() + "the default chat permissions has been changed (see ``old_chat_permissions`` and ``new_chat_permissions``)" + + MESSAGE_DELETED = auto() + "a message has been deleted (see ``deleted_message``)" + + # VOICE_CHAT_DISCARDED = auto() + "" + + MESSAGE_EDITED = auto() + "a message has been edited (see ``old_message`` and ``new_message``)" + + INVITE_LINK_EDITED = auto() + "An invite link has been edited (see ``old_invite_link`` and ``new_invite`` link)" + + INVITE_LINK_REVOKED = auto() + "An invite link has been revoked (see ``revoked_invite_link``)" + + INVITE_LINK_DELETED = auto() + "An invite link has been deleted (see ``deleted_invite_link``)" + + MEMBER_INVITED = auto() + "a member has been invited by someone (see ``invited_member``)" + + MEMBER_JOINED = auto() + "a member joined by themselves. (see ``user``)" + + # MEMBER_JOINED_BY_LINK = auto() + "" + + MEMBER_LEFT = auto() + "a member left by themselves. (see ``user``)" + + # MEMBER_MUTED = auto() + "" + + ADMINISTRATOR_PRIVILEGES_CHANGED = auto() + "a chat member has been promoted/demoted or their administrator privileges has changed (see ``old_administrator_privileges`` and ``new_administrator_privileges``)" + + MEMBER_PERMISSIONS_CHANGED = auto() + "a chat member has been restricted/unrestricted or banned/unbanned, or their permissions has changed (see ``old_member_permissions`` and ``new_member_permissions``)" + + # MEMBER_UNMUTED = auto() + "" + + # MEMBER_VOLUME_CHANGED = auto() + "" + + # VOICE_CHAT_STARTED = auto() + "" + + POLL_STOPPED = auto() + "a poll has been stopped (see ``stopped_poll``)" + + # VOICE_CHAT_SETTINGS_CHANGED = auto() + "" + + INVITES_ENABLED = auto() + "the chat invitation has been enabled or disabled (see ``invites_enabled``)" + + HISTORY_HIDDEN = auto() + "the chat history has been hidden or unhidden (see ``history_hidden``)" + + SIGNATURES_ENABLED = auto() + "the message signatures have been enabled or disabled (see ``signatures_enabled``)" + + SLOW_MODE_CHANGED = auto() + "the slow mode has been changes (see ``old_slow_mode`` and ``new_slow_mode``)" + + MESSAGE_PINNED = auto() + "a message has been pinned (see ``pinned_message``)" + + MESSAGE_UNPINNED = auto() + "a message has been unpinned (see ``unpinned_message``)" + + UNKNOWN = auto() + "Unknown chat event action" diff --git a/pyrogram/enums/chat_member_status.py b/pyrogram/enums/chat_member_status.py new file mode 100644 index 00000000..7fa9e8ec --- /dev/null +++ b/pyrogram/enums/chat_member_status.py @@ -0,0 +1,43 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import auto + +from .auto_name import AutoName + + +class ChatMemberStatus(AutoName): + """Chat member status enumeration used in :obj:`~pyrogram.types.ChatMember`.""" + + OWNER = auto() + "Chat owner" + + ADMINISTRATOR = auto() + "Chat administrator" + + MEMBER = auto() + "Chat member" + + RESTRICTED = auto() + "Restricted chat member" + + LEFT = auto() + "Left chat member" + + BANNED = auto() + "Banned chat member" diff --git a/pyrogram/enums/chat_members_filter.py b/pyrogram/enums/chat_members_filter.py new file mode 100644 index 00000000..089f3d4b --- /dev/null +++ b/pyrogram/enums/chat_members_filter.py @@ -0,0 +1,42 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from pyrogram import raw +from .auto_name import AutoName + + +class ChatMembersFilter(AutoName): + """Chat members filter enumeration used in :meth:`~pyrogram.Client.get_chat_members`""" + + ANY = raw.types.ChannelParticipantsSearch + "Any kind of member" + + BANNED = raw.types.ChannelParticipantsKicked + "Banned members" + + RESTRICTED = raw.types.ChannelParticipantsBanned + "Restricted members" + + BOTS = raw.types.ChannelParticipantsBots + "Bots" + + RECENT = raw.types.ChannelParticipantsRecent + "Recently active members" + + ADMINISTRATORS = raw.types.ChannelParticipantsAdmins + "Administrators" diff --git a/pyrogram/enums/chat_type.py b/pyrogram/enums/chat_type.py new file mode 100644 index 00000000..5750e16d --- /dev/null +++ b/pyrogram/enums/chat_type.py @@ -0,0 +1,40 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import auto + +from .auto_name import AutoName + + +class ChatType(AutoName): + """Chat type enumeration used in :obj:`~pyrogram.types.Chat`.""" + + PRIVATE = auto() + "Chat is a private chat with a user" + + BOT = auto() + "Chat is a private chat with a bot" + + GROUP = auto() + "Chat is a basic group" + + SUPERGROUP = auto() + "Chat is a supergroup" + + CHANNEL = auto() + "Chat is a channel" diff --git a/pyrogram/enums/message_entity_type.py b/pyrogram/enums/message_entity_type.py new file mode 100644 index 00000000..34655d37 --- /dev/null +++ b/pyrogram/enums/message_entity_type.py @@ -0,0 +1,81 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from pyrogram import raw +from .auto_name import AutoName + + +class MessageEntityType(AutoName): + """Message entity type enumeration used in :obj:`~pyrogram.types.MessageEntity`.""" + + MENTION = raw.types.MessageEntityMention + "``@username``" + + HASHTAG = raw.types.MessageEntityHashtag + "``#hashtag``" + + CASHTAG = raw.types.MessageEntityCashtag + "``$USD``" + + BOT_COMMAND = raw.types.MessageEntityBotCommand + "``/start@pyrogrambot``" + + URL = raw.types.MessageEntityUrl + "``https://pyrogram.org`` (see ``url``)" + + EMAIL = raw.types.MessageEntityEmail + "``do-not-reply@pyrogram.org``" + + PHONE_NUMBER = raw.types.MessageEntityPhone + "``+1-123-456-7890``" + + BOLD = raw.types.MessageEntityBold + "Bold text" + + ITALIC = raw.types.MessageEntityItalic + "Italic text" + + UNDERLINE = raw.types.MessageEntityUnderline + "Underlined text" + + STRIKETHROUGH = raw.types.MessageEntityStrike + "Strikethrough text" + + SPOILER = raw.types.MessageEntitySpoiler + "Spoiler text" + + CODE = raw.types.MessageEntityCode + "Monowidth string" + + PRE = raw.types.MessageEntityPre + "Monowidth block (see ``language``)" + + BLOCKQUOTE = raw.types.MessageEntityBlockquote + "Blockquote text" + + TEXT_LINK = raw.types.MessageEntityTextUrl + "For clickable text URLs" + + TEXT_MENTION = raw.types.MessageEntityMentionName + "for users without usernames (see ``user``)" + + BANK_CARD = raw.types.MessageEntityBankCard + "Bank card text" + + UNKNOWN = raw.types.MessageEntityUnknown + "Unknown message entity type" diff --git a/pyrogram/enums/message_media.py b/pyrogram/enums/message_media.py new file mode 100644 index 00000000..b7dfd03b --- /dev/null +++ b/pyrogram/enums/message_media.py @@ -0,0 +1,70 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import auto + +from .auto_name import AutoName + + +class MessageMedia(AutoName): + """Message media enumeration used in :obj:`~pyrogram.types.Message`.""" + + AUDIO = auto() + "Audio media" + + DOCUMENT = auto() + "Document media" + + PHOTO = auto() + "Photo media" + + STICKER = auto() + "Sticker media" + + VIDEO = auto() + "Video media" + + ANIMATION = auto() + "Animation media" + + VOICE = auto() + "Voice media" + + VIDEO_NOTE = auto() + "Video note media" + + CONTACT = auto() + "Contact media" + + LOCATION = auto() + "Location media" + + VENUE = auto() + "Venue media" + + POLL = auto() + "Poll media" + + WEB_PAGE = auto() + "Web page media" + + DICE = auto() + "Dice media" + + GAME = auto() + "Game media" diff --git a/pyrogram/enums/message_service.py b/pyrogram/enums/message_service.py new file mode 100644 index 00000000..b38e4717 --- /dev/null +++ b/pyrogram/enums/message_service.py @@ -0,0 +1,70 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import auto + +from .auto_name import AutoName + + +class MessageService(AutoName): + """Message service enumeration used in :obj:`~pyrogram.types.Message`.""" + + NEW_CHAT_MEMBERS = auto() + "New members join" + + LEFT_CHAT_MEMBERS = auto() + "Left chat members" + + NEW_CHAT_TITLE = auto() + "New chat title" + + NEW_CHAT_PHOTO = auto() + "New chat photo" + + DELETE_CHAT_PHOTO = auto() + "Deleted chat photo" + + GROUP_CHAT_CREATED = auto() + "Group chat created" + + CHANNEL_CHAT_CREATED = auto() + "Channel chat created" + + MIGRATE_TO_CHAT_ID = auto() + "Migrated to chat id" + + MIGRATE_FROM_CHAT_ID = auto() + "Migrated from chat id" + + PINNED_MESSAGE = auto() + "Pinned message" + + GAME_HIGH_SCORE = auto() + "Game high score" + + VOICE_CHAT_STARTED = auto() + "Voice chat started" + + VOICE_CHAT_ENDED = auto() + "Voice chat ended" + + VOICE_CHAT_SCHEDULED = auto() + "Voice chat scheduled" + + VOICE_CHAT_MEMBERS_INVITED = auto() + "Voice chat members invited" diff --git a/pyrogram/enums/messages_filter.py b/pyrogram/enums/messages_filter.py new file mode 100644 index 00000000..64d856aa --- /dev/null +++ b/pyrogram/enums/messages_filter.py @@ -0,0 +1,75 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from pyrogram import raw +from .auto_name import AutoName + + +class MessagesFilter(AutoName): + """Messages filter enumeration used in used in :meth:`~pyrogram.Client.search_messages` and used in :meth:`~pyrogram.Client.search_global`""" + + ANY = raw.types.InputMessagesFilterEmpty + "Any kind of message" + + PHOTO = raw.types.InputMessagesFilterPhotos + "Photo messages" + + VIDEO = raw.types.InputMessagesFilterVideo + "Video messages" + + PHOTO_VIDEO = raw.types.InputMessagesFilterPhotoVideo + "Photo and video messages" + + DOCUMENT = raw.types.InputMessagesFilterDocument + "Document messages" + + URL = raw.types.InputMessagesFilterUrl + "Messages containing URLs" + + ANIMATION = raw.types.InputMessagesFilterGif + "Animation messages" + + VOICE_NOTE = raw.types.InputMessagesFilterVoice + "Voice note messages" + + VIDEO_NOTE = raw.types.InputMessagesFilterRoundVideo + "Video note messages" + + AUDIO_VIDEO_NOTE = raw.types.InputMessagesFilterRoundVideo + "Audio and video note messages" + + AUDIO = raw.types.InputMessagesFilterMusic + "Audio messages (music)" + + CHAT_PHOTO = raw.types.InputMessagesFilterChatPhotos + "Chat photo messages" + + PHONE_CALL = raw.types.InputMessagesFilterPhoneCalls + "Phone call messages" + + MENTION = raw.types.InputMessagesFilterMyMentions + "Messages containing mentions" + + LOCATION = raw.types.InputMessagesFilterGeo + "Location messages" + + CONTACT = raw.types.InputMessagesFilterContacts + "Contact messages" + + PINNED = raw.types.InputMessagesFilterPinned + "Pinned messages" diff --git a/pyrogram/enums/parse_mode.py b/pyrogram/enums/parse_mode.py new file mode 100644 index 00000000..26dc165a --- /dev/null +++ b/pyrogram/enums/parse_mode.py @@ -0,0 +1,37 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import auto + +from .auto_name import AutoName + + +class ParseMode(AutoName): + """Parse mode enumeration used in various places to set a specific parse mode""" + + DEFAULT = auto() + "Default mode. Markdown and HTML combined" + + MARKDOWN = auto() + "Markdown only mode" + + HTML = auto() + "HTML only mode" + + DISABLED = auto() + "Disabled mode" diff --git a/pyrogram/enums/poll_type.py b/pyrogram/enums/poll_type.py new file mode 100644 index 00000000..384592de --- /dev/null +++ b/pyrogram/enums/poll_type.py @@ -0,0 +1,31 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import auto + +from .auto_name import AutoName + + +class PollType(AutoName): + """Poll type enumeration used in :obj:`~pyrogram.types.Poll`.""" + + QUIZ = auto() + "Quiz poll" + + REGULAR = auto() + "Regular poll" diff --git a/pyrogram/enums/sent_code_type.py b/pyrogram/enums/sent_code_type.py new file mode 100644 index 00000000..73ae724c --- /dev/null +++ b/pyrogram/enums/sent_code_type.py @@ -0,0 +1,39 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from pyrogram import raw +from .auto_name import AutoName + + +class SentCodeType(AutoName): + """Sent code type enumeration used in :obj:`~pyrogram.types.SentCode`.""" + + APP = raw.types.auth.SentCodeTypeApp + "The code was sent through the telegram app." + + CALL = raw.types.auth.SentCodeTypeCall + "The code will be sent via a phone call. A synthesized voice will tell the user which verification code to input." + + FLASH_CALL = raw.types.auth.SentCodeTypeFlashCall + "The code will be sent via a flash phone call, that will be closed immediately." + + MISSED_CALL = raw.types.auth.SentCodeTypeMissedCall + "Missed call" + + SMS = raw.types.auth.SentCodeTypeSms + "The code was sent via SMS." diff --git a/pyrogram/enums/user_status.py b/pyrogram/enums/user_status.py new file mode 100644 index 00000000..c7c25234 --- /dev/null +++ b/pyrogram/enums/user_status.py @@ -0,0 +1,43 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# 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 . + +from enum import auto + +from .auto_name import AutoName + + +class UserStatus(AutoName): + """User status enumeration used in :obj:`~pyrogram.types.User`.""" + + ONLINE = auto() + """User is online""" + + OFFLINE = auto() + """User is offline""" + + RECENTLY = auto() + """User was seen recently""" + + LAST_WEEK = auto() + """User was seen last week""" + + LAST_MONTH = auto() + """User was seen last month""" + + LONG_AGO = auto() + """User was seen long ago""" diff --git a/pyrogram/filters.py b/pyrogram/filters.py index 2a44fd4f..276d70c2 100644 --- a/pyrogram/filters.py +++ b/pyrogram/filters.py @@ -21,6 +21,7 @@ import re from typing import Callable, Union, List, Pattern import pyrogram +from pyrogram import enums from pyrogram.types import Message, CallbackQuery, InlineQuery, InlineKeyboardMarkup, ReplyKeyboardMarkup, Update @@ -438,7 +439,7 @@ dice = create(dice_filter) # region private_filter async def private_filter(_, __, m: Message): - return bool(m.chat and m.chat.type in {"private", "bot"}) + return bool(m.chat and m.chat.type in {enums.ChatType.PRIVATE, enums.ChatType.BOT}) private = create(private_filter) @@ -449,7 +450,7 @@ private = create(private_filter) # region group_filter async def group_filter(_, __, m: Message): - return bool(m.chat and m.chat.type in {"group", "supergroup"}) + return bool(m.chat and m.chat.type in {enums.ChatType.GROUP, enums.ChatType.SUPERGROUP}) group = create(group_filter) @@ -460,7 +461,7 @@ group = create(group_filter) # region channel_filter async def channel_filter(_, __, m: Message): - return bool(m.chat and m.chat.type == "channel") + return bool(m.chat and m.chat.type == enums.ChatType.CHANNEL) channel = create(channel_filter) diff --git a/pyrogram/methods/chats/get_chat_members.py b/pyrogram/methods/chats/get_chat_members.py index 07d831a9..4c8ae602 100644 --- a/pyrogram/methods/chats/get_chat_members.py +++ b/pyrogram/methods/chats/get_chat_members.py @@ -19,22 +19,12 @@ import logging from typing import Union, List -from pyrogram import raw -from pyrogram import types +from pyrogram import raw, types, enums from pyrogram.scaffold import Scaffold log = logging.getLogger(__name__) -class Filters: - ALL = "all" - BANNED = "banned" - RESTRICTED = "restricted" - BOTS = "bots" - RECENT = "recent" - ADMINISTRATORS = "administrators" - - class GetChatMembers(Scaffold): async def get_chat_members( self, @@ -42,7 +32,7 @@ class GetChatMembers(Scaffold): offset: int = 0, limit: int = 200, query: str = "", - filter: str = Filters.RECENT + filter: "enums.ChatMembersFilter" = enums.ChatMembersFilter.ANY ) -> List["types.ChatMember"]: """Get a chunk of the members list of a chat. diff --git a/pyrogram/methods/messages/copy_message.py b/pyrogram/methods/messages/copy_message.py index 1295edef..07c0c5fa 100644 --- a/pyrogram/methods/messages/copy_message.py +++ b/pyrogram/methods/messages/copy_message.py @@ -19,7 +19,7 @@ import logging from typing import Union, List, Optional -from pyrogram import types +from pyrogram import types, enums from pyrogram.scaffold import Scaffold log = logging.getLogger(__name__) @@ -32,7 +32,7 @@ class CopyMessage(Scaffold): from_chat_id: Union[int, str], message_id: int, caption: str = None, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, disable_notification: bool = None, reply_to_message_id: int = None, @@ -69,12 +69,9 @@ class CopyMessage(Scaffold): If not specified, the original caption is kept. Pass "" (empty string) to remove the caption. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. caption_entities (List of :obj:`~pyrogram.types.MessageEntity`): List of special entities that appear in the new caption, which can be specified instead of *parse_mode*. diff --git a/pyrogram/methods/messages/edit_inline_caption.py b/pyrogram/methods/messages/edit_inline_caption.py index 2f009a05..ed99b62d 100644 --- a/pyrogram/methods/messages/edit_inline_caption.py +++ b/pyrogram/methods/messages/edit_inline_caption.py @@ -18,7 +18,7 @@ from typing import Optional -from pyrogram import types +from pyrogram import types, enums from pyrogram.scaffold import Scaffold @@ -27,7 +27,7 @@ class EditInlineCaption(Scaffold): self, inline_message_id: str, caption: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, reply_markup: "types.InlineKeyboardMarkup" = None ) -> bool: """Edit the caption of inline media messages. @@ -39,12 +39,9 @@ class EditInlineCaption(Scaffold): caption (``str``): New caption of the media message. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup`, *optional*): An InlineKeyboardMarkup object. diff --git a/pyrogram/methods/messages/edit_inline_text.py b/pyrogram/methods/messages/edit_inline_text.py index 996dd4f5..af4b5555 100644 --- a/pyrogram/methods/messages/edit_inline_text.py +++ b/pyrogram/methods/messages/edit_inline_text.py @@ -18,7 +18,7 @@ from typing import Optional -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from pyrogram import utils from pyrogram.scaffold import Scaffold @@ -30,7 +30,7 @@ class EditInlineText(Scaffold): self, inline_message_id: str, text: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, disable_web_page_preview: bool = None, reply_markup: "types.InlineKeyboardMarkup" = None ) -> bool: @@ -43,12 +43,9 @@ class EditInlineText(Scaffold): text (``str``): New text of the message. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. disable_web_page_preview (``bool``, *optional*): Disables link previews for links in this message. diff --git a/pyrogram/methods/messages/edit_message_caption.py b/pyrogram/methods/messages/edit_message_caption.py index 9abdfbe9..e368d4f5 100644 --- a/pyrogram/methods/messages/edit_message_caption.py +++ b/pyrogram/methods/messages/edit_message_caption.py @@ -18,7 +18,7 @@ from typing import Union, List, Optional -from pyrogram import types +from pyrogram import types, enums from pyrogram.scaffold import Scaffold @@ -28,7 +28,7 @@ class EditMessageCaption(Scaffold): chat_id: Union[int, str], message_id: int, caption: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, reply_markup: "types.InlineKeyboardMarkup" = None ) -> "types.Message": @@ -46,12 +46,9 @@ class EditMessageCaption(Scaffold): caption (``str``): New caption of the media message. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. diff --git a/pyrogram/methods/messages/edit_message_text.py b/pyrogram/methods/messages/edit_message_text.py index 5d6ba9cf..c58429a2 100644 --- a/pyrogram/methods/messages/edit_message_text.py +++ b/pyrogram/methods/messages/edit_message_text.py @@ -18,7 +18,7 @@ from typing import Union, List, Optional -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from pyrogram import utils from pyrogram.scaffold import Scaffold @@ -30,7 +30,7 @@ class EditMessageText(Scaffold): chat_id: Union[int, str], message_id: int, text: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, entities: List["types.MessageEntity"] = None, disable_web_page_preview: bool = None, reply_markup: "types.InlineKeyboardMarkup" = None @@ -49,12 +49,9 @@ class EditMessageText(Scaffold): text (``str``): New text of the message. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. entities (List of :obj:`~pyrogram.types.MessageEntity`): List of special entities that appear in message text, which can be specified instead of *parse_mode*. diff --git a/pyrogram/methods/messages/search_global.py b/pyrogram/methods/messages/search_global.py index c3fb7acb..2c22b26f 100644 --- a/pyrogram/methods/messages/search_global.py +++ b/pyrogram/methods/messages/search_global.py @@ -18,37 +18,17 @@ from typing import AsyncGenerator, Optional -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from pyrogram import utils from pyrogram.scaffold import Scaffold -class Filters: - EMPTY = raw.types.InputMessagesFilterEmpty() - PHOTO = raw.types.InputMessagesFilterPhotos() - VIDEO = raw.types.InputMessagesFilterVideo() - PHOTO_VIDEO = raw.types.InputMessagesFilterPhotoVideo() - DOCUMENT = raw.types.InputMessagesFilterDocument() - URL = raw.types.InputMessagesFilterUrl() - ANIMATION = raw.types.InputMessagesFilterGif() - VOICE_NOTE = raw.types.InputMessagesFilterVoice() - AUDIO = raw.types.InputMessagesFilterMusic() - CHAT_PHOTO = raw.types.InputMessagesFilterChatPhotos() - AUDIO_VIDEO_NOTE = raw.types.InputMessagesFilterRoundVideo() - VIDEO_NOTE = raw.types.InputMessagesFilterRoundVideo() - LOCATION = raw.types.InputMessagesFilterGeo() - CONTACT = raw.types.InputMessagesFilterContacts() - - -POSSIBLE_VALUES = list(map(lambda x: x.lower(), filter(lambda x: not x.startswith("__"), Filters.__dict__.keys()))) - - class SearchGlobal(Scaffold): async def search_global( self, query: str = "", - filter: str = "empty", + filter: "enums.MessagesFilter" = enums.MessagesFilter.ANY, limit: int = 0, ) -> Optional[AsyncGenerator["types.Message", None]]: """Search messages globally from all of your chats. @@ -65,23 +45,9 @@ class SearchGlobal(Scaffold): Text query string. Use "@" to search for mentions. - filter (``str``, *optional*): - Pass a filter in order to search for specific kind of messages only: - - - ``"empty"``: Search for all kind of messages (default). - - ``"photo"``: Search for photos. - - ``"video"``: Search for video. - - ``"photo_video"``: Search for either photo or video. - - ``"document"``: Search for documents (generic files). - - ``"url"``: Search for messages containing URLs (web links). - - ``"animation"``: Search for animations (GIFs). - - ``"voice_note"``: Search for voice notes. - - ``"audio"``: Search for audio files (music). - - ``"chat_photo"``: Search for chat photos. - - ``"audio_video_note"``: Search for either audio or video notes. - - ``"video_note"``: Search for video notes. - - ``"location"``: Search for location messages. - - ``"contact"``: Search for contact messages. + filter (:obj:`~pyrogram.enums.MessagesFilter`, *optional*): + Pass a filter in order to search for specific kind of messages only. + Defaults to any message (no filter). limit (``int``, *optional*): Limits the number of messages to be retrieved. @@ -101,11 +67,6 @@ class SearchGlobal(Scaffold): for message in app.search_global(filter="photo", limit=20): print(message.photo) """ - try: - filter = Filters.__dict__[filter.upper()] - except KeyError: - raise ValueError('Invalid filter "{}". Possible values are: {}'.format( - filter, ", ".join(f'"{v}"' for v in POSSIBLE_VALUES))) from None current = 0 # There seems to be an hard limit of 10k, beyond which Telegram starts spitting one message at a time. total = abs(limit) or (1 << 31) @@ -121,7 +82,7 @@ class SearchGlobal(Scaffold): await self.send( raw.functions.messages.SearchGlobal( q=query, - filter=filter, + filter=filter.value(), min_date=0, max_date=0, offset_rate=offset_date, diff --git a/pyrogram/methods/messages/search_global_count.py b/pyrogram/methods/messages/search_global_count.py index 78b69654..d8da0163 100644 --- a/pyrogram/methods/messages/search_global_count.py +++ b/pyrogram/methods/messages/search_global_count.py @@ -16,16 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from pyrogram import raw +from pyrogram import raw, enums from pyrogram.scaffold import Scaffold -from .search_messages import Filters, POSSIBLE_VALUES class SearchGlobalCount(Scaffold): async def search_global_count( self, query: str = "", - filter: str = "empty", + filter: "enums.MessagesFilter" = enums.MessagesFilter.ANY, ) -> int: """Get the count of messages resulting from a global search. @@ -36,37 +35,16 @@ class SearchGlobalCount(Scaffold): Text query string. Use "@" to search for mentions. - filter (``str``, *optional*): + filter (:obj:`~pyrogram.enums.MessagesFilter`, *optional*): Pass a filter in order to search for specific kind of messages only: - - ``"empty"``: Search for all kind of messages (default). - - ``"photo"``: Search for photos. - - ``"video"``: Search for video. - - ``"photo_video"``: Search for either photo or video. - - ``"document"``: Search for documents (generic files). - - ``"url"``: Search for messages containing URLs (web links). - - ``"animation"``: Search for animations (GIFs). - - ``"voice_note"``: Search for voice notes. - - ``"audio"``: Search for audio files (music). - - ``"chat_photo"``: Search for chat photos. - - ``"audio_video_note"``: Search for either audio or video notes. - - ``"video_note"``: Search for video notes. - - ``"location"``: Search for location messages. - - ``"contact"``: Search for contact messages. - Returns: ``int``: On success, the messages count is returned. """ - try: - filter = Filters.__dict__[filter.upper()] - except KeyError: - raise ValueError('Invalid filter "{}". Possible values are: {}'.format( - filter, ", ".join(f'"{v}"' for v in POSSIBLE_VALUES))) from None - r = await self.send( raw.functions.messages.SearchGlobal( q=query, - filter=filter, + filter=filter.value(), min_date=0, max_date=0, offset_rate=0, diff --git a/pyrogram/methods/messages/search_messages.py b/pyrogram/methods/messages/search_messages.py index 91bd6a5a..07728193 100644 --- a/pyrogram/methods/messages/search_messages.py +++ b/pyrogram/methods/messages/search_messages.py @@ -18,56 +18,25 @@ from typing import Union, List, AsyncGenerator, Optional -from pyrogram import raw -from pyrogram import types -from pyrogram import utils +from pyrogram import raw, types, utils, enums from pyrogram.scaffold import Scaffold -class Filters: - EMPTY = raw.types.InputMessagesFilterEmpty() - PHOTO = raw.types.InputMessagesFilterPhotos() - VIDEO = raw.types.InputMessagesFilterVideo() - PHOTO_VIDEO = raw.types.InputMessagesFilterPhotoVideo() - DOCUMENT = raw.types.InputMessagesFilterDocument() - URL = raw.types.InputMessagesFilterUrl() - ANIMATION = raw.types.InputMessagesFilterGif() - VOICE_NOTE = raw.types.InputMessagesFilterVoice() - AUDIO = raw.types.InputMessagesFilterMusic() - CHAT_PHOTO = raw.types.InputMessagesFilterChatPhotos() - PHONE_CALL = raw.types.InputMessagesFilterPhoneCalls() - AUDIO_VIDEO_NOTE = raw.types.InputMessagesFilterRoundVideo() - VIDEO_NOTE = raw.types.InputMessagesFilterRoundVideo() - MENTION = raw.types.InputMessagesFilterMyMentions() - LOCATION = raw.types.InputMessagesFilterGeo() - CONTACT = raw.types.InputMessagesFilterContacts() - PINNED = raw.types.InputMessagesFilterPinned() - - -POSSIBLE_VALUES = list(map(lambda x: x.lower(), filter(lambda x: not x.startswith("__"), Filters.__dict__.keys()))) - - # noinspection PyShadowingBuiltins async def get_chunk( client: Scaffold, chat_id: Union[int, str], query: str = "", - filter: str = "empty", + filter: "enums.MessagesFilter" = enums.MessagesFilter.ANY, offset: int = 0, limit: int = 100, from_user: Union[int, str] = None ) -> List["types.Message"]: - try: - filter = Filters.__dict__[filter.upper()] - except KeyError: - raise ValueError('Invalid filter "{}". Possible values are: {}'.format( - filter, ", ".join(f'"{v}"' for v in POSSIBLE_VALUES))) from None - r = await client.send( raw.functions.messages.Search( peer=await client.resolve_peer(chat_id), q=query, - filter=filter, + filter=filter.value(), min_date=0, max_date=0, offset_id=0, @@ -95,7 +64,7 @@ class SearchMessages(Scaffold): chat_id: Union[int, str], query: str = "", offset: int = 0, - filter: str = "empty", + filter: "enums.MessagesFilter" = enums.MessagesFilter.ANY, limit: int = 0, from_user: Union[int, str] = None ) -> Optional[AsyncGenerator["types.Message", None]]: @@ -119,26 +88,9 @@ class SearchMessages(Scaffold): Sequential number of the first message to be returned. Defaults to 0. - filter (``str``, *optional*): - Pass a filter in order to search for specific kind of messages only: - - - ``"empty"``: Search for all kind of messages (default). - - ``"photo"``: Search for photos. - - ``"video"``: Search for video. - - ``"photo_video"``: Search for either photo or video. - - ``"document"``: Search for documents (generic files). - - ``"url"``: Search for messages containing URLs (web links). - - ``"animation"``: Search for animations (GIFs). - - ``"voice_note"``: Search for voice notes. - - ``"audio"``: Search for audio files (music). - - ``"chat_photo"``: Search for chat photos. - - ``"phone_call"``: Search for phone calls. - - ``"audio_video_note"``: Search for either audio or video notes. - - ``"video_note"``: Search for video notes. - - ``"mention"``: Search for messages containing mentions to yourself. - - ``"location"``: Search for location messages. - - ``"contact"``: Search for contact messages. - - ``"pinned"``: Search for pinned messages. + filter (:obj:`~pyrogram.enums.MessagesFilter`, *optional*): + Pass a filter in order to search for specific kind of messages only. + Defaults to any message (no filter). limit (``int``, *optional*): Limits the number of messages to be retrieved. @@ -153,18 +105,21 @@ class SearchMessages(Scaffold): Example: .. code-block:: python + from pyrogram import enums + # Search for text messages in chat. Get the last 120 results for message in app.search_messages(chat_id, query="hello", limit=120): print(message.text) # Search for pinned messages in chat - for message in app.search_messages(chat_id, filter="pinned"): + for message in app.search_messages(chat_id, filter=enums.MessagesFilter.PINNED): print(message.text) # Search for messages containing "hello" sent by yourself in chat for message in app.search_messages(chat, "hello", from_user="me"): print(message.text) """ + current = 0 total = abs(limit) or (1 << 31) - 1 limit = min(100, total) diff --git a/pyrogram/methods/messages/search_messages_count.py b/pyrogram/methods/messages/search_messages_count.py index 3004eb39..87e0a745 100644 --- a/pyrogram/methods/messages/search_messages_count.py +++ b/pyrogram/methods/messages/search_messages_count.py @@ -18,9 +18,8 @@ from typing import Union -from pyrogram import raw +from pyrogram import raw, enums from pyrogram.scaffold import Scaffold -from .search_messages import Filters, POSSIBLE_VALUES class SearchMessagesCount(Scaffold): @@ -28,7 +27,7 @@ class SearchMessagesCount(Scaffold): self, chat_id: Union[int, str], query: str = "", - filter: str = "empty", + filter: "enums.MessagesFilter" = enums.MessagesFilter.ANY, from_user: Union[int, str] = None ) -> int: """Get the count of messages resulting from a search inside a chat. @@ -47,44 +46,20 @@ class SearchMessagesCount(Scaffold): When passed while searching for media messages, the query will be applied to captions. Defaults to "" (empty string). - filter (``str``, *optional*): + filter (:obj:`~pyrogram.enums.MessagesFilter`, *optional*): Pass a filter in order to search for specific kind of messages only: - - ``"empty"``: Search for all kind of messages (default). - - ``"photo"``: Search for photos. - - ``"video"``: Search for video. - - ``"photo_video"``: Search for either photo or video. - - ``"document"``: Search for documents (generic files). - - ``"url"``: Search for messages containing URLs (web links). - - ``"animation"``: Search for animations (GIFs). - - ``"voice_note"``: Search for voice notes. - - ``"audio"``: Search for audio files (music). - - ``"chat_photo"``: Search for chat photos. - - ``"phone_call"``: Search for phone calls. - - ``"audio_video_note"``: Search for either audio or video notes. - - ``"video_note"``: Search for video notes. - - ``"mention"``: Search for messages containing mentions to yourself. - - ``"location"``: Search for location messages. - - ``"contact"``: Search for contact messages. - - ``"pinned"``: Search for pinned messages. - from_user (``int`` | ``str``, *optional*): Unique identifier (int) or username (str) of the target user you want to search for messages from. Returns: ``int``: On success, the messages count is returned. """ - try: - filter = Filters.__dict__[filter.upper()] - except KeyError: - raise ValueError('Invalid filter "{}". Possible values are: {}'.format( - filter, ", ".join(f'"{v}"' for v in POSSIBLE_VALUES))) from None - r = await self.send( raw.functions.messages.Search( peer=await self.resolve_peer(chat_id), q=query, - filter=filter, + filter=filter.value(), min_date=0, max_date=0, offset_id=0, diff --git a/pyrogram/methods/messages/send_animation.py b/pyrogram/methods/messages/send_animation.py index 963d0681..3777b3ea 100644 --- a/pyrogram/methods/messages/send_animation.py +++ b/pyrogram/methods/messages/send_animation.py @@ -20,7 +20,7 @@ import os import re from typing import Union, BinaryIO, List, Optional -from pyrogram import StopTransmission +from pyrogram import StopTransmission, enums from pyrogram import raw from pyrogram import types from pyrogram import utils @@ -36,7 +36,7 @@ class SendAnimation(Scaffold): animation: Union[str, BinaryIO], caption: str = "", unsave: bool = False, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, duration: int = 0, width: int = 0, @@ -78,12 +78,9 @@ class SendAnimation(Scaffold): By default, the server will save into your own collection any new animation you send. Pass True to automatically unsave the sent animation. Defaults to False. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. diff --git a/pyrogram/methods/messages/send_audio.py b/pyrogram/methods/messages/send_audio.py index 921b7890..e00930af 100644 --- a/pyrogram/methods/messages/send_audio.py +++ b/pyrogram/methods/messages/send_audio.py @@ -20,7 +20,7 @@ import os import re from typing import Union, BinaryIO, List, Optional -from pyrogram import StopTransmission +from pyrogram import StopTransmission, enums from pyrogram import raw from pyrogram import types from pyrogram import utils @@ -35,7 +35,7 @@ class SendAudio(Scaffold): chat_id: Union[int, str], audio: Union[str, BinaryIO], caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, duration: int = 0, performer: str = None, @@ -75,12 +75,9 @@ class SendAudio(Scaffold): caption (``str``, *optional*): Audio caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. diff --git a/pyrogram/methods/messages/send_cached_media.py b/pyrogram/methods/messages/send_cached_media.py index 84fe9b17..5c895121 100644 --- a/pyrogram/methods/messages/send_cached_media.py +++ b/pyrogram/methods/messages/send_cached_media.py @@ -18,7 +18,7 @@ from typing import Union, List, Optional -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from pyrogram import utils from pyrogram.scaffold import Scaffold @@ -30,7 +30,7 @@ class SendCachedMedia(Scaffold): chat_id: Union[int, str], file_id: str, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, disable_notification: bool = None, reply_to_message_id: int = None, @@ -62,12 +62,9 @@ class SendCachedMedia(Scaffold): caption (``str``, *optional*): Media caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. diff --git a/pyrogram/methods/messages/send_chat_action.py b/pyrogram/methods/messages/send_chat_action.py index fc79c015..bbff1d44 100644 --- a/pyrogram/methods/messages/send_chat_action.py +++ b/pyrogram/methods/messages/send_chat_action.py @@ -16,37 +16,19 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -import json from typing import Union +import pyrogram from pyrogram import raw from pyrogram.scaffold import Scaffold -class ChatAction: - TYPING = raw.types.SendMessageTypingAction - UPLOAD_PHOTO = raw.types.SendMessageUploadPhotoAction - RECORD_VIDEO = raw.types.SendMessageRecordVideoAction - UPLOAD_VIDEO = raw.types.SendMessageUploadVideoAction - RECORD_AUDIO = raw.types.SendMessageRecordAudioAction - UPLOAD_AUDIO = raw.types.SendMessageUploadAudioAction - UPLOAD_DOCUMENT = raw.types.SendMessageUploadDocumentAction - FIND_LOCATION = raw.types.SendMessageGeoLocationAction - RECORD_VIDEO_NOTE = raw.types.SendMessageRecordRoundAction - UPLOAD_VIDEO_NOTE = raw.types.SendMessageUploadRoundAction - PLAYING = raw.types.SendMessageGamePlayAction - CHOOSE_CONTACT = raw.types.SendMessageChooseContactAction - SPEAKING = raw.types.SpeakingInGroupCallAction - IMPORT_HISTORY = raw.types.SendMessageHistoryImportAction - CHOOSE_STICKER = raw.types.SendMessageChooseStickerAction - CANCEL = raw.types.SendMessageCancelAction - - -POSSIBLE_VALUES = list(map(lambda x: x.lower(), filter(lambda x: not x.startswith("__"), ChatAction.__dict__.keys()))) - - class SendChatAction(Scaffold): - async def send_chat_action(self, chat_id: Union[int, str], action: str) -> bool: + async def send_chat_action( + self, + chat_id: Union[int, str], + action: "pyrogram.enums.ChatAction" + ) -> bool: """Tell the other party that something is happening on your side. Parameters: @@ -55,14 +37,8 @@ class SendChatAction(Scaffold): 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). - action (``str``): - Type of action to broadcast. Choose one, depending on what the user is about to receive: *"typing"* for - text messages, *"upload_photo"* for photos, *"record_video"* or *"upload_video"* for videos, - *"record_audio"* or *"upload_audio"* for audio files, *"upload_document"* for general files, - *"find_location"* for location data, *"record_video_note"* or *"upload_video_note"* for video notes, - *"choose_contact"* for contacts, *"playing"* for games, *"speaking"* for speaking in group calls or - *"import_history"* for importing history, *"choose_sticker"* for stickers or - *"cancel"* to cancel any chat action currently displayed. + action (:obj:`~pyrogram.enums.ChatAction`): + Type of action to broadcast. Returns: ``bool``: On success, True is returned. @@ -73,29 +49,27 @@ class SendChatAction(Scaffold): Example: .. code-block:: python + from pyrogram import enums + # Send "typing" chat action - app.send_chat_action(chat_id, "typing") + app.send_chat_action(chat_id, enums.ChatAction.TYPING) # Send "upload_video" chat action - app.send_chat_action(chat_id, "upload_video") + app.send_chat_action(chat_id, enums.ChatAction.UPLOAD_VIDEO) # Send "playing" chat action - app.send_chat_action(chat_id, "playing") + app.send_chat_action(chat_id, enums.ChatAction.PLAYING) # Cancel any current chat action - app.send_chat_action(chat_id, "cancel") + app.send_chat_action(chat_id, enums.ChatAction.CANCEL) """ - try: - action = ChatAction.__dict__[action.upper()] - except KeyError: - raise ValueError("Invalid chat action '{}'. Possible values are: {}".format( - action, json.dumps(POSSIBLE_VALUES, indent=4))) from None + action_name = action.name.lower() - if "Upload" in action.__name__ or "History" in action.__name__: - action = action(progress=0) + if "upload" in action_name or "history" in action_name: + action = action.value(progress=0) else: - action = action() + action = action.value() return await self.send( raw.functions.messages.SetTyping( diff --git a/pyrogram/methods/messages/send_document.py b/pyrogram/methods/messages/send_document.py index c3765a17..4a35f8a5 100644 --- a/pyrogram/methods/messages/send_document.py +++ b/pyrogram/methods/messages/send_document.py @@ -20,7 +20,7 @@ import os import re from typing import Union, BinaryIO, List, Optional -from pyrogram import StopTransmission +from pyrogram import StopTransmission, enums from pyrogram import raw from pyrogram import types from pyrogram import utils @@ -36,7 +36,7 @@ class SendDocument(Scaffold): document: Union[str, BinaryIO], thumb: Union[str, BinaryIO] = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, file_name: str = None, force_document: bool = None, @@ -77,12 +77,9 @@ class SendDocument(Scaffold): caption (``str``, *optional*): Document caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. diff --git a/pyrogram/methods/messages/send_message.py b/pyrogram/methods/messages/send_message.py index c0653a38..575aea33 100644 --- a/pyrogram/methods/messages/send_message.py +++ b/pyrogram/methods/messages/send_message.py @@ -18,7 +18,7 @@ from typing import Union, List, Optional -from pyrogram import raw, utils +from pyrogram import raw, utils, enums from pyrogram import types from pyrogram.scaffold import Scaffold @@ -28,7 +28,7 @@ class SendMessage(Scaffold): self, chat_id: Union[int, str], text: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, entities: List["types.MessageEntity"] = None, disable_web_page_preview: bool = None, disable_notification: bool = None, @@ -53,12 +53,9 @@ class SendMessage(Scaffold): text (``str``): Text of the message to be sent. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. entities (List of :obj:`~pyrogram.types.MessageEntity`): List of special entities that appear in message text, which can be specified instead of *parse_mode*. diff --git a/pyrogram/methods/messages/send_photo.py b/pyrogram/methods/messages/send_photo.py index c70be84e..442b45ae 100644 --- a/pyrogram/methods/messages/send_photo.py +++ b/pyrogram/methods/messages/send_photo.py @@ -21,7 +21,7 @@ import re from typing import Union, BinaryIO, List, Optional import pyrogram -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from pyrogram import utils from pyrogram.errors import FilePartMissing @@ -35,7 +35,7 @@ class SendPhoto(Scaffold): chat_id: Union[int, str], photo: Union[str, BinaryIO], caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, ttl_seconds: int = None, disable_notification: bool = None, @@ -69,12 +69,9 @@ class SendPhoto(Scaffold): caption (``str``, *optional*): Photo caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. diff --git a/pyrogram/methods/messages/send_poll.py b/pyrogram/methods/messages/send_poll.py index a412bcdf..df27c057 100644 --- a/pyrogram/methods/messages/send_poll.py +++ b/pyrogram/methods/messages/send_poll.py @@ -19,7 +19,7 @@ from typing import Union, List from pyrogram import raw -from pyrogram import types +from pyrogram import types, enums from pyrogram.scaffold import Scaffold @@ -31,7 +31,7 @@ class SendPoll(Scaffold): options: List[str], is_anonymous: bool = True, allows_multiple_answers: bool = None, - type: str = "regular", + type: "enums.PollType" = enums.PollType.REGULAR, correct_option_id: int = None, disable_notification: bool = None, reply_to_message_id: int = None, @@ -62,9 +62,9 @@ class SendPoll(Scaffold): True, if the poll needs to be anonymous. Defaults to True. - type (``str``, *optional*): - Poll type, "quiz" or "regular". - Defaults to "regular" + type (:obj`~pyrogram.enums.PollType`, *optional*): + Poll type, :obj:`~pyrogram.enums.PollType.QUIZ` or :obj:`~pyrogram.enums.PollType.REGULAR`. + Defaults to :obj:`~pyrogram.enums.PollType.REGULAR`. allows_multiple_answers (``bool``, *optional*): True, if the poll allows multiple answers, ignored for polls in quiz mode. @@ -112,7 +112,7 @@ class SendPoll(Scaffold): ], multiple_choice=allows_multiple_answers or None, public_voters=not is_anonymous or None, - quiz=type == "quiz" or None + quiz=type == enums.PollType.QUIZ or None ), correct_answers=None if correct_option_id is None else [bytes([correct_option_id])] ), diff --git a/pyrogram/methods/messages/send_video.py b/pyrogram/methods/messages/send_video.py index e9448a22..f6dc00ee 100644 --- a/pyrogram/methods/messages/send_video.py +++ b/pyrogram/methods/messages/send_video.py @@ -20,7 +20,7 @@ import os import re from typing import Union, BinaryIO, List, Optional -from pyrogram import StopTransmission +from pyrogram import StopTransmission, enums from pyrogram import raw from pyrogram import types from pyrogram import utils @@ -35,7 +35,7 @@ class SendVideo(Scaffold): chat_id: Union[int, str], video: Union[str, BinaryIO], caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, ttl_seconds: int = None, duration: int = 0, @@ -75,12 +75,9 @@ class SendVideo(Scaffold): caption (``str``, *optional*): Video caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. diff --git a/pyrogram/methods/messages/send_voice.py b/pyrogram/methods/messages/send_voice.py index 80eb386d..c7e960fd 100644 --- a/pyrogram/methods/messages/send_voice.py +++ b/pyrogram/methods/messages/send_voice.py @@ -20,7 +20,7 @@ import os import re from typing import Union, BinaryIO, List, Optional -from pyrogram import StopTransmission +from pyrogram import StopTransmission, enums from pyrogram import raw from pyrogram import types from pyrogram import utils @@ -35,7 +35,7 @@ class SendVoice(Scaffold): chat_id: Union[int, str], voice: Union[str, BinaryIO], caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, duration: int = 0, disable_notification: bool = None, @@ -69,12 +69,9 @@ class SendVoice(Scaffold): caption (``str``, *optional*): Voice message caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. diff --git a/pyrogram/parser/html.py b/pyrogram/parser/html.py index b1ce5c5d..c5f3c1e1 100644 --- a/pyrogram/parser/html.py +++ b/pyrogram/parser/html.py @@ -174,13 +174,13 @@ class HTML: entities_offsets.append((start_tag, start,)) entities_offsets.append((end_tag, end,)) - + entities_offsets = map( lambda x: x[1], sorted( enumerate(entities_offsets), - key = lambda x: (x[1][1], x[0]), - reverse = True + key=lambda x: (x[1][1], x[0]), + reverse=True ) ) diff --git a/pyrogram/parser/markdown.py b/pyrogram/parser/markdown.py index 898ac3d6..8b24d063 100644 --- a/pyrogram/parser/markdown.py +++ b/pyrogram/parser/markdown.py @@ -147,8 +147,14 @@ class Markdown: entities_offsets.append((start_tag, start,)) entities_offsets.append((end_tag, end,)) - # sorting by offset (desc) - entities_offsets.sort(key=lambda x: -x[1]) + entities_offsets = map( + lambda x: x[1], + sorted( + enumerate(entities_offsets), + key=lambda x: (x[1][1], x[0]), + reverse=True + ) + ) for entity, offset in entities_offsets: text = text[:offset] + entity + text[offset:] diff --git a/pyrogram/parser/parser.py b/pyrogram/parser/parser.py index d294e04d..884e1755 100644 --- a/pyrogram/parser/parser.py +++ b/pyrogram/parser/parser.py @@ -16,10 +16,10 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from collections import OrderedDict from typing import Optional import pyrogram +from pyrogram import enums from .html import HTML from .markdown import Markdown @@ -30,36 +30,26 @@ class Parser: self.html = HTML(client) self.markdown = Markdown(client) - async def parse(self, text: str, mode: Optional[str] = object): + async def parse(self, text: str, mode: Optional[str] = None): text = str(text if text else "").strip() - if mode == object: + if mode is None: if self.client: mode = self.client.parse_mode else: - mode = "combined" + mode = enums.ParseMode.DEFAULT - if mode is None: - return OrderedDict([ - ("message", text), - ("entities", []) - ]) - - mode = mode.lower() - - if mode == "combined": + if mode == enums.ParseMode.DEFAULT: return await self.markdown.parse(text) - if mode in ["markdown", "md"]: + if mode == enums.ParseMode.MARKDOWN: return await self.markdown.parse(text, True) - if mode == "html": + if mode == enums.ParseMode.HTML: return await self.html.parse(text) - raise ValueError('parse_mode must be one of {} or None. Not "{}"'.format( - ", ".join(f'"{m}"' for m in pyrogram.Client.PARSE_MODES[:-1]), - mode - )) + if mode == enums.ParseMode.DISABLED: + return {"message": text, "entities": []} @staticmethod def unparse(text: str, entities: list, is_html: bool): diff --git a/pyrogram/scaffold.py b/pyrogram/scaffold.py index d68ddf78..d87d1522 100644 --- a/pyrogram/scaffold.py +++ b/pyrogram/scaffold.py @@ -26,7 +26,7 @@ from mimetypes import MimeTypes from pathlib import Path import pyrogram -from pyrogram import __version__ +from pyrogram import __version__, enums from pyrogram.parser import Parser from pyrogram.session.internals import MsgId from .mime_types import mime_types @@ -46,8 +46,6 @@ class Scaffold: WORKDIR = PARENT_DIR CONFIG_FILE = PARENT_DIR / "config.ini" - PARSE_MODES = ["combined", "markdown", "md", "html", None] - mimetypes = MimeTypes() mimetypes.readfp(StringIO(mime_types)) @@ -90,7 +88,7 @@ class Scaffold: self.rnd_id = MsgId self.parser = Parser(self) - self.parse_mode = "combined" + self.parse_mode = enums.ParseMode.DEFAULT self.session = None diff --git a/pyrogram/types/authorization/sent_code.py b/pyrogram/types/authorization/sent_code.py index a471445a..b0ac9eeb 100644 --- a/pyrogram/types/authorization/sent_code.py +++ b/pyrogram/types/authorization/sent_code.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from pyrogram import raw +from pyrogram import raw, enums from ..object import Object @@ -24,29 +24,25 @@ class SentCode(Object): """Contains info on a sent confirmation code. Parameters: - type (``str``): + type (:obj:`~pyrogram.enums.SentCodeType`): Type of the current sent code. - Can be *"app"* (code sent via Telegram), *"sms"* (code sent via SMS), *"call"* (code sent via voice call) or - *"flash_call"* (code is in the last 5 digits of the caller's phone number). phone_code_hash (``str``): Confirmation code identifier useful for the next authorization steps (either :meth:`~pyrogram.Client.sign_in` or :meth:`~pyrogram.Client.sign_up`). - next_type (``str``): + next_type (:obj:`~pyrogram.enums.SentCodeType`, *optional*): Type of the next code to be sent with :meth:`~pyrogram.Client.resend_code`. - Can be *"sms"* (code will be sent via SMS), *"call"* (code will be sent via voice call) or *"flash_call"* - (code will be in the last 5 digits of caller's phone number). - timeout (``int``): + timeout (``int``, *optional*): Delay in seconds before calling :meth:`~pyrogram.Client.resend_code`. """ def __init__( self, *, - type: str, + type: "enums.SentCodeType", phone_code_hash: str, - next_type: str = None, + next_type: "enums.SentCodeType" = None, timeout: int = None ): super().__init__() @@ -58,29 +54,9 @@ class SentCode(Object): @staticmethod def _parse(sent_code: raw.types.auth.SentCode) -> "SentCode": - type = sent_code.type - - if isinstance(type, raw.types.auth.SentCodeTypeApp): - type = "app" - elif isinstance(type, raw.types.auth.SentCodeTypeSms): - type = "sms" - elif isinstance(type, raw.types.auth.SentCodeTypeCall): - type = "call" - elif isinstance(type, raw.types.auth.SentCodeTypeFlashCall): - type = "flash_call" - - next_type = sent_code.next_type - - if isinstance(next_type, raw.types.auth.CodeTypeSms): - next_type = "sms" - elif isinstance(next_type, raw.types.auth.CodeTypeCall): - next_type = "call" - elif isinstance(next_type, raw.types.auth.CodeTypeFlashCall): - next_type = "flash_call" - return SentCode( - type=type, + type=enums.SentCodeType(type(sent_code.type)), phone_code_hash=sent_code.phone_code_hash, - next_type=next_type, + next_type=enums.SentCodeType(type(sent_code.next_type)) if sent_code.next_type else None, timeout=sent_code.timeout ) diff --git a/pyrogram/types/bots_and_keyboards/callback_query.py b/pyrogram/types/bots_and_keyboards/callback_query.py index 8cdd424a..e5db8723 100644 --- a/pyrogram/types/bots_and_keyboards/callback_query.py +++ b/pyrogram/types/bots_and_keyboards/callback_query.py @@ -21,7 +21,7 @@ from struct import pack from typing import Union, List, Match, Optional import pyrogram -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from ..object import Object from ..update import Update @@ -171,7 +171,7 @@ class CallbackQuery(Object, Update): async def edit_message_text( self, text: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, disable_web_page_preview: bool = None, reply_markup: "types.InlineKeyboardMarkup" = None ) -> Union["types.Message", bool]: @@ -183,12 +183,9 @@ class CallbackQuery(Object, Update): text (``str``): New text of the message. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. disable_web_page_preview (``bool``, *optional*): Disables link previews for links in this message. @@ -224,7 +221,7 @@ class CallbackQuery(Object, Update): async def edit_message_caption( self, caption: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, reply_markup: "types.InlineKeyboardMarkup" = None ) -> Union["types.Message", bool]: """Edit the caption of media messages attached to callback queries. @@ -235,12 +232,9 @@ class CallbackQuery(Object, Update): caption (``str``): New caption of the message. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup`, *optional*): An InlineKeyboardMarkup object. diff --git a/pyrogram/types/bots_and_keyboards/game_high_score.py b/pyrogram/types/bots_and_keyboards/game_high_score.py index 7de78ce9..295b83fb 100644 --- a/pyrogram/types/bots_and_keyboards/game_high_score.py +++ b/pyrogram/types/bots_and_keyboards/game_high_score.py @@ -32,7 +32,7 @@ class GameHighScore(Object): score (``int``): Score. - position (``position``, *optional*): + position (``int``, *optional*): Position in high score table for the game. """ diff --git a/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py b/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py index 9779ec39..de6a0420 100644 --- a/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py +++ b/pyrogram/types/bots_and_keyboards/inline_keyboard_button.py @@ -43,7 +43,7 @@ class InlineKeyboardButton(Object): An HTTP URL used to automatically authorize the user. Can be used as a replacement for the `Telegram Login Widget `_. - user_id (``id``, *optional*): + user_id (``int``, *optional*): User id, for links to the user profile. switch_inline_query (``str``, *optional*): diff --git a/pyrogram/types/inline_mode/inline_query.py b/pyrogram/types/inline_mode/inline_query.py index 2522b693..6f671059 100644 --- a/pyrogram/types/inline_mode/inline_query.py +++ b/pyrogram/types/inline_mode/inline_query.py @@ -20,7 +20,7 @@ from typing import List, Match import pyrogram from pyrogram import raw -from pyrogram import types +from pyrogram import types, enums from ..object import Object from ..update import Update @@ -43,11 +43,8 @@ class InlineQuery(Object, Update): offset (``str``): Offset of the results to be returned, can be controlled by the bot. - chat_type (``str``, *optional*): + chat_type (:obj:`~pyrogram.enums.ChatType`, *optional*): Type of the chat, from which the inline query was sent. - Can be either "sender" for a private chat with the inline query sender, "private", "group", "supergroup", or - "channel". The chat type should be always known for requests sent from official clients and most - third-party clients, unless the request was sent from a secret chat. location (:obj:`~pyrogram.types.Location`. *optional*): Sender location, only for bots that request user location. @@ -65,7 +62,7 @@ class InlineQuery(Object, Update): from_user: "types.User", query: str, offset: str, - chat_type: str, + chat_type: "enums.ChatType", location: "types.Location" = None, matches: List[Match] = None ): @@ -85,15 +82,15 @@ class InlineQuery(Object, Update): chat_type = None if isinstance(peer_type, raw.types.InlineQueryPeerTypeSameBotPM): - chat_type = "sender" + chat_type = enums.ChatType.BOT elif isinstance(peer_type, raw.types.InlineQueryPeerTypePM): - chat_type = "private" + chat_type = enums.ChatType.PRIVATE elif isinstance(peer_type, raw.types.InlineQueryPeerTypeChat): - chat_type = "group" + chat_type = enums.ChatType.GROUP elif isinstance(peer_type, raw.types.InlineQueryPeerTypeMegagroup): - chat_type = "supergroup" + chat_type = enums.ChatType.SUPERGROUP elif isinstance(peer_type, raw.types.InlineQueryPeerTypeBroadcast): - chat_type = "channel" + chat_type = enums.ChatType.CHANNEL return InlineQuery( id=str(inline_query.query_id), diff --git a/pyrogram/types/inline_mode/inline_query_result_animation.py b/pyrogram/types/inline_mode/inline_query_result_animation.py index 2281ae1c..4a170a18 100644 --- a/pyrogram/types/inline_mode/inline_query_result_animation.py +++ b/pyrogram/types/inline_mode/inline_query_result_animation.py @@ -19,7 +19,7 @@ from typing import Optional, List import pyrogram -from pyrogram import raw, types, utils +from pyrogram import raw, types, utils, enums from .inline_query_result import InlineQueryResult @@ -52,12 +52,9 @@ class InlineQueryResultAnimation(InlineQueryResult): caption (``str``, *optional*): Caption of the photo to be sent, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -77,7 +74,7 @@ class InlineQueryResultAnimation(InlineQueryResult): title: str = None, description: str = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, reply_markup: "types.InlineKeyboardMarkup" = None, input_message_content: "types.InputMessageContent" = None diff --git a/pyrogram/types/inline_mode/inline_query_result_audio.py b/pyrogram/types/inline_mode/inline_query_result_audio.py index e36ecb11..06ab5f94 100644 --- a/pyrogram/types/inline_mode/inline_query_result_audio.py +++ b/pyrogram/types/inline_mode/inline_query_result_audio.py @@ -16,10 +16,10 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from typing import Union, List +from typing import Union, List, Optional import pyrogram -from pyrogram import raw, types, utils +from pyrogram import raw, types, utils, enums from .inline_query_result import InlineQueryResult @@ -50,13 +50,10 @@ class InlineQueryResultAudio(InlineQueryResult): caption (``str``, *optional*): Caption of the audio to be sent, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. - + 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*. @@ -75,7 +72,7 @@ class InlineQueryResultAudio(InlineQueryResult): performer: str = "", audio_duration: int = 0, caption: str = "", - parse_mode: Union[str, None] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, reply_markup: "types.InlineKeyboardMarkup" = None, input_message_content: "types.InputMessageContent" = None diff --git a/pyrogram/types/inline_mode/inline_query_result_photo.py b/pyrogram/types/inline_mode/inline_query_result_photo.py index 679ee429..110b6046 100644 --- a/pyrogram/types/inline_mode/inline_query_result_photo.py +++ b/pyrogram/types/inline_mode/inline_query_result_photo.py @@ -19,7 +19,7 @@ from typing import Optional, List import pyrogram -from pyrogram import raw, types, utils +from pyrogram import raw, types, utils, enums from .inline_query_result import InlineQueryResult @@ -52,12 +52,9 @@ class InlineQueryResultPhoto(InlineQueryResult): caption (``str``, *optional*): Caption of the photo to be sent, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -77,7 +74,7 @@ class InlineQueryResultPhoto(InlineQueryResult): title: str = None, description: str = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, reply_markup: "types.InlineKeyboardMarkup" = None, input_message_content: "types.InputMessageContent" = None diff --git a/pyrogram/types/inline_mode/inline_query_result_video.py b/pyrogram/types/inline_mode/inline_query_result_video.py index cd5d8454..5f71111f 100644 --- a/pyrogram/types/inline_mode/inline_query_result_video.py +++ b/pyrogram/types/inline_mode/inline_query_result_video.py @@ -19,7 +19,7 @@ from typing import Optional, List import pyrogram -from pyrogram import raw, types, utils +from pyrogram import raw, types, utils, enums from .inline_query_result import InlineQueryResult @@ -63,12 +63,9 @@ class InlineQueryResultVideo(InlineQueryResult): caption (``str``, *optional*): Caption of the video to be sent, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -93,7 +90,7 @@ class InlineQueryResultVideo(InlineQueryResult): video_duration: int = 0, description: str = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, reply_markup: "types.InlineKeyboardMarkup" = None, input_message_content: "types.InputMessageContent" = None diff --git a/pyrogram/types/input_media/input_media_animation.py b/pyrogram/types/input_media/input_media_animation.py index 76c146c5..04aa940e 100644 --- a/pyrogram/types/input_media/input_media_animation.py +++ b/pyrogram/types/input_media/input_media_animation.py @@ -20,6 +20,7 @@ from typing import Optional, List, Union, BinaryIO from .input_media import InputMedia from ..messages_and_media import MessageEntity +from ... import enums class InputMediaAnimation(InputMedia): @@ -43,12 +44,9 @@ class InputMediaAnimation(InputMedia): Caption of the animation to be sent, 0-1024 characters. If not specified, the original caption is kept. Pass "" (empty string) to remove the caption. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -68,7 +66,7 @@ class InputMediaAnimation(InputMedia): media: Union[str, BinaryIO], thumb: str = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List[MessageEntity] = None, width: int = 0, height: int = 0, diff --git a/pyrogram/types/input_media/input_media_audio.py b/pyrogram/types/input_media/input_media_audio.py index 4816659d..b4bb7575 100644 --- a/pyrogram/types/input_media/input_media_audio.py +++ b/pyrogram/types/input_media/input_media_audio.py @@ -20,6 +20,7 @@ from typing import Optional, List, BinaryIO, Union from .input_media import InputMedia from ..messages_and_media import MessageEntity +from ... import enums class InputMediaAudio(InputMedia): @@ -45,12 +46,9 @@ class InputMediaAudio(InputMedia): Caption of the audio to be sent, 0-1024 characters. If not specified, the original caption is kept. Pass "" (empty string) to remove the caption. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -70,7 +68,7 @@ class InputMediaAudio(InputMedia): media: Union[str, BinaryIO], thumb: str = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List[MessageEntity] = None, duration: int = 0, performer: str = "", diff --git a/pyrogram/types/input_media/input_media_document.py b/pyrogram/types/input_media/input_media_document.py index 3b3a38fd..91dfc7d6 100644 --- a/pyrogram/types/input_media/input_media_document.py +++ b/pyrogram/types/input_media/input_media_document.py @@ -20,6 +20,7 @@ from typing import Optional, List, Union, BinaryIO from .input_media import InputMedia from ..messages_and_media import MessageEntity +from ... import enums class InputMediaDocument(InputMedia): @@ -43,12 +44,9 @@ class InputMediaDocument(InputMedia): Caption of the document to be sent, 0-1024 characters. If not specified, the original caption is kept. Pass "" (empty string) to remove the caption. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -59,7 +57,7 @@ class InputMediaDocument(InputMedia): media: Union[str, BinaryIO], thumb: str = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List[MessageEntity] = None ): super().__init__(media, caption, parse_mode, caption_entities) diff --git a/pyrogram/types/input_media/input_media_photo.py b/pyrogram/types/input_media/input_media_photo.py index f733a7b0..ce8b41a2 100644 --- a/pyrogram/types/input_media/input_media_photo.py +++ b/pyrogram/types/input_media/input_media_photo.py @@ -20,6 +20,7 @@ from typing import Optional, List, Union, BinaryIO from .input_media import InputMedia from ..messages_and_media import MessageEntity +from ... import enums class InputMediaPhoto(InputMedia): @@ -38,12 +39,9 @@ class InputMediaPhoto(InputMedia): Caption of the photo to be sent, 0-1024 characters. If not specified, the original caption is kept. Pass "" (empty string) to remove the caption. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -53,7 +51,7 @@ class InputMediaPhoto(InputMedia): self, media: Union[str, BinaryIO], caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List[MessageEntity] = None ): super().__init__(media, caption, parse_mode, caption_entities) diff --git a/pyrogram/types/input_media/input_media_video.py b/pyrogram/types/input_media/input_media_video.py index 48c79f41..bad4e3ef 100644 --- a/pyrogram/types/input_media/input_media_video.py +++ b/pyrogram/types/input_media/input_media_video.py @@ -20,6 +20,7 @@ from typing import Optional, List, Union, BinaryIO from .input_media import InputMedia from ..messages_and_media import MessageEntity +from ... import enums class InputMediaVideo(InputMedia): @@ -44,12 +45,9 @@ class InputMediaVideo(InputMedia): Caption of the video to be sent, 0-1024 characters. If not specified, the original caption is kept. Pass "" (empty string) to remove the caption. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -72,7 +70,7 @@ class InputMediaVideo(InputMedia): media: Union[str, BinaryIO], thumb: str = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List[MessageEntity] = None, width: int = 0, height: int = 0, diff --git a/pyrogram/types/input_message_content/input_text_message_content.py b/pyrogram/types/input_message_content/input_text_message_content.py index ef54c0b2..7c88f996 100644 --- a/pyrogram/types/input_message_content/input_text_message_content.py +++ b/pyrogram/types/input_message_content/input_text_message_content.py @@ -19,7 +19,7 @@ from typing import Optional, List import pyrogram -from pyrogram import raw, types, utils +from pyrogram import raw, types, utils, enums from .input_message_content import InputMessageContent @@ -30,12 +30,9 @@ class InputTextMessageContent(InputMessageContent): message_text (``str``): Text of the message to be sent, 1-4096 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. entities (List of :obj:`~pyrogram.types.MessageEntity`): List of special entities that appear in message text, which can be specified instead of *parse_mode*. @@ -47,7 +44,7 @@ class InputTextMessageContent(InputMessageContent): def __init__( self, message_text: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, entities: List["types.MessageEntity"] = None, disable_web_page_preview: bool = None ): diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index e6aa2526..2c2f7e05 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -21,7 +21,7 @@ from functools import partial from typing import List, Match, Union, BinaryIO, Optional import pyrogram -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from pyrogram import utils from pyrogram.errors import MessageIdsEmpty, PeerIdInvalid @@ -112,17 +112,15 @@ class Message(Object, Update): The message is empty. A message can be empty in case it was deleted or you tried to retrieve a message that doesn't exist yet. - service (``str``, *optional*): - The message is a service message. This field will contain the name of the service message. - A service message has one and only one of these fields set: new_chat_members, left_chat_member, - new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created, channel_chat_created, - migrate_to_chat_id, migrate_from_chat_id, pinned_message, game_high_score, voice_chat_started, - voice_chat_ended, voice_chat_scheduled, voice_chat_members_invited. + service (:obj:`~pyrogram.enums.MessageService`, *optional*): + The message is a service message. + This field will contain the enumeration type of the service message. + You can use ``service = getattr(message, message.service.value)`` to access the service message. - media (``str``, *optional*): - The message is a media message. This field will contain the name of the media message. - A media message has one and only one of these fields set: audio, document, photo, sticker, video, animation, - voice, video_note, contact, location, venue, poll, web_page, dice, game. + media (:obj:`~pyrogram.enums.MessageMedia`, *optional*): + The message is a media message. + This field will contain the enumeration type of the media message. + You can use ``media = getattr(message, message.media.value)`` to access the media message. edit_date (``int``, *optional*): Date the message was last edited in Unix time. @@ -319,7 +317,7 @@ class Message(Object, Update): reply_to_message: "Message" = None, mentioned: bool = None, empty: bool = None, - service: str = None, + service: "enums.MessageService" = None, scheduled: bool = None, from_scheduled: bool = None, media: str = None, @@ -497,47 +495,47 @@ class Message(Object, Update): if isinstance(action, raw.types.MessageActionChatAddUser): new_chat_members = [types.User._parse(client, users[i]) for i in action.users] - service_type = "new_chat_members" + service_type = enums.MessageService.NEW_CHAT_MEMBERS elif isinstance(action, raw.types.MessageActionChatJoinedByLink): new_chat_members = [types.User._parse(client, users[utils.get_raw_peer_id(message.from_id)])] - service_type = "new_chat_members" + service_type = enums.MessageService.NEW_CHAT_MEMBERS elif isinstance(action, raw.types.MessageActionChatDeleteUser): left_chat_member = types.User._parse(client, users[action.user_id]) - service_type = "left_chat_member" + service_type = enums.MessageService.LEFT_CHAT_MEMBERS elif isinstance(action, raw.types.MessageActionChatEditTitle): new_chat_title = action.title - service_type = "new_chat_title" + service_type = enums.MessageService.NEW_CHAT_TITLE elif isinstance(action, raw.types.MessageActionChatDeletePhoto): delete_chat_photo = True - service_type = "delete_chat_photo" + service_type = enums.MessageService.DELETE_CHAT_PHOTO elif isinstance(action, raw.types.MessageActionChatMigrateTo): migrate_to_chat_id = action.channel_id - service_type = "migrate_to_chat_id" + service_type = enums.MessageService.MIGRATE_TO_CHAT_ID elif isinstance(action, raw.types.MessageActionChannelMigrateFrom): migrate_from_chat_id = action.chat_id - service_type = "migrate_from_chat_id" + service_type = enums.MessageService.MIGRATE_FROM_CHAT_ID elif isinstance(action, raw.types.MessageActionChatCreate): group_chat_created = True - service_type = "group_chat_created" + service_type = enums.MessageService.GROUP_CHAT_CREATED elif isinstance(action, raw.types.MessageActionChannelCreate): channel_chat_created = True - service_type = "channel_chat_created" + service_type = enums.MessageService.CHANNEL_CHAT_CREATED elif isinstance(action, raw.types.MessageActionChatEditPhoto): new_chat_photo = types.Photo._parse(client, action.photo) - service_type = "new_chat_photo" + service_type = enums.MessageService.NEW_CHAT_PHOTO elif isinstance(action, raw.types.MessageActionGroupCallScheduled): voice_chat_scheduled = types.VoiceChatScheduled._parse(action) - service_type = "voice_chat_scheduled" + service_type = enums.MessageService.VOICE_CHAT_SCHEDULED elif isinstance(action, raw.types.MessageActionGroupCall): if action.duration: voice_chat_ended = types.VoiceChatEnded._parse(action) - service_type = "voice_chat_ended" + service_type = enums.MessageService.VOICE_CHAT_ENDED else: voice_chat_started = types.VoiceChatStarted() - service_type = "voice_chat_started" + service_type = enums.MessageService.VOICE_CHAT_STARTED elif isinstance(action, raw.types.MessageActionInviteToGroupCall): voice_chat_members_invited = types.VoiceChatMembersInvited._parse(client, action, users) - service_type = "voice_chat_members_invited" + service_type = enums.MessageService.VOICE_CHAT_MEMBERS_INVITED from_user = types.User._parse(client, users.get(user_id, None)) sender_chat = types.Chat._parse(client, message, users, chats, is_chat=False) if not from_user else None @@ -574,7 +572,7 @@ class Message(Object, Update): replies=0 ) - parsed_message.service = "pinned_message" + parsed_message.service = enums.MessageService.PINNED_MESSAGE except MessageIdsEmpty: pass @@ -589,7 +587,7 @@ class Message(Object, Update): replies=0 ) - parsed_message.service = "game_high_score" + parsed_message.service = enums.MessageService.GAME_HIGH_SCORE except MessageIdsEmpty: pass @@ -646,19 +644,19 @@ class Message(Object, Update): if media: if isinstance(media, raw.types.MessageMediaPhoto): photo = types.Photo._parse(client, media.photo, media.ttl_seconds) - media_type = "photo" + media_type = enums.MessageMedia.PHOTO elif isinstance(media, raw.types.MessageMediaGeo): location = types.Location._parse(client, media.geo) - media_type = "location" + media_type = enums.MessageMedia.LOCATION elif isinstance(media, raw.types.MessageMediaContact): contact = types.Contact._parse(client, media) - media_type = "contact" + media_type = enums.MessageMedia.CONTACT elif isinstance(media, raw.types.MessageMediaVenue): venue = types.Venue._parse(client, media) - media_type = "venue" + media_type = enums.MessageMedia.VENUE elif isinstance(media, raw.types.MessageMediaGame): game = types.Game._parse(client, message) - media_type = "game" + media_type = enums.MessageMedia.GAME elif isinstance(media, raw.types.MessageMediaDocument): doc = media.document @@ -676,14 +674,14 @@ class Message(Object, Update): if audio_attributes.voice: voice = types.Voice._parse(client, doc, audio_attributes) - media_type = "voice" + media_type = enums.MessageMedia.VOICE else: audio = types.Audio._parse(client, doc, audio_attributes, file_name) - media_type = "audio" + media_type = enums.MessageMedia.AUDIO elif raw.types.DocumentAttributeAnimated in attributes: video_attributes = attributes.get(raw.types.DocumentAttributeVideo, None) animation = types.Animation._parse(client, doc, video_attributes, file_name) - media_type = "animation" + media_type = enums.MessageMedia.ANIMATION elif raw.types.DocumentAttributeSticker in attributes: sticker = await types.Sticker._parse( client, doc, @@ -691,31 +689,31 @@ class Message(Object, Update): attributes[raw.types.DocumentAttributeSticker], file_name ) - media_type = "sticker" + media_type = enums.MessageMedia.STICKER elif raw.types.DocumentAttributeVideo in attributes: video_attributes = attributes[raw.types.DocumentAttributeVideo] if video_attributes.round_message: video_note = types.VideoNote._parse(client, doc, video_attributes) - media_type = "video_note" + media_type = enums.MessageMedia.VIDEO_NOTE else: video = types.Video._parse(client, doc, video_attributes, file_name, media.ttl_seconds) - media_type = "video" + media_type = enums.MessageMedia.VIDEO else: document = types.Document._parse(client, doc, file_name) - media_type = "document" + media_type = enums.MessageMedia.DOCUMENT elif isinstance(media, raw.types.MessageMediaWebPage): if isinstance(media.webpage, raw.types.WebPage): web_page = types.WebPage._parse(client, media.webpage) - media_type = "web_page" + media_type = enums.MessageMedia.WEB_PAGE else: media = None elif isinstance(media, raw.types.MessageMediaPoll): poll = types.Poll._parse(client, media) - media_type = "poll" + media_type = enums.MessageMedia.POLL elif isinstance(media, raw.types.MessageMediaDice): dice = types.Dice._parse(client, media) - media_type = "dice" + media_type = enums.MessageMedia.DICE else: media = None @@ -820,7 +818,10 @@ class Message(Object, Update): @property def link(self) -> str: - if self.chat.type in ("group", "supergroup", "channel") and self.chat.username: + if ( + self.chat.type in (enums.ChatType.GROUP, enums.ChatType.SUPERGROUP, enums.ChatType.CHANNEL) + and self.chat.username + ): return f"https://t.me/{self.chat.username}/{self.message_id}" else: return f"https://t.me/c/{utils.get_channel_id(self.chat.id)}/{self.message_id}" @@ -858,7 +859,7 @@ class Message(Object, Update): self, text: str, quote: bool = None, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, entities: List["types.MessageEntity"] = None, disable_web_page_preview: bool = None, disable_notification: bool = None, @@ -895,12 +896,9 @@ class Message(Object, Update): If *reply_to_message_id* is passed, this parameter will be ignored. Defaults to ``True`` in group chats and ``False`` in private chats. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. entities (List of :obj:`~pyrogram.types.MessageEntity`): List of special entities that appear in message text, which can be specified instead of *parse_mode*. @@ -957,7 +955,7 @@ class Message(Object, Update): animation: Union[str, BinaryIO], quote: bool = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, duration: int = 0, width: int = 0, @@ -1005,12 +1003,9 @@ class Message(Object, Update): caption (``str``, *optional*): Animation caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -1099,7 +1094,7 @@ class Message(Object, Update): audio: Union[str, BinaryIO], quote: bool = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, duration: int = 0, performer: str = None, @@ -1147,12 +1142,9 @@ class Message(Object, Update): caption (``str``, *optional*): Audio caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -1241,7 +1233,7 @@ class Message(Object, Update): file_id: str, quote: bool = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, disable_notification: bool = None, reply_to_message_id: int = None, @@ -1281,12 +1273,9 @@ class Message(Object, Update): caption (``bool``, *optional*): Media caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -1454,7 +1443,7 @@ class Message(Object, Update): quote: bool = None, thumb: str = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, file_name: str = None, force_document: bool = None, @@ -1507,12 +1496,9 @@ class Message(Object, Update): caption (``str``, *optional*): Document caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -1867,7 +1853,7 @@ class Message(Object, Update): photo: Union[str, BinaryIO], quote: bool = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, ttl_seconds: int = None, disable_notification: bool = None, @@ -1912,12 +1898,9 @@ class Message(Object, Update): caption (``str``, *optional*): Photo caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -2295,7 +2278,7 @@ class Message(Object, Update): video: Union[str, BinaryIO], quote: bool = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, ttl_seconds: int = None, duration: int = 0, @@ -2345,12 +2328,9 @@ class Message(Object, Update): caption (``str``, *optional*): Video caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -2567,7 +2547,7 @@ class Message(Object, Update): voice: Union[str, BinaryIO], quote: bool = None, caption: str = "", - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, duration: int = 0, disable_notification: bool = None, @@ -2612,12 +2592,9 @@ class Message(Object, Update): caption (``str``, *optional*): Voice message caption, 0-1024 characters. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -2689,7 +2666,7 @@ class Message(Object, Update): async def edit_text( self, text: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, entities: List["types.MessageEntity"] = None, disable_web_page_preview: bool = None, reply_markup: "types.InlineKeyboardMarkup" = None @@ -2717,12 +2694,9 @@ class Message(Object, Update): text (``str``): New text of the message. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. entities (List of :obj:`~pyrogram.types.MessageEntity`): List of special entities that appear in message text, which can be specified instead of *parse_mode*. @@ -2754,7 +2728,7 @@ class Message(Object, Update): async def edit_caption( self, caption: str, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, reply_markup: "types.InlineKeyboardMarkup" = None ) -> "Message": @@ -2779,12 +2753,9 @@ class Message(Object, Update): caption (``str``): New caption of the message. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. 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*. @@ -2938,7 +2909,7 @@ class Message(Object, Update): self, chat_id: Union[int, str], caption: str = None, - parse_mode: Optional[str] = object, + parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, disable_notification: bool = None, reply_to_message_id: int = None, @@ -2979,12 +2950,9 @@ class Message(Object, Update): If not specified, the original caption is kept. Pass "" (empty string) to remove the caption. - parse_mode (``str``, *optional*): + parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): By default, texts are parsed using both Markdown and HTML styles. You can combine both syntaxes together. - Pass "markdown" or "md" to enable Markdown-style parsing only. - Pass "html" to enable HTML-style parsing only. - Pass None to completely disable style parsing. caption_entities (List of :obj:`~pyrogram.types.MessageEntity`): List of special entities that appear in the new caption, which can be specified instead of *parse_mode*. diff --git a/pyrogram/types/messages_and_media/message_entity.py b/pyrogram/types/messages_and_media/message_entity.py index 2595fc66..dbd6a982 100644 --- a/pyrogram/types/messages_and_media/message_entity.py +++ b/pyrogram/types/messages_and_media/message_entity.py @@ -16,87 +16,22 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from enum import Enum, auto from typing import Optional import pyrogram -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from ..object import Object -class AutoName(Enum): - def _generate_next_value_(self, *args): - return self.lower() - - -class MessageEntityType(AutoName): - MENTION = auto() - HASHTAG = auto() - CASHTAG = auto() - BOT_COMMAND = auto() - URL = auto() - EMAIL = auto() - PHONE_NUMBER = auto() - BOLD = auto() - ITALIC = auto() - UNDERLINE = auto() - STRIKETHROUGH = auto() - SPOILER = auto() - CODE = auto() - PRE = auto() - TEXT_LINK = auto() - TEXT_MENTION = auto() - BLOCKQUOTE = auto() - - -RAW_ENTITIES_TO_TYPE = { - raw.types.MessageEntityMention: MessageEntityType.MENTION, - raw.types.MessageEntityHashtag: MessageEntityType.HASHTAG, - raw.types.MessageEntityCashtag: MessageEntityType.CASHTAG, - raw.types.MessageEntityBotCommand: MessageEntityType.BOT_COMMAND, - raw.types.MessageEntityUrl: MessageEntityType.URL, - raw.types.MessageEntityEmail: MessageEntityType.EMAIL, - raw.types.MessageEntityBold: MessageEntityType.BOLD, - raw.types.MessageEntityItalic: MessageEntityType.ITALIC, - raw.types.MessageEntityCode: MessageEntityType.CODE, - raw.types.MessageEntityPre: MessageEntityType.PRE, - raw.types.MessageEntityUnderline: MessageEntityType.UNDERLINE, - raw.types.MessageEntityStrike: MessageEntityType.STRIKETHROUGH, - raw.types.MessageEntitySpoiler: MessageEntityType.SPOILER, - raw.types.MessageEntityBlockquote: MessageEntityType.BLOCKQUOTE, - raw.types.MessageEntityTextUrl: MessageEntityType.TEXT_LINK, - raw.types.MessageEntityMentionName: MessageEntityType.TEXT_MENTION, - raw.types.MessageEntityPhone: MessageEntityType.PHONE_NUMBER -} - -TYPE_TO_RAW_ENTITIES = {v.value: k for k, v in RAW_ENTITIES_TO_TYPE.items()} - - class MessageEntity(Object): """One special entity in a text message. + For example, hashtags, usernames, URLs, etc. Parameters: - type (``str``): - Type of the entity. Can be: - - - "mention": ``@username``. - - "hashtag": ``#hashtag``. - - "cashtag": ``$PYRO``. - - "bot_command": ``/start@pyrogrambot``. - - "url": ``https://pyrogram.org`` (see *url* below). - - "email": ``do-not-reply@pyrogram.org``. - - "phone_number": ``+1-123-456-7890``. - - "bold": **bold text**. - - "italic": *italic text*. - - "underline": underlined text. - - "strikethrough": strikethrough text. - - "spoiler": spoiler text. - - "code": monowidth string. - - "pre": monowidth block (see *language* below). - - "text_link": for clickable text URLs. - - "text_mention": for users without usernames (see *user* below). + type (:obj:`~pyrogram.enums.MessageEntityType`): + Type of the entity. offset (``int``): Offset in UTF-16 code units to the start of the entity. @@ -118,7 +53,7 @@ class MessageEntity(Object): self, *, client: "pyrogram.Client" = None, - type: str, + type: "enums.MessageEntityType", offset: int, length: int, url: str = None, @@ -135,14 +70,9 @@ class MessageEntity(Object): self.language = language @staticmethod - def _parse(client, entity, users: dict) -> Optional["MessageEntity"]: - type = RAW_ENTITIES_TO_TYPE.get(entity.__class__, None) - - if type is None: - return None - + def _parse(client, entity: "raw.base.MessageEntity", users: dict) -> Optional["MessageEntity"]: return MessageEntity( - type=type.value, + type=enums.MessageEntityType(entity.__class__), offset=entity.offset, length=entity.length, url=getattr(entity, "url", None), @@ -166,15 +96,9 @@ class MessageEntity(Object): if self.language is None: args.pop("language") - try: - entity = TYPE_TO_RAW_ENTITIES[self.type] + entity = self.type.value - if entity is raw.types.MessageEntityMentionName: - entity = raw.types.InputMessageEntityMentionName - except KeyError as e: - raise ValueError(f"Invalid message entity type {e}") - else: - try: - return entity(**args) - except TypeError as e: - raise TypeError(f"{entity.QUALNAME}'s {e}") + if entity is raw.types.MessageEntityMentionName: + entity = raw.types.InputMessageEntityMentionName + + return entity(**args) diff --git a/pyrogram/types/messages_and_media/poll.py b/pyrogram/types/messages_and_media/poll.py index 8d46557d..9d4c5118 100644 --- a/pyrogram/types/messages_and_media/poll.py +++ b/pyrogram/types/messages_and_media/poll.py @@ -19,7 +19,7 @@ from typing import List, Union import pyrogram -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from ..object import Object from ..update import Update @@ -47,8 +47,8 @@ class Poll(Object, Update): is_anonymous (``bool``, *optional*): True, if the poll is anonymous - type (``str``, *optional*): - Poll type, currently can be "regular" or "quiz". + type (:obj:`~pyrogram.enums.PollType`, *optional*): + Poll type. allows_multiple_answers (``bool``, *optional*): True, if the poll allows multiple answers. @@ -67,7 +67,7 @@ class Poll(Object, Update): total_voter_count: int, is_closed: bool, is_anonymous: bool = None, - type: str = None, + type: "enums.PollType" = None, allows_multiple_answers: bool = None, # correct_option_id: int, chosen_option: int = None @@ -118,7 +118,7 @@ class Poll(Object, Update): total_voter_count=media_poll.results.total_voters, is_closed=poll.closed, is_anonymous=not poll.public_voters, - type="quiz" if poll.quiz else "regular", + type=enums.PollType.QUIZ if poll.quiz else enums.PollType.REGULAR, allows_multiple_answers=poll.multiple_choice, chosen_option=chosen_option, client=client diff --git a/pyrogram/types/object.py b/pyrogram/types/object.py index 015eeca8..a0925779 100644 --- a/pyrogram/types/object.py +++ b/pyrogram/types/object.py @@ -18,6 +18,7 @@ import typing from datetime import datetime +from enum import Enum from json import dumps import pyrogram @@ -52,6 +53,9 @@ class Object(metaclass=Meta): if isinstance(obj, typing.Match): return repr(obj) + if isinstance(obj, Enum): + return str(obj) + return { "_": obj.__class__.__name__, **{ diff --git a/pyrogram/types/user_and_chats/chat.py b/pyrogram/types/user_and_chats/chat.py index 7ca8f208..2282b1e0 100644 --- a/pyrogram/types/user_and_chats/chat.py +++ b/pyrogram/types/user_and_chats/chat.py @@ -19,7 +19,7 @@ from typing import Union, List, Generator, Optional import pyrogram -from pyrogram import raw +from pyrogram import raw, enums from pyrogram import types from pyrogram import utils from ..object import Object @@ -32,8 +32,8 @@ class Chat(Object): id (``int``): Unique identifier for this chat. - type (``str``): - Type of chat, can be either "private", "bot", "group", "supergroup" or "channel". + type (:obj:`~pyrogram.enums.ChatType`): + Type of chat. is_verified (``bool``, *optional*): True, if this chat has been verified by Telegram. Supergroups, channels and bots only. @@ -135,7 +135,7 @@ class Chat(Object): *, client: "pyrogram.Client" = None, id: int, - type: str, + type: "enums.ChatType", is_verified: bool = None, is_restricted: bool = None, is_creator: bool = None, @@ -200,7 +200,7 @@ class Chat(Object): return Chat( id=peer_id, - type="bot" if user.bot else "private", + type=enums.ChatType.BOT if user.bot else enums.ChatType.PRIVATE, is_verified=getattr(user, "verified", None), is_restricted=getattr(user, "restricted", None), is_scam=getattr(user, "scam", None), @@ -221,7 +221,7 @@ class Chat(Object): return Chat( id=peer_id, - type="group", + type=enums.ChatType.GROUP, title=chat.title, is_creator=getattr(chat, "creator", None), photo=types.ChatPhoto._parse(client, getattr(chat, "photo", None), peer_id, 0), @@ -239,7 +239,7 @@ class Chat(Object): return Chat( id=peer_id, - type="supergroup" if getattr(channel, "megagroup", None) else "channel", + type=enums.ChatType.SUPERGROUP if getattr(channel, "megagroup", None) else enums.ChatType.CHANNEL, is_verified=getattr(channel, "verified", None), is_restricted=getattr(channel, "restricted", None), is_creator=getattr(channel, "creator", None), @@ -842,7 +842,7 @@ class Chat(Object): offset: int = 0, limit: int = 200, query: str = "", - filter: str = "all" + filter: "enums.ChatMembersFilter" = enums.ChatMembersFilter.ANY ) -> List["types.ChatMember"]: """Bound method *get_members* of :obj:`~pyrogram.types.Chat`. @@ -930,17 +930,9 @@ class Chat(Object): Query string to filter members based on their display names and usernames. Only applicable to supergroups and channels. Defaults to "" (empty string) [2]_. - filter (``str``, *optional*): + filter (:obj:`~pyrogram.enums.ChatMembersFilter`, *optional*): Filter used to select the kind of members you want to retrieve. Only applicable for supergroups - and channels. It can be any of the followings: - *"all"* - all kind of members, - *"banned"* - banned members only, - *"restricted"* - restricted members only, - *"bots"* - bots only, - *"recent"* - recent members only, - *"administrators"* - chat administrators only. - Only applicable to supergroups and channels. - Defaults to *"recent"*. + and channels. .. [1] Server limit: on supergroups, you can get up to 10,000 members for a single query and up to 200 members on channels. @@ -950,16 +942,18 @@ class Chat(Object): Example: .. code-block:: python + from pyrogram import enums + # Get first 200 recent members for member in chat.get_members(): print(member.user.first_name) # Get all administrators - for member in chat.iter_members(filter="administrators"): + for member in chat.iter_members(filter=enums.ChatMembersFilter.ADMINISTRATORS): print(member.user.first_name) # Get first 3 bots - for member in chat.iter_members(filter="bots", limit=3): + for member in chat.iter_members(filter=enums.ChatMembersFilter.BOTS, limit=3): print(member.user.first_name) Returns: diff --git a/pyrogram/types/user_and_chats/chat_event.py b/pyrogram/types/user_and_chats/chat_event.py index 374dac50..3abfd1f9 100644 --- a/pyrogram/types/user_and_chats/chat_event.py +++ b/pyrogram/types/user_and_chats/chat_event.py @@ -70,6 +70,8 @@ class ChatEventAction(AutoName): class ChatEvent(Object): """A chat event from the recent actions log (also known as admin log). + See ``action`` to know which kind of event this is and the relative attributes to get the event content. + Parameters: id (``int``): Chat event identifier. @@ -77,171 +79,99 @@ class ChatEvent(Object): date (``int``): Date of the event. Unix time. - action (``str``): - Event action. Can be: - - - "description_changed": the chat description has been changed - (see *old_description* and *new_description* below). - - - "history_ttl_changed": the history time-to-live has been changed - (see *old_history_ttl* and *new_history_ttl* below). - - - "linked_chat_changed": the linked chat has been changed - (see *old_linked_chat* and *new_linked_chat* below). - - - "photo_changed": the chat photo has been changed - (see *old_photo* and *new_photo* below). - - - "title_changed": the chat title has been changed - (see *old_title* and *new_title* below). - - - "username_changed": the chat username has been changed - (see *old_username* and *new_username* below). - - - "chat_permissions_changed": the default chat permissions has been changed - (see *old_chat_permissions* and *new_chat_permissions* below). - - - "message_deleted": a message has been deleted - (see *deleted_message* below). - - - "message_edited": a message has been edited - (see *old_message* and *new_message* below). - - - "member_invited": a member has been invited by someone - (see *invited_member* below). - - - "member_joined": a member joined by themselves. - (see *user* below) - - - "member_left": a member left by themselves. - (see *user* below). - - - "admin_rights_changed": a chat member has been promoted/demoted or their administrator rights has changed - (see *old_admin_rights* and *new_admin_rights* below). - - - "member_permissions_changed": a chat member has been restricted/unrestricted or banned/unbanned, or their - permissions has changed (see *old_member_permissions* and *new_member_permissions* below). - - - "poll_stopped": a poll has been stopped - (see *stopped_poll* below). - - - "invites_enabled": the chat invitation has been enabled or disabled - (see *invites_enabled* below). - - - "history_hidden": the chat history has been hidden or unhidden - (see *history_hidden* below). - - - "signatures_enabled": the message signatures have been enabled or disabled - (see *signatures_enabled* below). - - - "slow_mode_changed": the slow mode has been changes - (see *old_slow_mode* and *new_slow_mode* below). - - - "message_pinned": a message has been pinned - (see *pinned_message* below). - - - "message_unpinned": a message has been unpinned - (see *unpinned_message* below). - - - "invite_link_edited": an invite link has been edited - (see *edited_invite_link* below). - - - "invite_link_revoked": an invite link has been revoked - (see *revoked_invite_link* below). - - - "invite_link_deleted": an invite link has been deleted - (see *deleted_invite_link* below). + action (:obj:`~pyrogram.enums.ChatEventAction`): + Event action. user (:obj:`~pyrogram.types.User`): User that triggered the event. old_description, new_description (``str``, *optional*): Previous and new chat description. - For "description_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.DESCRIPTION_CHANGED` action only. old_history_ttl, new_history_ttl (``int``, *optional*): Previous and new chat history TTL. - For "history_ttl_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.HISTORY_TTL_CHANGED` action only. old_linked_chat, new_linked_chat (:obj:`~pyrogram.types.Chat`, *optional*): Previous and new linked chat. - For "linked_chat_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.LINKED_CHAT_CHANGED` action only. old_photo, new_photo (:obj:`~pyrogram.types.Photo`, *optional*): Previous and new chat photo. - For "photo_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.PHOTO_CHANGED` action only. old_title, new_title (``str``, *optional*): Previous and new chat title. - For "title_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.TITLE_CHANGED` action only. old_username, new_username (``str``, *optional*): Previous and new chat username. - For "username_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.USERNAME_CHANGED` action only. old_chat_permissions, new_chat_permissions (:obj:`~pyrogram.types.ChatPermissions`, *optional*): Previous and new default chat permissions. - For "chat_permissions_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.CHAT_PERMISSIONS_CHANGED` action only. deleted_message (:obj:`~pyrogram.types.Message`, *optional*): Deleted message. - For "deleted_message" only. + For :obj:`~pyrogram.enums.ChatEventAction.MESSAGE_DELETED` action only. old_message, new_message (:obj:`~pyrogram.types.Message`, *optional*): Previous and new message before it has been edited. - For "message_edited" only. + For :obj:`~pyrogram.enums.ChatEventAction.MESSAGE_EDITED` action only. invited_member (:obj:`~pyrogram.types.ChatMember`, *optional*): New invited chat member. - For "member_invited" only. + For :obj:`~pyrogram.enums.ChatEventAction.MEMBER_INVITED` action only. - old_admin_rights, new_admin_rights (:obj:`~pyrogram.types.ChatMember`, *optional*): - Previous and new administrator rights. - For "admin_rights_changed" only. + old_administrator_privileges, new_administrator_privileges (:obj:`~pyrogram.types.ChatMember`, *optional*): + Previous and new administrator privileges. + For :obj:`~pyrogram.enums.ChatEventAction.ADMINISTRATOR_PRIVILEGES_CHANGED` action only. old_member_permissions, new_member_permissions (:obj:`~pyrogram.types.ChatMember`, *optional*): Previous and new member permissions. - For "member_permissions_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.MEMBER_PERMISSIONS_CHANGED` action only. stopped_poll (:obj:`~pyrogram.types.Message`, *optional*): Message containing the stopped poll. - For "poll_stopped" only. + For :obj:`~pyrogram.enums.ChatEventAction.POLL_STOPPED` action only. invites_enabled (``bool``, *optional*): If chat invites were enabled (True) or disabled (False). - For "invites_enabled" only. + For :obj:`~pyrogram.enums.ChatEventAction.INVITES_ENABLED` action only. history_hidden (``bool``, *optional*): If chat history has been hidden (True) or unhidden (False). - For "history_hidden" only. + For :obj:`~pyrogram.enums.ChatEventAction.HISTORY_HIDDEN` action only. signatures_enabled (``bool``, *optional*): If message signatures were enabled (True) or disabled (False). - For "signatures_enabled" only. + For :obj:`~pyrogram.enums.ChatEventAction.SIGNATURES_ENABLED` action only. old_slow_mode, new_slow_mode (``int``, *optional*): Previous and new slow mode value in seconds. - For "slow_mode_changed" only. + For :obj:`~pyrogram.enums.ChatEventAction.SLOW_MODE_CHANGED` action only. pinned_message (:obj:`~pyrogram.types.Message`, *optional*): Pinned message. - For "message_pinned" only. + For :obj:`~pyrogram.enums.ChatEventAction.MESSAGE_PINNED` action only. unpinned_message (:obj:`~pyrogram.types.Message`, *optional*): Unpinned message. - For "unpinned_message" only. + For :obj:`~pyrogram.enums.ChatEventAction.MESSAGE_UNPINNED` action only. old_invite_link, new_invite_link (:obj:`~pyrogram.types.ChatInviteLink`, *optional*): Previous and new edited invite link. - For "invite_link_edited" only. + For :obj:`~pyrogram.enums.ChatEventAction.INVITE_LINK_EDITED` action only. revoked_invite_link (:obj:`~pyrogram.types.ChatInviteLink`, *optional*): Revoked invite link. - For "invite_link_revoked" only. + For :obj:`~pyrogram.enums.ChatEventAction.INVITE_LINK_REVOKED` action only. deleted_invite_link (:obj:`~pyrogram.types.ChatInviteLink`, *optional*): Deleted invite link. - For "invite_link_deleted" only. + For :obj:`~pyrogram.enums.ChatEventAction.INVITE_LINK_DELETED` action only. """ def __init__( @@ -279,8 +209,8 @@ class ChatEvent(Object): invited_member: "types.ChatMember" = None, - old_admin_rights: "types.ChatMember" = None, - new_admin_rights: "types.ChatMember" = None, + old_administrator_privileges: "types.ChatMember" = None, + new_administrator_privileges: "types.ChatMember" = None, old_member_permissions: "types.ChatMember" = None, new_member_permissions: "types.ChatMember" = None, @@ -339,8 +269,8 @@ class ChatEvent(Object): self.invited_member = invited_member - self.old_admin_rights = old_admin_rights - self.new_admin_rights = new_admin_rights + self.old_administrator_privileges = old_administrator_privileges + self.new_administrator_privileges = new_administrator_privileges self.old_member_permissions = old_member_permissions self.new_member_permissions = new_member_permissions @@ -405,8 +335,8 @@ class ChatEvent(Object): invited_member: Optional[types.ChatMember] = None - old_admin_rights: Optional[types.ChatMember] = None - new_admin_rights: Optional[types.ChatMember] = None + old_administrator_privileges: Optional[types.ChatMember] = None + new_administrator_privileges: Optional[types.ChatMember] = None old_member_permissions: Optional[types.ChatMember] = None new_member_permissions: Optional[types.ChatMember] = None @@ -433,102 +363,102 @@ class ChatEvent(Object): if isinstance(action, raw.types.ChannelAdminLogEventActionChangeAbout): old_description = action.prev_value new_description = action.new_value - action = ChatEventAction.DESCRIPTION_CHANGED.value + action = ChatEventAction.DESCRIPTION_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionChangeHistoryTTL): old_history_ttl = action.prev_value new_history_ttl = action.new_value - action = ChatEventAction.HISTORY_TTL_CHANGED.value + action = ChatEventAction.HISTORY_TTL_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionChangeLinkedChat): old_linked_chat = types.Chat._parse_chat(client, chats[action.prev_value]) new_linked_chat = types.Chat._parse_chat(client, chats[action.new_value]) - action = ChatEventAction.LINKED_CHAT_CHANGED.value + action = ChatEventAction.LINKED_CHAT_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionChangePhoto): old_photo = types.Photo._parse(client, action.prev_photo) new_photo = types.Photo._parse(client, action.new_photo) - action = ChatEventAction.PHOTO_CHANGED.value + action = ChatEventAction.PHOTO_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionChangeTitle): old_title = action.prev_value new_title = action.new_value - action = ChatEventAction.TITLE_CHANGED.value + action = ChatEventAction.TITLE_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionChangeUsername): old_username = action.prev_value new_username = action.new_value - action = ChatEventAction.USERNAME_CHANGED.value + action = ChatEventAction.USERNAME_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionDefaultBannedRights): old_chat_permissions = types.ChatPermissions._parse(action.prev_banned_rights) new_chat_permissions = types.ChatPermissions._parse(action.new_banned_rights) - action = ChatEventAction.CHAT_PERMISSIONS_CHANGED.value + action = ChatEventAction.CHAT_PERMISSIONS_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionDeleteMessage): deleted_message = await types.Message._parse(client, action.message, users, chats) - action = ChatEventAction.MESSAGE_DELETED.value + action = ChatEventAction.MESSAGE_DELETED elif isinstance(action, raw.types.ChannelAdminLogEventActionEditMessage): old_message = await types.Message._parse(client, action.prev_message, users, chats) new_message = await types.Message._parse(client, action.new_message, users, chats) - action = ChatEventAction.MESSAGE_EDITED.value + action = ChatEventAction.MESSAGE_EDITED elif isinstance(action, raw.types.ChannelAdminLogEventActionParticipantInvite): invited_member = types.ChatMember._parse(client, action.participant, users, chats) - action = ChatEventAction.MEMBER_INVITED.value + action = ChatEventAction.MEMBER_INVITED elif isinstance(action, raw.types.ChannelAdminLogEventActionParticipantToggleAdmin): - old_admin_rights = types.ChatMember._parse(client, action.prev_participant, users, chats) - new_admin_rights = types.ChatMember._parse(client, action.new_participant, users, chats) - action = ChatEventAction.ADMIN_RIGHTS_CHANGED.value + old_administrator_privileges = types.ChatMember._parse(client, action.prev_participant, users, chats) + new_administrator_privileges = types.ChatMember._parse(client, action.new_participant, users, chats) + action = ChatEventAction.ADMIN_RIGHTS_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionParticipantToggleBan): old_member_permissions = types.ChatMember._parse(client, action.prev_participant, users, chats) new_member_permissions = types.ChatMember._parse(client, action.new_participant, users, chats) - action = ChatEventAction.MEMBER_PERMISSIONS_CHANGED.value + action = ChatEventAction.MEMBER_PERMISSIONS_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionStopPoll): stopped_poll = await types.Message._parse(client, action.message, users, chats) - action = ChatEventAction.POLL_STOPPED.value + action = ChatEventAction.POLL_STOPPED elif isinstance(action, raw.types.ChannelAdminLogEventActionParticipantJoin): - action = ChatEventAction.MEMBER_JOINED.value + action = ChatEventAction.MEMBER_JOINED elif isinstance(action, raw.types.ChannelAdminLogEventActionParticipantLeave): - action = ChatEventAction.MEMBER_LEFT.value + action = ChatEventAction.MEMBER_LEFT elif isinstance(action, raw.types.ChannelAdminLogEventActionToggleInvites): invites_enabled = action.new_value - action = ChatEventAction.INVITES_ENABLED.value + action = ChatEventAction.INVITES_ENABLED elif isinstance(action, raw.types.ChannelAdminLogEventActionTogglePreHistoryHidden): history_hidden = action.new_value - action = ChatEventAction.HISTORY_HIDDEN.value + action = ChatEventAction.HISTORY_HIDDEN elif isinstance(action, raw.types.ChannelAdminLogEventActionToggleSignatures): signatures_enabled = action.new_value - action = ChatEventAction.SIGNATURES_ENABLED.value + action = ChatEventAction.SIGNATURES_ENABLED elif isinstance(action, raw.types.ChannelAdminLogEventActionToggleSlowMode): old_slow_mode = action.prev_value new_slow_mode = action.new_value - action = ChatEventAction.SLOW_MODE_CHANGED.value + action = ChatEventAction.SLOW_MODE_CHANGED elif isinstance(action, raw.types.ChannelAdminLogEventActionUpdatePinned): message = action.message if message.pinned: pinned_message = await types.Message._parse(client, message, users, chats) - action = ChatEventAction.MESSAGE_PINNED.value + action = ChatEventAction.MESSAGE_PINNED else: unpinned_message = await types.Message._parse(client, message, users, chats) - action = ChatEventAction.MESSAGE_UNPINNED.value + action = ChatEventAction.MESSAGE_UNPINNED elif isinstance(action, raw.types.ChannelAdminLogEventActionExportedInviteEdit): old_invite_link = types.ChatInviteLink._parse(client, action.prev_invite, users) new_invite_link = types.ChatInviteLink._parse(client, action.new_invite, users) - action = ChatEventAction.INVITE_LINK_EDITED.value + action = ChatEventAction.INVITE_LINK_EDITED elif isinstance(action, raw.types.ChannelAdminLogEventActionExportedInviteRevoke): revoked_invite_link = types.ChatInviteLink._parse(client, action.invite, users) @@ -536,10 +466,10 @@ class ChatEvent(Object): elif isinstance(action, raw.types.ChannelAdminLogEventActionExportedInviteDelete): deleted_invite_link = types.ChatInviteLink._parse(client, action.invite, users) - action = ChatEventAction.INVITE_LINK_DELETED.value + action = ChatEventAction.INVITE_LINK_DELETED else: - action = f"{ChatEventAction.UNKNOWN.value}-{action.QUALNAME}" + action = f"{ChatEventAction.UNKNOWN}-{action.QUALNAME}" return ChatEvent( id=event.id, @@ -574,8 +504,8 @@ class ChatEvent(Object): invited_member=invited_member, - old_admin_rights=old_admin_rights, - new_admin_rights=new_admin_rights, + old_administrator_privileges=old_administrator_privileges, + new_administrator_privileges=new_administrator_privileges, old_member_permissions=old_member_permissions, new_member_permissions=new_member_permissions, diff --git a/pyrogram/types/user_and_chats/chat_event_filter.py b/pyrogram/types/user_and_chats/chat_event_filter.py index d88300ba..7edc3a07 100644 --- a/pyrogram/types/user_and_chats/chat_event_filter.py +++ b/pyrogram/types/user_and_chats/chat_event_filter.py @@ -28,7 +28,7 @@ class ChatEventFilter(Object): True, if member restricted/unrestricted/banned/unbanned events should be returned. Defaults to False. - admin_rights (``bool``, *optional*): + new_privileges (``bool``, *optional*): True, if member promotion/demotion events should be returned. Defaults to False. @@ -74,7 +74,7 @@ class ChatEventFilter(Object): def __init__( self, *, new_restrictions: bool = False, - admin_rights: bool = False, + new_privileges: bool = False, new_members: bool = False, chat_info: bool = False, chat_settings: bool = False, @@ -88,7 +88,7 @@ class ChatEventFilter(Object): super().__init__() self.new_restrictions = new_restrictions - self.admin_rights = admin_rights + self.new_privileges = new_privileges self.new_members = new_members self.chat_info = chat_info self.chat_settings = chat_settings @@ -123,7 +123,7 @@ class ChatEventFilter(Object): kick = True unkick = True - if self.admin_rights: + if self.new_privileges: promote = True demote = True diff --git a/pyrogram/types/user_and_chats/chat_member.py b/pyrogram/types/user_and_chats/chat_member.py index 65324dbd..dc00354f 100644 --- a/pyrogram/types/user_and_chats/chat_member.py +++ b/pyrogram/types/user_and_chats/chat_member.py @@ -19,7 +19,7 @@ from typing import Union, Dict import pyrogram -from pyrogram import raw, types, utils +from pyrogram import raw, types, utils, enums from ..object import Object @@ -27,9 +27,8 @@ class ChatMember(Object): """Contains information about one member of a chat. Parameters: - status (``str``): + status (:obj:`~pyrogram.enums.ChatMemberStatus`): The member's status in the chat. - Can be "creator", "administrator", "member", "restricted", "left" or "banned". user (:obj:`~pyrogram.types.User`, *optional*): Information about the user. @@ -76,7 +75,7 @@ class ChatMember(Object): self, *, client: "pyrogram.Client" = None, - status: str, + status: "enums.ChatMemberStatus", user: "types.User" = None, chat: "types.Chat" = None, custom_title: str = None, @@ -108,15 +107,15 @@ class ChatMember(Object): @staticmethod def _parse( - client: "pyrogram.Client", - member: Union["raw.base.ChatParticipant", "raw.base.ChannelParticipant"], - users: Dict[int, "raw.base.User"], - chats: Dict[int, "raw.base.Chat"] + client: "pyrogram.Client", + member: Union["raw.base.ChatParticipant", "raw.base.ChannelParticipant"], + users: Dict[int, "raw.base.User"], + chats: Dict[int, "raw.base.Chat"] ) -> "ChatMember": # Chat participants if isinstance(member, raw.types.ChatParticipant): return ChatMember( - status="member", + status=enums.ChatMemberStatus.MEMBER, user=types.User._parse(client, users[member.user_id]), joined_date=member.date, invited_by=types.User._parse(client, users[member.inviter_id]), @@ -124,7 +123,7 @@ class ChatMember(Object): ) elif isinstance(member, raw.types.ChatParticipantAdmin): return ChatMember( - status="administrator", + status=enums.ChatMemberStatus.ADMINISTRATOR, user=types.User._parse(client, users[member.user_id]), joined_date=member.date, invited_by=types.User._parse(client, users[member.inviter_id]), @@ -132,7 +131,7 @@ class ChatMember(Object): ) elif isinstance(member, raw.types.ChatParticipantCreator): return ChatMember( - status="owner", + status=enums.ChatMemberStatus.OWNER, user=types.User._parse(client, users[member.user_id]), client=client ) @@ -140,14 +139,14 @@ class ChatMember(Object): # Channel participants if isinstance(member, raw.types.ChannelParticipant): return ChatMember( - status="member", + status=enums.ChatMemberStatus.MEMBER, user=types.User._parse(client, users[member.user_id]), joined_date=member.date, client=client ) elif isinstance(member, raw.types.ChannelParticipantAdmin): return ChatMember( - status="administrator", + status=enums.ChatMemberStatus.ADMINISTRATOR, user=types.User._parse(client, users[member.user_id]), joined_date=member.date, promoted_by=types.User._parse(client, users[member.promoted_by]), @@ -172,7 +171,11 @@ class ChatMember(Object): ) return ChatMember( - status="banned" if member.banned_rights.view_messages else "restricted", + status=( + enums.ChatMemberStatus.BANNED + if member.banned_rights.view_messages + else enums.ChatMemberStatus.RESTRICTED + ), user=user, chat=chat, until_date=member.banned_rights.until_date, @@ -184,7 +187,7 @@ class ChatMember(Object): ) elif isinstance(member, raw.types.ChannelParticipantCreator): return ChatMember( - status="owner", + status=enums.ChatMemberStatus.OWNER, user=types.User._parse(client, users[member.user_id]), custom_title=member.rank, privileges=types.ChatPrivileges._parse(member.admin_rights), @@ -205,14 +208,14 @@ class ChatMember(Object): ) return ChatMember( - status="left", + status=enums.ChatMemberStatus.LEFT, user=user, chat=chat, client=client ) elif isinstance(member, raw.types.ChannelParticipantSelf): return ChatMember( - status="member", + status=enums.ChatMemberStatus.MEMBER, user=types.User._parse(client, users[member.user_id]), joined_date=member.date, invited_by=types.User._parse(client, users[member.inviter_id]), diff --git a/pyrogram/types/user_and_chats/invite_link_importer.py b/pyrogram/types/user_and_chats/invite_link_importer.py index f933cfa2..db8569f5 100644 --- a/pyrogram/types/user_and_chats/invite_link_importer.py +++ b/pyrogram/types/user_and_chats/invite_link_importer.py @@ -39,7 +39,7 @@ class InviteLinkImporter(Object): self.user = user @staticmethod - def _parse(client, invite_importers: "raw.types.ChatInviteImporters"): + def _parse(client, invite_importers: "raw.types.messages.ChatInviteImporters"): importers = types.List() d = {i.id: i for i in invite_importers.users} diff --git a/pyrogram/types/user_and_chats/user.py b/pyrogram/types/user_and_chats/user.py index ac141033..f4678a35 100644 --- a/pyrogram/types/user_and_chats/user.py +++ b/pyrogram/types/user_and_chats/user.py @@ -20,6 +20,7 @@ import html from typing import List, Optional import pyrogram +from pyrogram import enums from pyrogram import raw from pyrogram import types from ..object import Object @@ -28,9 +29,9 @@ from ..update import Update class Link(str): HTML = "{text}" - MD = "[{text}]({url})" + MARKDOWN = "[{text}]({url})" - def __init__(self, url: str, text: str, style: str): + def __init__(self, url: str, text: str, style: enums.ParseMode): super().__init__() self.url = url @@ -38,13 +39,11 @@ class Link(str): self.style = style @staticmethod - def format(url: str, text: str, style: str): - if style in ["md", "markdown"]: - fmt = Link.MD - elif style in ["combined", "html", None]: - fmt = Link.HTML + def format(url: str, text: str, style: enums.ParseMode): + if style == enums.ParseMode.MARKDOWN: + fmt = Link.MARKDOWN else: - raise ValueError(f"{style} is not a valid style/parse mode") + fmt = Link.HTML return fmt.format(url=url, text=html.escape(text)) @@ -103,16 +102,8 @@ class User(Object, Update): last_name (``str``, *optional*): User's or bot's last name. - status (``str``, *optional*): - User's Last Seen & Online status. - Can be one of the following: - "*online*", user is online right now. - "*offline*", user is currently offline. - "*recently*", user with hidden last seen time who was online between 1 second and 2-3 days ago. - "*within_week*", user with hidden last seen time who was online between 2-3 and seven days ago. - "*within_month*", user with hidden last seen time who was online between 6-7 days and a month ago. - "*long_time_ago*", blocked user or user with hidden last seen time who was online more than a month ago. - *None*, for bots. + status (:obj:`~pyrogram.enums.UserStatus`, *optional*): + User's last seen & online status. *None*, for bots. last_online_date (``int``, *optional*): Last online date of a user, unix time. Only available in case status is "*offline*". @@ -237,17 +228,17 @@ class User(Object, Update): @staticmethod def _parse_status(user_status: "raw.base.UserStatus", is_bot: bool = False): if isinstance(user_status, raw.types.UserStatusOnline): - status, date = "online", user_status.expires + status, date = enums.UserStatus.ONLINE, user_status.expires elif isinstance(user_status, raw.types.UserStatusOffline): - status, date = "offline", user_status.was_online + status, date = enums.UserStatus.OFFLINE, user_status.was_online elif isinstance(user_status, raw.types.UserStatusRecently): - status, date = "recently", None + status, date = enums.UserStatus.RECENTLY, None elif isinstance(user_status, raw.types.UserStatusLastWeek): - status, date = "within_week", None + status, date = enums.UserStatus.LAST_WEEK, None elif isinstance(user_status, raw.types.UserStatusLastMonth): - status, date = "within_month", None + status, date = enums.UserStatus.LAST_MONTH, None else: - status, date = "long_time_ago", None + status, date = enums.UserStatus.LONG_AGO, None last_online_date = None next_offline_date = None @@ -255,10 +246,10 @@ class User(Object, Update): if is_bot: status = None - if status == "online": + if status == enums.UserStatus.ONLINE: next_offline_date = date - if status == "offline": + if status == enums.UserStatus.OFFLINE: last_online_date = date return {