Implement global search (closes #920)

This commit is contained in:
Lonami Exo 2018-07-29 23:16:01 +02:00
parent 223b007a55
commit f0a26d7c76

View File

@ -37,6 +37,14 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
entity (`entity`): entity (`entity`):
The entity from whom to retrieve the message history. The entity from whom to retrieve the message history.
It may be ``None`` to perform a global search, or
to get messages by their ID from no particular chat.
Note that some of the offsets will not work if this
is the case.
Note that if you want to perform a global search,
you **must** set a non-empty `search` string.
limit (`int` | `None`, optional): limit (`int` | `None`, optional):
Number of messages to be retrieved. Due to limitations with Number of messages to be retrieved. Due to limitations with
the API retrieving more than 3000 messages will take longer the API retrieving more than 3000 messages will take longer
@ -104,6 +112,8 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
instead of being `max_id` as well since messages are returned instead of being `max_id` as well since messages are returned
in ascending order. in ascending order.
You cannot use this if both `entity` and `ids` are ``None``.
_total (`list`, optional): _total (`list`, optional):
A single-item list to pass the total parameter by reference. A single-item list to pass the total parameter by reference.
@ -117,9 +127,9 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
an higher limit, so you're free to set the ``batch_size`` that an higher limit, so you're free to set the ``batch_size`` that
you think may be good. you think may be good.
""" """
# It's possible to get messages by ID without their entity, so only # Note that entity being ``None`` is intended to get messages by
# fetch the input version if we're not using IDs or if it was given. # ID under no specific chat, and also to request a global search.
if not ids or entity: if entity:
entity = await self.get_input_entity(entity) entity = await self.get_input_entity(entity)
if ids: if ids:
@ -158,7 +168,19 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
from_id = None from_id = None
limit = float('inf') if limit is None else int(limit) limit = float('inf') if limit is None else int(limit)
if search is not None or filter or from_user: if not entity:
if reverse:
raise ValueError('Cannot reverse global search')
reverse = None
request = functions.messages.SearchGlobalRequest(
q=search or '',
offset_date=offset_date,
offset_peer=types.InputPeerEmpty(),
offset_id=offset_id,
limit=1
)
elif search is not None or filter or from_user:
if filter is None: if filter is None:
filter = types.InputMessagesFilterEmpty() filter = types.InputMessagesFilterEmpty()
request = functions.messages.SearchRequest( request = functions.messages.SearchRequest(
@ -243,7 +265,9 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
or from_id and message.from_id != from_id): or from_id and message.from_id != from_id):
continue continue
if reverse: if reverse is None:
pass
elif reverse:
if message.id <= last_id or message.id >= max_id: if message.id <= last_id or message.id >= max_id:
return return
else: else:
@ -282,12 +306,15 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
break break
else: else:
request.offset_id = last_message.id request.offset_id = last_message.id
if isinstance(request, functions.messages.GetHistoryRequest): if isinstance(request, functions.messages.SearchRequest):
request.offset_date = last_message.date
else:
request.max_date = last_message.date request.max_date = last_message.date
else:
# getHistory and searchGlobal call it offset_date
request.offset_date = last_message.date
if reverse: if isinstance(request, functions.messages.SearchGlobalRequest):
request.offset_peer = last_message.input_chat
elif reverse:
# We want to skip the one we already have # We want to skip the one we already have
request.add_offset -= 1 request.add_offset -= 1