diff --git a/list.json b/list.json index d56cd9b..ba6c803 100644 --- a/list.json +++ b/list.json @@ -279,6 +279,16 @@ "supported": true, "des-short": "回复你要临时禁言的人的消息来实现XX秒的禁言", "des": "回复你要临时禁言的人的消息来实现XX秒的禁言。\n指令:,portball [理由]|<时间/秒>" + }, + { + "name": "sb", + "version": "1.0", + "section": "chat", + "maintainer": "xtaodada", + "size": "3.5 kb", + "supported": true, + "des-short": "在自己拥有管理员权限的共同群组中封禁一位用户。", + "des": "在自己拥有管理员权限的共同群组中封禁一位用户。\n指令:,sb" } ] } diff --git a/sb/main.py b/sb/main.py new file mode 100644 index 0000000..b28ae41 --- /dev/null +++ b/sb/main.py @@ -0,0 +1,111 @@ +from asyncio import sleep + +from pyrogram.enums import ChatType +from pyrogram.errors import ChatAdminRequired, FloodWait, PeerIdInvalid, UserAdminInvalid, UsernameInvalid +from pyrogram.types import Chat + +from pagermaid import log, bot +from pagermaid.listener import listener +from pagermaid.single_utils import Message +from pagermaid.utils import lang + + +def mention_group(chat: Chat): + return f'{chat.title}' if chat.username else f'{chat.title}' + + +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) + + +async def check_uid(uid: str): + channel = False + try: + uid = int(uid) + if uid < 0: + channel = True + await bot.get_chat(uid) + except ValueError: + chat = await bot.get_chat(uid) + uid = chat.id + if chat.type in [ChatType.CHANNEL, ChatType.SUPERGROUP, ChatType.GROUP]: + channel = True + return uid, channel + + +async def get_uid(message: Message): + uid = None + channel = False + delete_all = True + 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: + uid, channel = await check_uid(message.parameter[0]) + delete_all = False + elif len(message.parameter) == 1: + uid, channel = await check_uid(message.arguments) + return uid, channel, delete_all + + +@listener(command="sb", + description=lang('sb_des'), + need_admin=True, + parameters=" ") +async def super_ban(message: Message): + chat = message.chat + try: + uid, channel, delete_all = await get_uid(message) + except (ValueError, PeerIdInvalid, UsernameInvalid, FloodWait): + return await message.edit(lang("arg_error")) + if not uid: + return await message.edit(lang("arg_error")) + if channel: + if uid == chat.id: + return await message.edit(lang("arg_error")) + try: + await ban_one(chat, uid) + except ChatAdminRequired: + return await message.edit(lang("sb_no_per")) + except Exception as e: + return await message.edit(f"出现错误:{e}") + return await message.edit(lang("sb_channel")) + common = await bot.get_common_chats(uid) + 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 + user = await bot.get_users(uid) + if count == 0: + text = f'{lang("sb_no")} {user.mention}' + else: + text = f'{lang("sb_per")} {count} {lang("sb_in")} {user.mention}' + await message.edit(text) + groups = f'\n{lang("sb_pro")}\n' + "\n".join(groups) if groups else '' + await log(f'{text}\nuid: `{uid}` {groups}')