PagerMaid_Plugins_Pyro/sb/main.py

143 lines
4.2 KiB
Python
Raw Normal View History

2023-07-31 03:29:27 +00:00
import contextlib
from asyncio import sleep
from pyrogram.enums import ChatType
2023-07-01 12:18:58 +00:00
from pyrogram.errors import (
ChatAdminRequired,
FloodWait,
PeerIdInvalid,
UserAdminInvalid,
UsernameInvalid,
)
from pyrogram.types import Chat
from pagermaid import log
from pagermaid.listener import listener
from pagermaid.scheduler import add_delete_message_job
from pagermaid.services import bot
from pagermaid.enums import Message
from pagermaid.utils import lang
def mention_group(chat: Chat):
2023-07-01 12:18:58 +00:00
return (
f'<a href="https://t.me/{chat.username}">{chat.title}</a>'
if chat.username
else f"<code>{chat.title}</code>"
)
async def ban_one(chat: Chat, uid):
await bot.ban_chat_member(chat.id, uid)
async def delete_all_messages(chat: Chat, uid):
await bot.delete_user_history(chat.id, uid)
2022-07-10 12:44:31 +00:00
async def check_uid(chat: Chat, uid: str):
channel = False
2023-07-31 03:29:27 +00:00
with contextlib.suppress(ValueError):
uid = int(uid)
if uid < 0:
channel = True
2023-07-31 03:29:27 +00:00
try:
2022-07-10 12:44:31 +00:00
await bot.get_chat_member(chat.id, uid)
2023-07-31 03:29:27 +00:00
except ChatAdminRequired:
with contextlib.suppress(PeerIdInvalid):
2022-07-10 12:44:31 +00:00
chat = await bot.get_chat(uid)
uid = chat.id
if chat.type in [ChatType.CHANNEL, ChatType.SUPERGROUP, ChatType.GROUP]:
channel = True
return uid, channel
2022-07-10 12:44:31 +00:00
async def get_uid(chat: Chat, message: Message):
uid = None
channel = False
delete_all = True
2022-07-10 12:44:31 +00:00
sender = None
if reply := message.reply_to_message:
if sender := reply.from_user:
uid = sender.id
if sender := reply.sender_chat:
uid = sender.id
channel = True
if message.arguments:
delete_all = False
elif len(message.parameter) == 2:
2022-07-10 12:44:31 +00:00
uid, channel = await check_uid(chat, message.parameter[0])
delete_all = False
elif len(message.parameter) == 1:
2023-07-31 03:29:27 +00:00
uid, channel = await check_uid(chat, message.parameter[0])
2022-07-10 12:44:31 +00:00
return uid, channel, delete_all, sender
2023-07-01 12:18:58 +00:00
@listener(
command="sb",
description=lang("sb_des"),
need_admin=True,
groups_only=True,
parameters="[reply|id|username> <do_not_del_all]",
)
async def super_ban(message: Message):
chat = message.chat
try:
2022-07-10 12:44:31 +00:00
uid, channel, delete_all, sender = await get_uid(chat, message)
2023-07-31 03:29:27 +00:00
if not uid:
raise ValueError
if channel and uid == chat.id:
raise ValueError
except (ValueError, PeerIdInvalid, UsernameInvalid, FloodWait):
await message.edit(lang("arg_error"))
2023-07-31 03:29:27 +00:00
return add_delete_message_job(message, 30)
except Exception as e:
await message.edit(f"出现错误:{e}")
return add_delete_message_job(message, 30)
if channel:
try:
await ban_one(chat, uid)
except ChatAdminRequired:
await message.edit(lang("sb_no_per"))
return add_delete_message_job(message, 10)
except Exception as e:
await message.edit(f"出现错误:{e}")
return add_delete_message_job(message, 10)
await message.edit(lang("sb_channel"))
return add_delete_message_job(message, 10)
2022-07-10 09:53:10 +00:00
try:
common = await bot.get_common_chats(uid)
except PeerIdInvalid:
common = [chat]
count, groups = 0, []
for i in common:
try:
await ban_one(i, uid)
if delete_all:
await delete_all_messages(i, uid)
count += 1
groups.append(mention_group(i))
except ChatAdminRequired:
continue
except UserAdminInvalid:
continue
except FloodWait as e:
await sleep(e.value)
await ban_one(i, uid)
if delete_all:
await delete_all_messages(i, uid)
count += 1
groups.append(mention_group(i))
except Exception: # noqa
pass
2022-07-10 12:44:31 +00:00
if not sender:
2023-07-31 03:29:27 +00:00
sender = await bot.get_users(uid)
if count == 0:
2022-07-10 12:44:31 +00:00
text = f'{lang("sb_no")} {sender.mention}'
else:
2022-07-10 12:44:31 +00:00
text = f'{lang("sb_per")} {count} {lang("sb_in")} {sender.mention}'
await message.edit(text)
2023-07-01 12:18:58 +00:00
groups = f'\n{lang("sb_pro")}\n' + "\n".join(groups) if groups else ""
await log(f"{text}\nuid: `{uid}` {groups}")
add_delete_message_job(message, 10)