This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
"""Rewrite pyrogram.get_chat_history"""
|
||||
|
||||
from datetime import datetime
|
||||
from typing import AsyncGenerator, Optional, Union
|
||||
|
||||
import pyrogram
|
||||
|
||||
# pylint: disable = W0611
|
||||
from pyrogram import raw, types, utils
|
||||
|
||||
|
||||
async def get_chunk_v2(
|
||||
*,
|
||||
client: pyrogram.Client,
|
||||
chat_id: Union[int, str],
|
||||
limit: int = 0,
|
||||
offset: int = 0,
|
||||
max_id: int = 0,
|
||||
from_message_id: int = 0,
|
||||
from_date: datetime = utils.zero_datetime(),
|
||||
reverse: bool = False
|
||||
):
|
||||
"""get chunk"""
|
||||
from_message_id = from_message_id or (1 if reverse else 0)
|
||||
|
||||
messages = await utils.parse_messages(
|
||||
client,
|
||||
await client.invoke(
|
||||
raw.functions.messages.GetHistory(
|
||||
peer=await client.resolve_peer(chat_id),
|
||||
offset_id=from_message_id,
|
||||
offset_date=utils.datetime_to_timestamp(from_date),
|
||||
add_offset=offset * (-1 if reverse else 1) - (limit if reverse else 0),
|
||||
limit=limit,
|
||||
max_id=max_id,
|
||||
min_id=0,
|
||||
hash=0,
|
||||
),
|
||||
sleep_threshold=60,
|
||||
),
|
||||
replies=0,
|
||||
)
|
||||
|
||||
if reverse:
|
||||
messages.reverse()
|
||||
|
||||
return messages
|
||||
|
||||
|
||||
# pylint: disable = C0301
|
||||
async def get_chat_history_v2(
|
||||
self: pyrogram.Client,
|
||||
chat_id: Union[int, str],
|
||||
limit: int = 0,
|
||||
max_id: int = 0,
|
||||
offset: int = 0,
|
||||
offset_id: int = 0,
|
||||
offset_date: datetime = utils.zero_datetime(),
|
||||
reverse: bool = False,
|
||||
) -> Optional[AsyncGenerator["types.Message", None]]:
|
||||
"""Get messages from a chat history."""
|
||||
current = 0
|
||||
total = limit or (1 << 31) - 1
|
||||
limit = min(100, total)
|
||||
|
||||
while True:
|
||||
messages = await get_chunk_v2(
|
||||
client=self,
|
||||
chat_id=chat_id,
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
max_id=max_id + 1 if max_id else 0,
|
||||
from_message_id=offset_id,
|
||||
from_date=offset_date,
|
||||
reverse=reverse,
|
||||
)
|
||||
|
||||
if not messages:
|
||||
break_count = offset_id - 1
|
||||
async for message in self.get_chat_history(chat_id):
|
||||
if break_count:
|
||||
break_count -= 1
|
||||
continue
|
||||
if len(messages) >= limit + 1:
|
||||
break
|
||||
messages.append(message)
|
||||
if not messages:
|
||||
return
|
||||
|
||||
offset_id = messages[-1].id + (1 if reverse else 0)
|
||||
|
||||
for message in messages:
|
||||
yield message
|
||||
|
||||
current += 1
|
||||
|
||||
if current >= total:
|
||||
return
|
||||
Reference in New Issue
Block a user