PagerMaid-Pyro/pagermaid/modules/prune.py
xtaodada a941308d17
Some checks failed
Docker Dev Build / docker build and publish (push) Failing after 13s
Docker Build / docker build and publish (push) Failing after 11s
🔖 Update to v1.5.0
这是一项破坏性变更,目录结构进行了重组,无核心功能变化
2024-09-28 22:01:40 +08:00

189 lines
5.8 KiB
Python

""" Module to automate message deletion. """
import contextlib
from asyncio import sleep
from pagermaid.enums import Client, Message
from pagermaid.listener import listener
from pagermaid.utils import lang
from pagermaid.utils.bot_utils import log
@listener(
is_plugin=False,
outgoing=True,
command="prune",
need_admin=True,
description=lang("prune_des"),
)
async def prune(client: Client, message: Message):
"""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
limit = message.id - message.reply_to_message.id + 1
if message.message_thread_id:
func = client.get_discussion_replies(
input_chat, message.message_thread_id, limit=limit
)
else:
func = client.get_chat_history(input_chat, limit=limit)
async for msg in func:
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:
await client.delete_messages(input_chat, messages)
messages = []
if messages:
await client.delete_messages(input_chat, messages)
await log(f"{lang('prune_hint1')} {str(count)} {lang('prune_hint2')}")
notification = await send_prune_notify(client, message, count, count)
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"),
)
async def self_prune(bot: Client, message: Message):
"""Deletes specific amount of messages you sent."""
msgs = []
count_buffer = 0
offset = 0
if len(message.parameter) != 1:
if not message.reply_to_message:
return await message.edit(lang("arg_error"))
offset = message.reply_to_message.id
try:
count = int(message.parameter[0])
await message.delete()
except ValueError:
await message.edit(lang("arg_error"))
return
async for msg in bot.get_chat_history(message.chat.id, limit=100):
if count_buffer == count:
break
if msg.from_user and msg.from_user.is_self:
msgs.append(msg.id)
count_buffer += 1
if len(msgs) == 100:
await bot.delete_messages(message.chat.id, msgs)
msgs = []
async for msg in bot.search_messages(
message.chat.id, from_user="me", offset=offset
):
if count_buffer == count:
break
msgs.append(msg.id)
count_buffer += 1
if len(msgs) == 100:
await bot.delete_messages(message.chat.id, msgs)
msgs = []
if msgs:
await 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(bot, message, count_buffer, count)
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"),
)
async def your_prune(bot: Client, message: Message):
"""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"))
if len(message.parameter) != 1:
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
msgs = []
async for msg in bot.get_chat_history(message.chat.id, limit=100):
if count_buffer == count:
break
if msg.from_user and msg.from_user.id == target.from_user.id:
msgs.append(msg.id)
count_buffer += 1
if len(msgs) == 100:
await bot.delete_messages(message.chat.id, msgs)
msgs = []
async for msg in bot.search_messages(
message.chat.id, from_user=target.from_user.id
):
if count_buffer == count:
break
count_buffer += 1
msgs.append(msg.id)
if len(msgs) == 100:
await bot.delete_messages(message.chat.id, msgs)
msgs = []
if msgs:
await bot.delete_messages(message.chat.id, msgs)
await log(
f"{lang('prune_hint1')}{lang('yp_hint')} {str(count_buffer)} / {count} {lang('prune_hint2')}"
)
with contextlib.suppress(ValueError):
notification = await send_prune_notify(bot, message, count_buffer, count)
await sleep(1)
await notification.delete()
@listener(
is_plugin=False,
outgoing=True,
command="del",
need_admin=True,
description=lang("del_des"),
)
async def delete(message: Message):
"""Deletes the message you replied to."""
if target := message.reply_to_message:
with contextlib.suppress(Exception):
await target.delete()
await message.delete()
await log(lang("del_notification"))
else:
await message.delete()
async def send_prune_notify(bot: Client, message: Message, count_buffer, count):
return await bot.send_message(
message.chat.id,
f"{lang('spn_deleted')} {str(count_buffer)} / {str(count)} {lang('prune_hint2')}",
message_thread_id=message.message_thread_id,
)