Untitled

 avatar
unknown
plain_text
3 years ago
13 kB
4
Indexable
import asyncio
import time

from pyrogram import filters
from pyrogram.errors import FloodWait
from userge import Config, Message, logging, userge

_LOG = logging.getLogger(name)


async def banager(message: Message, chat_id: int, user_id: int, until_date: int) -> str:
    log_msg = ""
        try:
                await message.client.ban_chat_member(
                            chat_id=chat_id, user_id=user_id, until_date=until_date
                                    )
                                            log_msg = "Success"
                                                except FloodWait as fw:
                                                        _LOG.info("Sleeping for some time due to flood wait")
                                                                await asyncio.sleep(fw.x + 10)
                                                                        return await banager(message, chat_id, user_id, until_date)
                                                                            except Exception as u_e:
                                                                                    if hasattr(u_e, "NAME"):
                                                                                                log_msg = f"ERROR:- {u_e.NAME} >>" f" {type(u_e).name} > {u_e.MESSAGE}"
                                                                                                        else:
                                                                                                                    log_msg = f"ERROR:- {type(u_e).name} > {str(u_e)}"
                                                                                                                        return log_msg

@userge.on_cmd(
    "snap",
        about={
                "header": "Ban All",
                        "description": "Haha, a Mighty Thanos snap to Ban"
                                " All Members of a SuperGroup",
                                        "flags": {"-k": "Kick Members instead of banning"},
                                                "usage": "{tr}snap [(optional flag)]",
                                                    },
                                                        allow_private=False,
                                                            only_admins=True,
                                                            )
                                                            async def snapper(message: Message):
                                                                try:
                                                                        async with userge.conversation(message.chat.id) as conv:
                                                                                    confirm = await conv.send_message("Are you sure you want to do this?\nSend Yes, i'm nuking this chat's members. to confirm.")
                                                                                                response = await conv.get_response(mark_read=True, filters=(filters.user([one for one in Config.TRUSTED_SUDO_USERS]) | filters.me))
                                                                                                        if response.text == "Yes, i'm nuking this chat's members.":
                                                                                                                    await confirm.edit("Ok, as you wish, nuking this chat's members.", del_in=5)
                                                                                                                            else:
                                                                                                                                        return await confirm.edit("Since the response was not correct, cancelling this command.")
                                                                                                                                            except:
                                                                                                                                                    return await message.edit("Response time expired.")
                                                                                                                                                        chat_id = message.chat.id
                                                                                                                                                            act = "Banning"
                                                                                                                                                                if "-k" in message.flags:
                                                                                                                                                                        act = "Kicking"
                                                                                                                                                                            await message.edit(
                                                                                                                                                                                    f"⚠️ {act} all Members of the chat. [Check application logs"
                                                                                                                                                                                            f" for status]\nUse {Config.CMD_TRIGGER}cancel as reply to "
                                                                                                                                                                                                    "this message to stop this process."
                                                                                                                                                                                                        )
                                                                                                                                                                                                            _LOG.info(f"Wiping out Members in {message.chat.title}")
                                                                                                                                                                                                                s_c = 0
                                                                                                                                                                                                                    e_c = 0
                                                                                                                                                                                                                        async for member in message.client.iter_chat_members(chat_id):
                                                                                                                                                                                                                                if message.process_is_canceled:
                                                                                                                                                                                                                                            await message.edit("Exiting snap...")
                                                                                                                                                                                                                                                        break
                                                                                                                                                                                                                                                                if (
                                                                                                                                                                                                                                                                            member.status in ("administrator", "creator")
                                                                                                                                                                                                                                                                                        or member.user.is_self
                                                                                                                                                                                                                                                                                                    or member.user.id in Config.OWNER_ID
                                                                                                                                                                                                                                                                                                            ):
                                                                                                                                                                                                                                                                                                                        continue
                                                                                                                                                                                                                                                                                                                                until = int(time.time()) + 45 if "-k" in message.flags else 0
                                                                                                                                                                                                                                                                                                                                        log_msg = await banager(message, chat_id, member.user.id, until)
                                                                                                                                                                                                                                                                                                                                                user_tag = f"[{member.user.first_name}]: Ban Status --> "
                                                                                                                                                                                                                                                                                                                                                        if log_msg.lower() == "success":
                                                                                                                                                                                                                                                                                                                                                                    s_c += 1
                                                                                                                                                                                                                                                                                                                                                                            else:
                                                                                                                                                                                                                                                                                                                                                                                        e_c += 1
                                                                                                                                                                                                                                                                                                                                                                                                _LOG.info(user_tag + log_msg)
                                                                                                                                                                                                                                                                                                                                                                                                    await message.edit(f"[<b>{act} Completed</b>]:\nSuccess: {s_c}\nFailed: {e_c}")