feat purge: change logic to handle DM, Topics, Groups.
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user