diff --git a/app/plugins/tg_tools/delete.py b/app/plugins/tg_tools/delete.py index 54fa295..034e40e 100644 --- a/app/plugins/tg_tools/delete.py +++ b/app/plugins/tg_tools/delete.py @@ -1,5 +1,6 @@ import asyncio +from pyrogram.enums import ChatType from ub_core.utils.helpers import create_chunks from app import BOT, Message @@ -24,18 +25,61 @@ async def delete_message(bot: BOT, message: Message) -> None: @BOT.add_cmd(cmd="purge") async def purge_(bot: BOT, message: Message) -> None: + """ + CMD: PURGE + INFO: DELETE MULTIPLE MESSAGES + USAGE: + .purge [reply to message] + """ + chat_id = message.chat.id + start_message: int = message.reply_id + # Not replied to a message if not start_message: - await message.reply("reply to a message") + await message.reply("Reply to a message.") return - end_message: int = message.id + # Replied was topic creation message + if message.thread_origin_message: + await message.reply("Reply to a message.") + return - message_ids: list[int] = [i for i in range(int(start_message), int(end_message))] + # Get Topic messages till replied + if message.is_topic_message: + message_ids = [] - for chunk in create_chunks(message_ids, chunk_size=25): - await bot.delete_messages( - chat_id=message.chat.id, message_ids=chunk, revoke=True - ) - await asyncio.sleep(5) + async for _message in bot.get_discussion_replies( + chat_id=message.chat.id, message_id=message.message_thread_id, limit=100 + ): + message_ids.append(_message.id) + if ( + _message.reply_to_message_id == message.reply_id + or len(message_ids) > 100 + ): + break + else: + # Generate Message Ids + message_ids: list[int] = list(range(start_message, message.id)) + + # Get messages from server if chat is private or ids are too big. + if ( + message.chat.type in {ChatType.PRIVATE, ChatType.BOT} + or len(message_ids) > 100 + ): + messages = await bot.get_messages( + chat_id=chat_id, message_ids=message_ids, replies=0 + ) + message_ids = [message.id for message in messages] + + # Perform Quick purge of bigger chunks + if len(message_ids) < 100: + chunk_size = 50 + sleep_interval = 2 + else: + chunk_size = 25 + sleep_interval = 5 + + for chunk in create_chunks(message_ids, chunk_size=chunk_size): + await bot.delete_messages(chat_id=chat_id, message_ids=chunk, revoke=True) + await asyncio.sleep(sleep_interval)