from Powers import LOGGER from asyncio import sleep from Powers.bot_class import Gojo from Powers.database.approve_db import Approve from pyrogram.types import Message, ChatPermissions from Powers.utils.custom_filters import command, restrict_filter from pyrogram.errors import RPCError, ChatNotModified, ChatAdminRequired @Gojo.on_message(command("locktypes")) async def lock_types(_, m: Message): await m.reply_text( ( "**Lock Types:**\n" " - `all` = Everything\n" " - `msg` = Messages\n" " - `media` = Media, such as Photo and Video.\n" " - `polls` = Polls\n" " - `invite` = Add users to Group\n" " - `pin` = Pin Messages\n" " - `info` = Change Group Info\n" " - `webprev` = Web Page Previews\n" " - `inlinebots`, `inline` = Inline bots\n" " - `animations` = Animations\n" " - `games` = Game Bots\n" " - `stickers` = Stickers" ), ) return @Gojo.on_message(command("lock") & restrict_filter) async def lock_perm(c: Gojo, m: Message): if len(m.text.split()) < 2: await m.reply_text("Please enter a permission to lock!") return lock_type = m.text.split(None, 1)[1] chat_id = m.chat.id if not lock_type: await m.reply_text(text="Specify a permission to lock!") return get_perm = m.chat.permissions msg = get_perm.can_send_messages media = get_perm.can_send_media_messages webprev = get_perm.can_add_web_page_previews polls = get_perm.can_send_polls info = get_perm.can_change_info invite = get_perm.can_invite_users pin = get_perm.can_pin_messages stickers = animations = games = inlinebots = None if lock_type == "all": try: await c.set_chat_permissions(chat_id, ChatPermissions()) LOGGER.info( f"{m.from_user.id} locked all permissions in {m.chat.id}") except ChatNotModified: pass except ChatAdminRequired: await m.reply_text(text="I don't have permission to do that") await m.reply_text("🔒 " + "Locked all permission from this Chat!") await prevent_approved(m) return if lock_type == "msg": msg = False perm = "messages" elif lock_type == "media": media = False perm = "audios, documents, photos, videos, video notes, voice notes" elif lock_type == "stickers": stickers = False perm = "stickers" elif lock_type == "animations": animations = False perm = "animations" elif lock_type == "games": games = False perm = "games" elif lock_type in ("inlinebots", "inline"): inlinebots = False perm = "inline bots" elif lock_type == "webprev": webprev = False perm = "web page previews" elif lock_type == "polls": polls = False perm = "polls" elif lock_type == "info": info = False perm = "info" elif lock_type == "invite": invite = False perm = "invite" elif lock_type == "pin": pin = False perm = "pin" else: await m.reply_text( text=""" Invalid Lock Type! Use /locktypes to get the lock types""" ) return try: await c.set_chat_permissions( chat_id, ChatPermissions( can_send_messages=msg, can_send_media_messages=media, can_send_other_messages=any( [stickers, animations, games, inlinebots]), can_add_web_page_previews=webprev, can_send_polls=polls, can_change_info=info, can_invite_users=invite, can_pin_messages=pin, ), ) LOGGER.info( f"{m.from_user.id} locked selected permissions in {m.chat.id}") except ChatNotModified: pass except ChatAdminRequired: await m.reply_text(text="I don't have permission to do that") await m.reply_text( "🔒 " + f"Locked {perm} for this Chat.", ) await prevent_approved(m) return @Gojo.on_message(command("locks") & restrict_filter) async def view_locks(_, m: Message): chkmsg = await m.reply_text(text="Checking Chat permissions...") v_perm = m.chat.permissions async def convert_to_emoji(val: bool): if val: return "✅" return "❌" vmsg = await convert_to_emoji(v_perm.can_send_messages) vmedia = await convert_to_emoji(v_perm.can_send_media_messages) vother = await convert_to_emoji(v_perm.can_send_other_messages) vwebprev = await convert_to_emoji(v_perm.can_add_web_page_previews) vpolls = await convert_to_emoji(v_perm.can_send_polls) vinfo = await convert_to_emoji(v_perm.can_change_info) vinvite = await convert_to_emoji(v_perm.can_invite_users) vpin = await convert_to_emoji(v_perm.can_pin_messages) if v_perm is not None: try: permission_view_str = f"""Chat Permissions: Send Messages: {vmsg} Send Media: {vmedia} Send Stickers: {vother} Send Animations: {vother} Can Play Games: {vother} Can Use Inline Bots: {vother} Webpage Preview: {vwebprev} Send Polls: {vpolls} Change Info: {vinfo} Invite Users: {vinvite} Pin Messages: {vpin}""" LOGGER.info(f"{m.from_user.id} used locks cmd in {m.chat.id}") await chkmsg.edit_text(permission_view_str) except RPCError as e_f: await chkmsg.edit_text(text="Something went wrong!") await m.reply_text(e_f) return @Gojo.on_message(command("unlock") & restrict_filter) async def unlock_perm(c: Gojo, m: Message): if len(m.text.split()) < 2: await m.reply_text("Please enter a permission to unlock!") return unlock_type = m.text.split(None, 1)[1] chat_id = m.chat.id if not unlock_type: await m.reply_text(text="Specify a permission to unlock!") return if unlock_type == "all": try: await c.set_chat_permissions( chat_id, ChatPermissions( can_send_messages=True, can_send_media_messages=True, can_send_other_messages=True, can_add_web_page_previews=True, can_send_polls=True, can_change_info=True, can_invite_users=True, can_pin_messages=True, ), ) LOGGER.info( f"{m.from_user.id} unlocked all permissions in {m.chat.id}") except ChatNotModified: pass except ChatAdminRequired: await m.reply_text(text="I don't have permission to do that") await m.reply_text("🔓 " + "Unlocked all permission from this Chat!") await prevent_approved(m) return get_uperm = m.chat.permissions umsg = get_uperm.can_send_messages umedia = get_uperm.can_send_media_messages uwebprev = get_uperm.can_add_web_page_previews upolls = get_uperm.can_send_polls uinfo = get_uperm.can_change_info uinvite = get_uperm.can_invite_users upin = get_uperm.can_pin_messages ustickers = uanimations = ugames = uinlinebots = None if unlock_type == "msg": umsg = True uperm = "messages" elif unlock_type == "media": umedia = True uperm = "audios, documents, photos, videos, video notes, voice notes" elif unlock_type == "stickers": ustickers = True uperm = "stickers" elif unlock_type == "animations": uanimations = True uperm = "animations" elif unlock_type == "games": ugames = True uperm = "games" elif unlock_type in ("inlinebots", "inline"): uinlinebots = True uperm = "inline bots" elif unlock_type == "webprev": uwebprev = True uperm = "web page previews" elif unlock_type == "polls": upolls = True uperm = "polls" elif unlock_type == "info": uinfo = True uperm = "info" elif unlock_type == "invite": uinvite = True uperm = "invite" elif unlock_type == "pin": upin = True uperm = "pin" else: await m.reply_text( text="""Invalid Lock Type! Use /locktypes to get the lock types""" ) return try: LOGGER.info( f"{m.from_user.id} unlocked selected permissions in {m.chat.id}") await c.set_chat_permissions( chat_id, ChatPermissions( can_send_messages=umsg, can_send_media_messages=umedia, can_send_other_messages=any( [ustickers, uanimations, ugames, uinlinebots], ), can_add_web_page_previews=uwebprev, can_send_polls=upolls, can_change_info=uinfo, can_invite_users=uinvite, can_pin_messages=upin, ), ) except ChatNotModified: pass except ChatAdminRequired: await m.reply_text(text="I don't have permission to do that") await m.reply_text( "🔓 " + f"Unlocked {uperm} for this Chat.", ) await prevent_approved(m) return async def prevent_approved(m: Message): approved_users = Approve(m.chat.id).list_approved() ul = [user[0] for user in approved_users] for i in ul: try: await m.chat.unban_member(user_id=i) except (ChatAdminRequired, ChatNotModified, RPCError): continue LOGGER.info(f"Approved {i} in {m.chat.id}") await sleep(0.1) return __PLUGIN__ = "locks" __alt_name__ = ["grouplock", "lock", "grouplocks"] __HELP__ = """ ***Locks*** Use this to lock group permissions. Allows you to lock and unlock permission types in the chat. **Usage:** * /lock ``: Lock Chat permission. * /unlock ``: Unlock Chat permission. * /locks: View Chat permission. * /locktypes: Check available lock types! **Example:** `/lock media`: this locks all the media messages in the chat."""