from datetime import datetime from io import BytesIO from traceback import format_exc from pyrogram.errors import MessageTooLong, PeerIdInvalid, UserIsBlocked from pyrogram.types import Message from Powers import LOGGER, MESSAGE_DUMP, SUPPORT_GROUP from Powers.bot_class import Gojo from Powers.database.antispam_db import GBan from Powers.database.users_db import Users from Powers.supports import get_support_staff from Powers.utils.clean_file import remove_markdown_and_html from Powers.utils.custom_filters import command from Powers.utils.extract_user import extract_user from Powers.utils.parser import mention_html # Initialize db = GBan() @Gojo.on_message(command(["gban", "globalban"], sudo_cmd=True)) async def gban(c: Gojo, m: Message): if len(m.text.split()) == 1: await m.reply_text( text="How to gban? \n Answer: /gban user_id reason" ) return if len(m.text.split()) == 2 and not m.reply_to_message: await m.reply_text(text="Please enter a reason to gban user!") return user_id, user_first_name, _ = await extract_user(c, m) if m.reply_to_message: gban_reason = m.text.split(None, 1)[1] else: gban_reason = m.text.split(None, 2)[2] SUPPORT_STAFF = get_support_staff() if user_id in SUPPORT_STAFF: await m.reply_text(text="This user is part of my Support!, Can't ban our own!") return if user_id == c.me.id: await m.reply_text( text="You don't dare use that command on me again nigga! \n Go straight and fuck your self......" ) return if db.check_gban(user_id): db.update_gban_reason(user_id, gban_reason) await m.reply_text(text="Updated Gban reason to: {gban_reason}.") return db.add_gban(user_id, gban_reason, m.from_user.id) await m.reply_text( ( f"Added {user_first_name} to GBan List. \n They will now be banned in all groups where I'm admin!" ) ) date = datetime.utcnow().strftime("%H:%M - %d-%m-%Y") log_msg = f"#GBAN \n Originated from: {m.chat.id} \n Admin: {await mention_html(m.from_user.first_name, m.from_user.id)} \n Gbanned User: {await mention_html(user_first_name, user_id)} \n Gbanned User ID: {user_id} \\ nEvent Stamp: {date}" await c.send_message(MESSAGE_DUMP, log_msg) try: # Send message to user telling that he's gbanned await c.send_message( user_id, f"You have been added to my global ban list! \n Reason: {gban_reason} \n Appeal Chat: @{SUPPORT_GROUP}", ) try: await c.ban_chat_member(m.chat.id, user_id) except Exception as e: await m.reply_text(f"Failed to ban this user\n{e}") except UserIsBlocked: LOGGER.error("Could not send PM Message, user blocked bot") except PeerIdInvalid: LOGGER.error( "Haven't seen this user anywhere, mind forwarding one of their messages to me?", ) except Exception as ef: # TO DO: Improve Error Detection LOGGER.error(ef) LOGGER.error(format_exc()) return @Gojo.on_message( command(["ungban", "unglobalban", "globalunban"], sudo_cmd=True), ) async def ungban(c: Gojo, m: Message): if len(m.text.split()) == 1: await m.reply_text(text="Pass a user id or username as an argument!") return user_id, user_first_name, _ = await extract_user(c, m) SUPPORT_STAFF = get_support_staff() if user_id in SUPPORT_STAFF: await m.reply_text(text="This user is part of my Support!, Can't ban our own!") return if user_id == c.me.id: await m.reply_text( text="""You can't gban me nigga! Fuck yourself.......!""" ) return if db.check_gban(user_id): db.remove_gban(user_id) await m.reply_text(text=f"Removed {user_first_name} from Global Ban List.") time = ((datetime.utcnow().strftime("%H:%M - %d-%m-%Y")),) log_msg = f"""#UNGBAN Originated from: {m.chat.id} Admin: {(await mention_html(m.from_user.first_name, m.from_user.id))} UnGbanned User: {(await mention_html(user_first_name, user_id))} UnGbanned User ID: {user_id} Event Stamp: {time}""" await c.send_message(MESSAGE_DUMP, log_msg) try: # Send message to user telling that he's ungbanned await c.send_message( user_id, text="You have been removed from my global ban list!.....Be careful it takes few seconds to add you again...", ) except Exception as ef: # TODO: Improve Error Detection LOGGER.error(ef) LOGGER.error(format_exc()) return await m.reply_text(text="User is not gbanned!") return @Gojo.on_message( command(["numgbans", "countgbans", "gbancount", "gbanscount"], sudo_cmd=True), ) async def gban_count(_, m: Message): await m.reply_text( text=f"Number of people gbanned: {(db.count_gbans())}" ) return @Gojo.on_message( command(["gbanlist", "globalbanlist"], sudo_cmd=True), ) async def gban_list(_, m: Message): banned_users = db.load_from_db() if not banned_users: await m.reply_text(text="There aren't any gbanned users...!") return banfile = "Here are all the globally banned geys!\n\n" for user in banned_users: USER = Users.get_user_info(user['_id']) banfile += f"[x] {USER['name'] if USER else 'Name NA'} - {user['_id']}\n" if user["reason"]: banfile += f"Reason: {user['reason']}\n" try: await m.reply_text(banfile) except MessageTooLong: with BytesIO(str.encode(await remove_markdown_and_html(banfile))) as f: f.name = "gbanlist.txt" await m.reply_document( document=f, caption="Here are all the globally banned geys!\n\n" ) return __PLUGIN__ = "global" __alt_name__ = ["antispam", "global"] __HELP__ = """ **Global** **Sudo commands:** • /gban [reply to user | user id | username]: Add the user in the global ban watchlist. • /ungban [reply to user | user id | username]: Remove the user from the global ban watchlist. • /numgbans : Give number of users who are banned globally. • /gbanlist : Give list of globally banned users. """