PagerMaid-Pyro/pagermaid/modules/prune.py

155 lines
5.3 KiB
Python
Raw Normal View History

2022-05-23 12:40:30 +00:00
""" Module to automate message deletion. """
from asyncio import sleep
from pagermaid import log
from pagermaid.listener import listener
from pagermaid.utils import lang, Message
2022-06-20 13:55:14 +00:00
import contextlib
2022-05-23 12:40:30 +00:00
@listener(is_plugin=False, outgoing=True, command="prune",
need_admin=True,
description=lang('prune_des'))
2022-06-20 13:55:14 +00:00
async def prune(message: Message):
2022-05-23 12:40:30 +00:00
""" Purge every single message after the message you replied to. """
if not message.reply_to_message:
await message.edit(lang('not_reply'))
return
input_chat = message.chat.id
messages = []
count = 0
2022-06-20 13:55:14 +00:00
async for msg in message.bot.get_chat_history(input_chat,
limit=message.id - message.reply_to_message.id + 1):
2022-05-23 12:40:30 +00:00
if msg.id < message.reply_to_message.id:
break
messages.append(msg.id)
count += 1
if msg.reply_to_message:
messages.append(msg.reply_to_message.id)
if len(messages) == 100:
2022-06-20 13:55:14 +00:00
await message.bot.delete_messages(input_chat, messages)
2022-05-23 12:40:30 +00:00
messages = []
if messages:
2022-06-20 13:55:14 +00:00
await message.bot.delete_messages(input_chat, messages)
2022-05-23 12:40:30 +00:00
await log(f"{lang('prune_hint1')} {str(count)} {lang('prune_hint2')}")
2022-06-20 13:55:14 +00:00
notification = await send_prune_notify(message, count, count)
2022-05-23 12:40:30 +00:00
await sleep(1)
await notification.delete()
@listener(is_plugin=False, outgoing=True, command="selfprune",
need_admin=True,
description=lang('sp_des'),
parameters=lang('sp_parameters'))
2022-06-20 13:55:14 +00:00
async def self_prune(message: Message):
2022-05-23 12:40:30 +00:00
""" Deletes specific amount of messages you sent. """
msgs = []
count_buffer = 0
2022-06-20 13:55:14 +00:00
if len(message.parameter) != 1:
2022-05-23 12:40:30 +00:00
if not message.reply_to_message:
return await message.edit(lang('arg_error'))
2022-06-20 13:55:14 +00:00
async for msg in message.bot.search_messages(
2022-05-23 12:40:30 +00:00
message.chat.id,
from_user="me",
offset=message.reply_to_message.id,
):
msgs.append(msg.id)
count_buffer += 1
if len(msgs) == 100:
2022-06-20 13:55:14 +00:00
await message.bot.delete_messages(message.chat.id, msgs)
2022-05-23 12:40:30 +00:00
msgs = []
if msgs:
2022-06-20 13:55:14 +00:00
await message.bot.delete_messages(message.chat.id, msgs)
2022-05-23 12:40:30 +00:00
if count_buffer == 0:
await message.delete()
count_buffer += 1
await log(f"{lang('prune_hint1')}{lang('sp_hint')} {str(count_buffer)} {lang('prune_hint2')}")
2022-06-20 13:55:14 +00:00
notification = await send_prune_notify(message, count_buffer, count_buffer)
2022-05-23 12:40:30 +00:00
await sleep(1)
await notification.delete()
return
try:
count = int(message.parameter[0])
await message.delete()
except ValueError:
await message.edit(lang('arg_error'))
return
2022-06-20 13:55:14 +00:00
async for msg in message.bot.search_messages(message.chat.id, from_user="me"):
2022-05-23 12:40:30 +00:00
if count_buffer == count:
break
msgs.append(msg.id)
count_buffer += 1
if len(msgs) == 100:
2022-06-20 13:55:14 +00:00
await message.bot.delete_messages(message.chat.id, msgs)
2022-05-23 12:40:30 +00:00
msgs = []
if msgs:
2022-06-20 13:55:14 +00:00
await message.bot.delete_messages(message.chat.id, msgs)
await log(
f"{lang('prune_hint1')}{lang('sp_hint')} {str(count_buffer)} / {count} {lang('prune_hint2')}"
)
with contextlib.suppress(ValueError):
notification = await send_prune_notify(message, count_buffer, count)
2022-05-23 12:40:30 +00:00
await sleep(1)
await notification.delete()
@listener(is_plugin=False, outgoing=True, command="yourprune",
need_admin=True,
description=lang('yp_des'),
parameters=lang('sp_parameters'))
2022-06-20 13:55:14 +00:00
async def your_prune(message: Message):
2022-05-23 12:40:30 +00:00
""" Deletes specific amount of messages someone sent. """
if not message.reply_to_message:
return await message.edit(lang('not_reply'))
target = message.reply_to_message
if not target.from_user:
return await message.edit(lang('not_reply'))
2022-06-20 13:55:14 +00:00
if len(message.parameter) != 1:
2022-05-23 12:40:30 +00:00
return await message.edit(lang('arg_error'))
count = 0
try:
count = int(message.parameter[0])
await message.delete()
except ValueError:
return await message.edit(lang('arg_error'))
except Exception: # noqa
pass
count_buffer = 0
2022-06-20 13:55:14 +00:00
async for msg in message.bot.search_messages(message.chat.id, from_user=target.from_user.id):
2022-05-23 12:40:30 +00:00
if count_buffer == count:
break
await msg.delete()
count_buffer += 1
2022-06-20 13:55:14 +00:00
await log(
f"{lang('prune_hint1')}{lang('yp_hint')} {str(count_buffer)} / {count} {lang('prune_hint2')}"
)
notification = await send_prune_notify(message, count_buffer, count)
2022-05-23 12:40:30 +00:00
await sleep(1)
await notification.delete()
@listener(is_plugin=False, outgoing=True, command="del",
need_admin=True,
description=lang('del_des'))
2022-06-20 13:55:14 +00:00
async def delete(message: Message):
2022-05-23 12:40:30 +00:00
""" Deletes the message you replied to. """
2022-06-20 13:55:14 +00:00
if target := message.reply_to_message:
with contextlib.suppress(Exception):
2022-05-23 12:40:30 +00:00
await target.delete()
await message.delete()
await log(lang('del_notification'))
else:
await message.delete()
2022-06-20 13:55:14 +00:00
async def send_prune_notify(message: Message, count_buffer, count):
return await message.bot.send_message(
2022-05-23 12:40:30 +00:00
message.chat.id,
2022-06-20 13:55:14 +00:00
f"{lang('spn_deleted')} {str(count_buffer)} / {str(count)} {lang('prune_hint2')}",
2022-05-23 12:40:30 +00:00
)