import asyncio from pyrogram import filters from pyrogram.errors import FloodWait, PeerIdInvalid from pyrogram.types import Message from DragMusic import app from DragMusic.misc import SUDOERS from DragMusic.utils import get_readable_time from DragMusic.utils.database import ( add_banned_user, get_banned_count, get_banned_users, get_served_chats, is_banned_user, remove_banned_user, is_on_off ) from DragMusic.utils.decorators.language import language from DragMusic.utils.extraction import extract_user from config import BANNED_USERS, LOGGER_ID @app.on_message(filters.command(["gban", "globalban"]) & SUDOERS) @language async def global_ban(client, message: Message, _): if not message.reply_to_message: if len(message.command) != 2: return await message.reply_text(_["general_1"]) user = message.command[1] if user.isdigit(): user = int(user) else: user = user.replace("@", "") try: user = await app.get_users(user) except PeerIdInvalid: return await message.reply_text("Invalid user ID or username. Please check and try again.") else: user = await extract_user(message) if user.id == message.from_user.id: return await message.reply_text(_["gban_1"]) elif user.id == app.id: return await message.reply_text(_["gban_2"]) elif user.id in SUDOERS: return await message.reply_text(_["gban_3"]) is_gbanned = await is_banned_user(user.id) if is_gbanned: return await message.reply_text(_["gban_4"].format(user.mention)) if user.id not in BANNED_USERS: BANNED_USERS.add(user.id) served_chats = [] chats = await get_served_chats() for chat in chats: served_chats.append(int(chat["chat_id"])) time_expected = get_readable_time(len(served_chats)) mystic = await message.reply_text(_["gban_5"].format(user.mention, time_expected)) number_of_chats = 0 for chat_id in served_chats: try: await app.ban_chat_member(chat_id, user.id) number_of_chats += 1 except FloodWait as fw: await asyncio.sleep(int(fw.value)) except: continue await add_banned_user(user.id) if await is_on_off(2): await app.send_message( chat_id=LOGGER_ID, text=f"{message.from_user.mention} has globally banned {user.mention}.\n" f"User ID: {user.id}\n" f"Banned in {number_of_chats} chats.", message_thread_id=12357 ) await message.reply_text( _["gban_6"].format( app.mention, message.chat.title, message.chat.id, user.mention, user.id, message.from_user.mention, number_of_chats, ) ) await mystic.delete() @app.on_message(filters.command(["ungban"]) & SUDOERS) @language async def global_un(client, message: Message, _): if not message.reply_to_message: if len(message.command) != 2: return await message.reply_text(_["general_1"]) user = message.command[1] if user.isdigit(): user = int(user) else: user = user.replace("@", "") try: user = await app.get_users(user) except PeerIdInvalid: return await message.reply_text("Invalid user ID or username. Please check and try again.") else: user = await extract_user(message) is_gbanned = await is_banned_user(user.id) if not is_gbanned: return await message.reply_text(_["gban_7"].format(user.mention)) if user.id in BANNED_USERS: BANNED_USERS.remove(user.id) served_chats = [] chats = await get_served_chats() for chat in chats: served_chats.append(int(chat["chat_id"])) time_expected = get_readable_time(len(served_chats)) mystic = await message.reply_text(_["gban_8"].format(user.mention, time_expected)) number_of_chats = 0 for chat_id in served_chats: try: await app.unban_chat_member(chat_id, user.id) number_of_chats += 1 except FloodWait as fw: await asyncio.sleep(int(fw.value)) except: continue await remove_banned_user(user.id) if await is_on_off(2): await app.send_message( chat_id=LOGGER_ID, text=f"{message.from_user.mention} has unbanned {user.mention}.\n" f"User ID: {user.id}\n" f"Unbanned from {number_of_chats} chats.", message_thread_id=12357 ) await message.reply_text(_["gban_9"].format(user.mention, number_of_chats)) await mystic.delete() @app.on_message(filters.command(["gbannedusers", "gbanlist"]) & SUDOERS) @language async def gbanned_list(client, message: Message, _): counts = await get_banned_count() if counts == 0: return await message.reply_text(_["gban_10"]) mystic = await message.reply_text(_["gban_11"]) msg = _["gban_12"] count = 0 users = await get_banned_users() for user_id in users: count += 1 try: user = await app.get_users(user_id) user = user.first_name if not user.mention else user.mention msg += f"{count}➤ {user}\n" except Exception: msg += f"{count}➤ {user_id}\n" continue if count == 0: return await mystic.edit_text(_["gban_10"]) else: return await mystic.edit_text(msg)