feat purge: change logic to handle DM, Topics, Groups.

This commit is contained in:
thedragonsinn
2025-01-23 15:46:37 +05:30
parent 82317fbf8f
commit f2097433de

View File

@@ -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)