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)