Skip to content

Commit

Permalink
Add Hashtag Search methods
Browse files Browse the repository at this point in the history
search_global_hashtag_messages
search_global_hashtag_messages_count

Signed-off-by: wulan17 <wulan17@nusantararom.org>
  • Loading branch information
SpEcHiDe authored and wulan17 committed Jun 8, 2024
1 parent ace0da1 commit dcbbbb2
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 0 deletions.
2 changes: 2 additions & 0 deletions compiler/docs/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,8 @@ def get_title_list(s: str) -> list:
search_messages_count
search_global
search_global_count
search_global_hashtag_messages
search_global_hashtag_messages_count
download_media
stream_media
get_discussion_message
Expand Down
4 changes: 4 additions & 0 deletions pyrogram/methods/messages/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
from .retract_vote import RetractVote
from .search_global import SearchGlobal
from .search_global_count import SearchGlobalCount
from .search_global_hashtag_messages import SearchGlobalHashtagMessages
from .search_global_hashtag_messages_count import SearchGlobalHashtagMessagesCount
from .search_messages import SearchMessages
from .search_messages_count import SearchMessagesCount
from .send_animation import SendAnimation
Expand Down Expand Up @@ -110,10 +112,12 @@ class Messages(
SendDice,
SearchMessages,
SearchGlobal,
SearchGlobalHashtagMessages,
CopyMessage,
CopyMediaGroup,
SearchMessagesCount,
SearchGlobalCount,
SearchGlobalHashtagMessagesCount,
GetDiscussionMessage,
SendReaction,
GetDiscussionReplies,
Expand Down
102 changes: 102 additions & 0 deletions pyrogram/methods/messages/search_global_hashtag_messages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# This file is part of Pyrogram.
#
# Pyrogram is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Pyrogram is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.

from datetime import datetime
from typing import AsyncGenerator

import pyrogram
from pyrogram import raw, types, utils


class SearchGlobalHashtagMessages:
async def search_global_hashtag_messages(
self: "pyrogram.Client",
hashtag: str = "",
offset_id: int = 0,
offset_date: datetime = utils.zero_datetime(),
limit: int = 0,
) -> AsyncGenerator["types.Message", None]:
"""Searches for public channel posts with the given hashtag. For optimal performance, the number of returned messages is chosen by Telegram Server and can be smaller than the specified limit.
If you want to get the posts count only, see :meth:`~pyrogram.Client.search_public_hashtag_messages_count`.
.. include:: /_includes/usable-by/users.rst
Parameters:
hashtag (``str``, *optional*):
Hashtag to search for.
offset_id (``int``, *optional*):
Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
offset_date (:py:obj:`~datetime.datetime`, *optional*):
Pass a date as offset to retrieve only older messages starting from that date.
limit (``int``, *optional*):
The maximum number of messages to be returned.
By default, no limit is applied and all posts are returned.
Returns:
``Generator``: A generator yielding :obj:`~pyrogram.types.Message` objects.
Example:
.. code-block:: python
# Search for "#pyrogram". Get the first 50 results
async for message in app.search_public_hashtag_messages("#pyrogram"):
print(message.text)
"""
current = 0
total = abs(limit) or (1 << 31)
limit = min(100, total)

offset_peer = raw.types.InputPeerEmpty()

while True:
messages = await utils.parse_messages(
self,
await self.invoke(
raw.functions.channels.SearchPosts(
hashtag=hashtag,
offset_rate=utils.datetime_to_timestamp(offset_date),
offset_peer=offset_peer,
offset_id=offset_id,
limit=limit
),
sleep_threshold=60
),
replies=0
)

if not messages:
return

last = messages[-1]

offset_date = utils.datetime_to_timestamp(last.date)
offset_peer = await self.resolve_peer(last.chat.id)
offset_id = last.id

for message in messages:
yield message

current += 1

if current >= total:
return
55 changes: 55 additions & 0 deletions pyrogram/methods/messages/search_global_hashtag_messages_count.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# This file is part of Pyrogram.
#
# Pyrogram is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Pyrogram is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.

import pyrogram
from pyrogram import raw


class SearchGlobalHashtagMessagesCount:
async def search_golbal_hashtag_messages_count(
self: "pyrogram.Client",
hashtag: str = "",
) -> int:
"""Get the count of messages with the provided hashtag.
If you want to get the actual messages, see :meth:`~pyrogram.Client.search_public_hashtag_messages`.
.. include:: /_includes/usable-by/users.rst
Parameters:
hashtag (``str``, *optional*):
Hashtag to search for.
Returns:
``int``: On success, the messages count is returned.
"""
r = await self.invoke(
raw.functions.channels.SearchPosts(
hashtag=hashtag,
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)

0 comments on commit dcbbbb2

Please sign in to comment.