diff --git a/pyrogram/methods/messages/__init__.py b/pyrogram/methods/messages/__init__.py index 5ebedfde..45cccb7e 100644 --- a/pyrogram/methods/messages/__init__.py +++ b/pyrogram/methods/messages/__init__.py @@ -16,8 +16,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from .copy_message import CopyMessage from .copy_media_group import CopyMediaGroup +from .copy_message import CopyMessage from .delete_messages import DeleteMessages from .download_media import DownloadMedia from .edit_inline_caption import EditInlineCaption @@ -37,7 +37,9 @@ from .iter_history import IterHistory from .read_history import ReadHistory from .retract_vote import RetractVote from .search_global import SearchGlobal +from .search_global_count import SearchGlobalCount from .search_messages import SearchMessages +from .search_messages_count import SearchMessagesCount from .send_animation import SendAnimation from .send_audio import SendAudio from .send_cached_media import SendCachedMedia @@ -100,6 +102,8 @@ class Messages( SearchMessages, SearchGlobal, CopyMessage, - CopyMediaGroup + CopyMediaGroup, + SearchMessagesCount, + SearchGlobalCount ): pass diff --git a/pyrogram/methods/messages/search_global_count.py b/pyrogram/methods/messages/search_global_count.py new file mode 100644 index 00000000..113ef813 --- /dev/null +++ b/pyrogram/methods/messages/search_global_count.py @@ -0,0 +1,82 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-2021 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 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", + ) -> int: + """Get the count of messages resulting from a global search. + + If you want to get the actual messages, see :meth:`~pyrogram.Client.search_global`. + + Parameters: + query (``str``, *optional*): + 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. + + 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, + min_date=0, + max_date=0, + offset_rate=0, + offset_peer=raw.types.InputPeerEmpty(), + offset_id=0, + limit=1 + ) + ) + + if hasattr(r, "count"): + return r.count + else: + return len(r.messages) diff --git a/pyrogram/methods/messages/search_messages_count.py b/pyrogram/methods/messages/search_messages_count.py new file mode 100644 index 00000000..02e0c803 --- /dev/null +++ b/pyrogram/methods/messages/search_messages_count.py @@ -0,0 +1,107 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-2021 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 typing import Union + +from pyrogram import raw +from pyrogram.scaffold import Scaffold +from .search_messages import Filters, POSSIBLE_VALUES + + +class SearchMessagesCount(Scaffold): + async def search_messages_count( + self, + chat_id: Union[int, str], + query: str = "", + filter: str = "empty", + from_user: Union[int, str] = None + ) -> int: + """Get the count of messages resulting from a search inside a chat. + + If you want to get the actual messages, see :meth:`~pyrogram.Client.search_messages`. + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + For your personal cloud (Saved Messages) you can simply use "me" or "self". + For a contact that exists in your Telegram address book you can use his phone number (str). + + query (``str``, *optional*): + Text query string. + Required for text-only messages, optional for media messages (see the ``filter`` argument). + When passed while searching for media messages, the query will be applied to captions. + Defaults to "" (empty string). + + 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. + + 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, + min_date=0, + max_date=0, + offset_id=0, + add_offset=0, + limit=1, + min_id=0, + max_id=0, + from_id=( + await self.resolve_peer(from_user) + if from_user + else None + ), + hash=0 + ) + ) + + if hasattr(r, "count"): + return r.count + else: + return len(r.messages)