Просмотр исходного кода

Added support for anon admins

Also made the code a little bit cleaner
thehamkercat 5 лет назад
Родитель
Сommit
abe238e27f

+ 3 - 1
sample_config.py

@@ -19,7 +19,9 @@ if HEROKU:
     MONGO_DB_URI = environ.get("MONGO_DB_URI", None)
     MONGO_DB_URI = environ.get("MONGO_DB_URI", None)
     ARQ_API_URL = environ.get("ARQ_API_URL", None)
     ARQ_API_URL = environ.get("ARQ_API_URL", None)
     ARQ_API_KEY = environ.get("ARQ_API_KEY", None)
     ARQ_API_KEY = environ.get("ARQ_API_KEY", None)
-    LOG_MENTIONS = True if int(environ.get("LOG_MENTIONS", None)) == 1 else False
+    LOG_MENTIONS = (
+        True if int(environ.get("LOG_MENTIONS", None)) == 1 else False
+    )
 else:
 else:
     BOT_TOKEN = "467677575:YZfaakjwd545dfg-N6JStihhuw5gQeZHntc"
     BOT_TOKEN = "467677575:YZfaakjwd545dfg-N6JStihhuw5gQeZHntc"
     API_ID = 123456
     API_ID = 123456

+ 0 - 2
wbb/__init__.py

@@ -29,7 +29,6 @@ from os import path
 from aiohttp import ClientSession
 from aiohttp import ClientSession
 from motor.motor_asyncio import AsyncIOMotorClient as MongoClient
 from motor.motor_asyncio import AsyncIOMotorClient as MongoClient
 from pyrogram import Client
 from pyrogram import Client
-from pyromod import listen
 from Python_ARQ import ARQ
 from Python_ARQ import ARQ
 from telegraph import Telegraph
 from telegraph import Telegraph
 
 
@@ -40,7 +39,6 @@ if is_config:
 else:
 else:
     from sample_config import *
     from sample_config import *
 
 
-listen = listen
 USERBOT_PREFIX = USERBOT_PREFIX
 USERBOT_PREFIX = USERBOT_PREFIX
 GBAN_LOG_GROUP_ID = GBAN_LOG_GROUP_ID
 GBAN_LOG_GROUP_ID = GBAN_LOG_GROUP_ID
 SUDOERS = SUDO_USERS_ID
 SUDOERS = SUDO_USERS_ID

+ 1 - 0
wbb/core/decorators/errors.py

@@ -1,4 +1,5 @@
 """ WRITTEN BY @pokurt, https://github.com/pokurt"""
 """ WRITTEN BY @pokurt, https://github.com/pokurt"""
+
 import sys
 import sys
 import traceback
 import traceback
 from functools import wraps
 from functools import wraps

+ 60 - 0
wbb/core/decorators/permissions.py

@@ -0,0 +1,60 @@
+from functools import wraps
+
+from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden
+from pyrogram.types import Message
+
+from wbb import SUDOERS, app
+from wbb.modules.admin import member_permissions
+
+
+async def authorised(func, subFunc2, client, message, *args, **kwargs):
+    chatID = message.chat.id
+    try:
+        await func(client, message, *args, **kwargs)
+    except ChatWriteForbidden:
+        await app.leave_chat(chatID)
+    except Exception as e:
+        try:
+            await message.reply_text(str(e))
+        except ChatWriteForbidden:
+            await app.leave_chat(chatID)
+    return subFunc2
+
+
+async def unauthorised(message: Message, permission, subFunc2):
+    chatID = message.chat.id
+    text = (
+        "You don't have the required permission to perform this action."
+        + f"\n**Permission:** __{permission}__"
+    )
+    try:
+        await message.reply_text(text)
+    except ChatWriteForbidden:
+        await app.leave_chat(chatID)
+    return subFunc2
+
+
+def adminsOnly(permission):
+    def subFunc(func):
+        @wraps(func)
+        async def subFunc2(client, message: Message, *args, **kwargs):
+            chatID = message.chat.id
+            if not message.from_user:
+                # For anonymous admins
+                if message.sender_chat:
+                    return await authorised(
+                        func, subFunc2, client, message, *args, **kwargs
+                    )
+                return await unauthorised(message, permission, subFunc2)
+            # For admins and sudo users
+            userID = message.from_user.id
+            permissions = await member_permissions(chatID, userID)
+            if userID not in SUDOERS and permission not in permissions:
+                return await unauthorised(message, permission, subFunc2)
+            return await authorised(
+                func, subFunc2, client, message, *args, **kwargs
+            )
+
+        return subFunc2
+
+    return subFunc

+ 275 - 442
wbb/modules/admin.py

@@ -22,10 +22,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 SOFTWARE.
 """
 """
 import asyncio
 import asyncio
-import traceback
 
 
 from pyrogram import filters
 from pyrogram import filters
-from pyrogram.types import ChatPermissions
+from pyrogram.types import ChatPermissions, Message
 
 
 from wbb import BOT_ID, SUDOERS, app
 from wbb import BOT_ID, SUDOERS, app
 from wbb.core.decorators.errors import capture_err
 from wbb.core.decorators.errors import capture_err
@@ -36,6 +35,7 @@ __MODULE__ = "Admin"
 __HELP__ = """/ban - Ban A User
 __HELP__ = """/ban - Ban A User
 /unban - Unban A User
 /unban - Unban A User
 /warn - Warn A User
 /warn - Warn A User
+/rmwarn - Remove 1 Warning Of A User
 /rmwarns - Remove All Warning of A User
 /rmwarns - Remove All Warning of A User
 /warns - Show Warning Of A User
 /warns - Show Warning Of A User
 /kick - Kick A User
 /kick - Kick A User
@@ -50,15 +50,6 @@ __HELP__ = """/ban - Ban A User
 /report | @admins - Report A Message To Admins."""
 /report | @admins - Report A Message To Admins."""
 
 
 
 
-async def list_admins(chat_id: int):
-    list_of_admins = []
-    async for member in app.iter_chat_members(
-        chat_id, filter="administrators"
-    ):
-        list_of_admins.append(member.user.id)
-    return list_of_admins
-
-
 async def member_permissions(chat_id: int, user_id: int):
 async def member_permissions(chat_id: int, user_id: int):
     perms = []
     perms = []
     member = await app.get_chat_member(chat_id, user_id)
     member = await app.get_chat_member(chat_id, user_id)
@@ -83,6 +74,18 @@ async def member_permissions(chat_id: int, user_id: int):
     return perms
     return perms
 
 
 
 
+from wbb.core.decorators.permissions import adminsOnly
+
+
+async def list_admins(chat_id: int):
+    list_of_admins = []
+    async for member in app.iter_chat_members(
+        chat_id, filter="administrators"
+    ):
+        list_of_admins.append(member.user.id)
+    return list_of_admins
+
+
 async def current_chat_permissions(chat_id):
 async def current_chat_permissions(chat_id):
     perms = []
     perms = []
     perm = (await app.get_chat(chat_id)).permissions
     perm = (await app.get_chat(chat_id)).permissions
@@ -126,501 +129,340 @@ async def list_members(group_id):
 
 
 
 
 @app.on_message(filters.command("purge") & ~filters.edited)
 @app.on_message(filters.command("purge") & ~filters.edited)
-@capture_err
-async def purge(client, message):
-    try:
-        message_ids = []
-        chat_id = message.chat.id
-        user_id = message.from_user.id
-        if message.chat.type not in ("supergroup", "channel"):
-            return
-        permissions = await member_permissions(chat_id, user_id)
-        if "can_delete_messages" in permissions or user_id in SUDOERS:
-            if message.reply_to_message:
-                for a_s_message_id in range(
-                    message.reply_to_message.message_id, message.message_id
-                ):
-                    message_ids.append(a_s_message_id)
-                    if len(message_ids) == 100:
-                        await client.delete_messages(
-                            chat_id=chat_id,
-                            message_ids=message_ids,
-                            revoke=True,
-                        )
-                        message_ids = []
-                if len(message_ids) > 0:
-                    await client.delete_messages(
-                        chat_id=chat_id, message_ids=message_ids, revoke=True
-                    )
-            else:
-                await message.reply_text(
-                    "Reply To A Message To Delete It,"
-                    " Don't Make Fun Of Yourself!"
-                )
-        else:
-            await message.reply_text("Your Don't Have Enough Permissions!")
-        await message.delete()
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+@adminsOnly("can_delete_messages")
+async def purgeFunc(client, message: Message):
+    chat_id = message.chat.id
+    message_ids = []
+    if message.chat.type not in ("supergroup", "channel"):
+        return
+    if not message.reply_to_message:
+        await message.reply_text(
+            "Reply To A Message To Delete From," " Don't Make Fun Of Yourself!"
+        )
+    for a_s_message_id in range(
+        message.reply_to_message.message_id, message.message_id
+    ):
+        message_ids.append(a_s_message_id)
+        if len(message_ids) == 100:
+            await client.delete_messages(
+                chat_id=chat_id,
+                message_ids=message_ids,
+                revoke=True,
+            )
+            message_ids = []
+    if len(message_ids) > 0:
+        await client.delete_messages(
+            chat_id=chat_id, message_ids=message_ids, revoke=True
+        )
 
 
 
 
 # Kick members
 # Kick members
 
 
 
 
 @app.on_message(filters.command("kick") & ~filters.edited)
 @app.on_message(filters.command("kick") & ~filters.edited)
-@capture_err
-async def kick(_, message):
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if (
-            "can_restrict_members" not in permissions
-            and from_user_id not in SUDOERS
-        ):
-            await message.reply_text("You don't have enough permissions.")
-            return
-        if len(message.command) == 2:
-            user_id = (await app.get_users(message.text.split(None, 1)[1])).id
-        elif len(message.command) == 1 and message.reply_to_message:
-            user_id = message.reply_to_message.from_user.id
-        else:
-            await message.reply_text(
-                "Provide a username or reply to a user's message to kick."
-            )
-            return
-        if user_id in SUDOERS:
-            await message.reply_text("You Wanna Kick The Elevated One?")
-        else:
-            await message.chat.kick_member(user_id)
-            await asyncio.sleep(1)
-            await message.chat.unban_member(user_id)
-            await message.reply_text("Kicked!")
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+@adminsOnly("can_restrict_members")
+async def kickFunc(_, message: Message):
+    if len(message.command) == 2:
+        user_id = (await app.get_users(message.text.split(None, 1)[1])).id
+    elif len(message.command) == 1 and message.reply_to_message:
+        user_id = message.reply_to_message.from_user.id
+    else:
+        await message.reply_text(
+            "Provide a username or reply to a user's message to kick."
+        )
+        return
+    if user_id in SUDOERS:
+        await message.reply_text("You Wanna Kick The Elevated One?")
+    else:
+        await message.chat.kick_member(user_id)
+        await asyncio.sleep(1)
+        await message.reply_text("Kicked!")
+        await message.chat.unban_member(user_id)
 
 
 
 
 # Ban members
 # Ban members
 
 
 
 
 @app.on_message(filters.command("ban") & ~filters.edited)
 @app.on_message(filters.command("ban") & ~filters.edited)
-@capture_err
-async def ban(_, message):
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if (
-            "can_restrict_members" not in permissions
-            and from_user_id not in SUDOERS
-        ):
-            await message.reply_text("You don't have enough permissions.")
-            return
-        if len(message.command) == 2:
-            user_id = (await app.get_users(message.text.split(None, 1)[1])).id
-        elif len(message.command) == 1 and message.reply_to_message:
-            user_id = message.reply_to_message.from_user.id
-        else:
-            await message.reply_text(
-                "Provide a username or reply to a user's message to ban."
-            )
-            return
-        if user_id in SUDOERS:
-            await message.reply_text("You Wanna Ban The Elevated One?")
-        else:
-            await message.chat.kick_member(user_id)
-            await message.reply_text("Banned!")
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+@adminsOnly("can_restrict_members")
+async def banFunc(_, message: Message):
+    if len(message.command) == 2:
+        user_id = (await app.get_users(message.text.split(None, 1)[1])).id
+    elif len(message.command) == 1 and message.reply_to_message:
+        user_id = message.reply_to_message.from_user.id
+    else:
+        await message.reply_text(
+            "Provide a username or reply to a user's message to ban."
+        )
+        return
+    if user_id in SUDOERS:
+        await message.reply_text("You Wanna Ban The Elevated One?")
+    else:
+        await message.chat.kick_member(user_id)
+        await message.reply_text("Banned!")
 
 
 
 
 # Unban members
 # Unban members
 
 
 
 
 @app.on_message(filters.command("unban") & ~filters.edited)
 @app.on_message(filters.command("unban") & ~filters.edited)
-@capture_err
-async def unban(_, message):
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if (
-            "can_restrict_members" not in permissions
-            and from_user_id not in SUDOERS
-        ):
-            await message.reply_text("You don't have enough permissions.")
-            return
-        if len(message.command) == 2:
-            user = message.text.split(None, 1)[1]
-        elif len(message.command) == 1 and message.reply_to_message:
-            user = message.reply_to_message.from_user.id
-        else:
-            await message.reply_text(
-                "Provide a username or reply to a user's message to unban."
-            )
-            return
-        await message.chat.unban_member(user)
-        await message.reply_text("Unbanned!")
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+@adminsOnly("can_restrict_members")
+async def unbanFunc(_, message: Message):
+    if len(message.command) == 2:
+        user = message.text.split(None, 1)[1]
+    elif len(message.command) == 1 and message.reply_to_message:
+        user = message.reply_to_message.from_user.id
+    else:
+        await message.reply_text(
+            "Provide a username or reply to a user's message to unban."
+        )
+        return
+    await message.chat.unban_member(user)
+    await message.reply_text("Unbanned!")
 
 
 
 
 # Delete messages
 # Delete messages
 
 
 
 
 @app.on_message(filters.command("del") & ~filters.edited)
 @app.on_message(filters.command("del") & ~filters.edited)
-@capture_err
-async def delete(_, message):
+@adminsOnly("can_delete_messages")
+async def deleteFunc(_, message: Message):
     if not message.reply_to_message:
     if not message.reply_to_message:
         await message.reply_text("Reply To A Message To Delete It")
         await message.reply_text("Reply To A Message To Delete It")
         return
         return
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if (
-            "can_delete_messages" not in permissions
-            and from_user_id not in SUDOERS
-        ):
-            await message.reply_text(
-                "You Don't Have Enough Permissions,"
-                + " Consider Deleting Yourself!"
-            )
-            return
-        await message.reply_to_message.delete()
-        await message.delete()
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+    await message.reply_to_message.delete()
+    await message.delete()
 
 
 
 
 # Promote Members
 # Promote Members
 
 
 
 
 @app.on_message(filters.command("promote") & ~filters.edited)
 @app.on_message(filters.command("promote") & ~filters.edited)
-@capture_err
-async def promote(_, message):
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if (
-            "can_promote_members" not in permissions
-            and from_user_id not in SUDOERS
-        ):
-            await message.reply_text("You don't have enough permissions")
-            return
-        bot = await app.get_chat_member(chat_id, BOT_ID)
-        if len(message.command) == 2:
-            username = message.text.split(None, 1)[1]
-            user_id = (await app.get_users(username)).id
-        elif len(message.command) == 1 and message.reply_to_message:
-            user_id = message.reply_to_message.from_user.id
-        else:
-            await message.reply_text(
-                "Reply To A User's Message Or Give A Username To Promote."
-            )
-            return
-        await message.chat.promote_member(
-            user_id=user_id,
-            can_change_info=bot.can_change_info,
-            can_invite_users=bot.can_invite_users,
-            can_delete_messages=bot.can_delete_messages,
-            can_restrict_members=False,
-            can_pin_messages=bot.can_pin_messages,
-            can_promote_members=bot.can_promote_members,
-            can_manage_chat=bot.can_manage_chat,
-            can_manage_voice_chats=bot.can_manage_voice_chats,
+@adminsOnly("can_promote_members")
+async def promoteFunc(_, message: Message):
+    chat_id = message.chat.id
+    bot = await app.get_chat_member(chat_id, BOT_ID)
+    if len(message.command) == 2:
+        username = message.text.split(None, 1)[1]
+        user_id = (await app.get_users(username)).id
+    elif len(message.command) == 1 and message.reply_to_message:
+        user_id = message.reply_to_message.from_user.id
+    else:
+        await message.reply_text(
+            "Reply To A User's Message Or Give A Username To Promote."
         )
         )
-        await message.reply_text("Promoted!")
-
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+        return
+    await message.chat.promote_member(
+        user_id=user_id,
+        can_change_info=bot.can_change_info,
+        can_invite_users=bot.can_invite_users,
+        can_delete_messages=bot.can_delete_messages,
+        can_restrict_members=False,
+        can_pin_messages=bot.can_pin_messages,
+        can_promote_members=bot.can_promote_members,
+        can_manage_chat=bot.can_manage_chat,
+        can_manage_voice_chats=bot.can_manage_voice_chats,
+    )
+    await message.reply_text("Promoted!")
 
 
 
 
 # Demote Member
 # Demote Member
 
 
 
 
 @app.on_message(filters.command("demote") & ~filters.edited)
 @app.on_message(filters.command("demote") & ~filters.edited)
-@capture_err
-async def demote(_, message):
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if (
-            "can_promote_members" not in permissions
-            and from_user_id not in SUDOERS
-        ):
-            await message.reply_text("You don't have enough permissions")
-            return
-        if len(message.command) == 2:
-            username = message.text.split(None, 1)[1]
-            user_id = (await app.get_users(username)).id
-        elif len(message.command) == 1 and message.reply_to_message:
-            user_id = message.reply_to_message.from_user.id
-        else:
-            await message.reply_text(
-                "Reply To A User's Message Or Give A Username To Demote."
-            )
-            return
-        await message.chat.promote_member(
-            user_id=user_id,
-            can_change_info=False,
-            can_invite_users=False,
-            can_delete_messages=False,
-            can_restrict_members=False,
-            can_pin_messages=False,
-            can_promote_members=False,
-            can_manage_chat=False,
-            can_manage_voice_chats=False,
+@adminsOnly("can_promote_members")
+async def demote(_, message: Message):
+    if len(message.command) == 2:
+        username = message.text.split(None, 1)[1]
+        user_id = (await app.get_users(username)).id
+    elif len(message.command) == 1 and message.reply_to_message:
+        user_id = message.reply_to_message.from_user.id
+    else:
+        await message.reply_text(
+            "Reply To A User's Message Or Give A Username To Demote."
         )
         )
-        await message.reply_text("Demoted!")
-
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+        return
+    await message.chat.promote_member(
+        user_id=user_id,
+        can_change_info=False,
+        can_invite_users=False,
+        can_delete_messages=False,
+        can_restrict_members=False,
+        can_pin_messages=False,
+        can_promote_members=False,
+        can_manage_chat=False,
+        can_manage_voice_chats=False,
+    )
+    await message.reply_text("Demoted!")
 
 
 
 
 # Pin Messages
 # Pin Messages
 
 
 
 
 @app.on_message(filters.command("pin") & ~filters.edited)
 @app.on_message(filters.command("pin") & ~filters.edited)
-@capture_err
-async def pin(_, message):
+@adminsOnly("can_pin_messages")
+async def pin(_, message: Message):
     if not message.reply_to_message:
     if not message.reply_to_message:
         await message.reply_text("Reply To A Message To Pin.")
         await message.reply_text("Reply To A Message To Pin.")
         return
         return
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if "can_pin_messages" in permissions or from_user_id in SUDOERS:
-            await message.reply_to_message.pin(disable_notification=True)
-        else:
-            await message.reply_text("You're Not An Admin, Stop Spamming!")
-            return
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+    await message.reply_to_message.pin(disable_notification=True)
 
 
 
 
 # Mute members
 # Mute members
 
 
 
 
 @app.on_message(filters.command("mute") & ~filters.edited)
 @app.on_message(filters.command("mute") & ~filters.edited)
-@capture_err
-async def mute(_, message):
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if (
-            "can_restrict_members" not in permissions
-            and from_user_id not in SUDOERS
-        ):
-            await message.reply_text("You don't have enough permissions.")
-            return
-        if len(message.command) == 2:
-            user_id = (await app.get_users(message.text.split(None, 1)[1])).id
-        elif len(message.command) == 1 and message.reply_to_message:
-            user_id = message.reply_to_message.from_user.id
-        else:
-            await message.reply_text(
-                "Provide a username or reply to a user's message to mute."
-            )
-            return
-        if user_id in SUDOERS:
-            await message.reply_text("You Wanna Mute The Elevated One?")
-            return
-        await message.chat.restrict_member(
-            user_id, permissions=ChatPermissions()
+@adminsOnly("can_restrict_members")
+async def mute(_, message: Message):
+    if len(message.command) == 2:
+        user_id = (await app.get_users(message.text.split(None, 1)[1])).id
+    elif len(message.command) == 1 and message.reply_to_message:
+        user_id = message.reply_to_message.from_user.id
+    else:
+        await message.reply_text(
+            "Provide a username or reply to a user's message to mute."
         )
         )
-        await message.reply_text("Muted!")
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+        return
+    if user_id in SUDOERS:
+        await message.reply_text("You Wanna Mute The Elevated One?")
+        return
+    await message.chat.restrict_member(user_id, permissions=ChatPermissions())
+    await message.reply_text("Muted!")
 
 
 
 
 # Unmute members
 # Unmute members
 
 
 
 
 @app.on_message(filters.command("unmute") & ~filters.edited)
 @app.on_message(filters.command("unmute") & ~filters.edited)
-@capture_err
-async def unmute(_, message):
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if (
-            "can_restrict_members" not in permissions
-            and from_user_id not in SUDOERS
-        ):
-            await message.reply_text("You don't have enough permissions.")
-            return
-        if len(message.command) == 2:
-            user = message.text.split(None, 1)[1]
-        elif len(message.command) == 1 and message.reply_to_message:
-            user = message.reply_to_message.from_user.id
-        else:
-            await message.reply_text(
-                "Provide a username or reply to a user's message to Unmute"
-            )
-            return
-        await message.chat.unban_member(user)
-        await message.reply_text("Unmuted!")
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+@adminsOnly("can_restrict_members")
+async def unmute(_, message: Message):
+    if len(message.command) == 2:
+        user = message.text.split(None, 1)[1]
+    elif len(message.command) == 1 and message.reply_to_message:
+        user = message.reply_to_message.from_user.id
+    else:
+        await message.reply_text(
+            "Provide a username or reply to a user's message to Unmute"
+        )
+        return
+    await message.chat.unban_member(user)
+    await message.reply_text("Unmuted!")
 
 
 
 
 # Ban deleted accounts
 # Ban deleted accounts
 
 
 
 
 @app.on_message(filters.command("ban_ghosts"))
 @app.on_message(filters.command("ban_ghosts"))
-async def ban_deleted_accounts(_, message):
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if "can_restrict_members" in permissions or from_user_id in SUDOERS:
-            deleted_users = []
-            banned_users = 0
-            async for i in app.iter_chat_members(chat_id):
-                if i.user.is_deleted:
-                    deleted_users.append(i.user.id)
-            if len(deleted_users) > 0:
-                for deleted_user in deleted_users:
-                    try:
-                        await message.chat.kick_member(deleted_user)
-                    except Exception as e:
-                        print(str(e))
-                        pass
-                    banned_users += 1
-                await message.reply_text(
-                    f"Banned {banned_users} Deleted Accounts"
-                )
-            else:
-                await message.reply_text("No Deleted Accounts In This Chat")
-                return
-        else:
-            await message.reply_text("You Don't Have Enough Permissions")
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+@adminsOnly("can_restrict_members")
+async def ban_deleted_accounts(_, message: Message):
+    chat_id = message.chat.id
+    deleted_users = []
+    banned_users = 0
+    async for i in app.iter_chat_members(chat_id):
+        if i.user.is_deleted:
+            deleted_users.append(i.user.id)
+    if len(deleted_users) > 0:
+        for deleted_user in deleted_users:
+            try:
+                await message.chat.kick_member(deleted_user)
+            except Exception:
+                pass
+            banned_users += 1
+        await message.reply_text(f"Banned {banned_users} Deleted Accounts")
+    else:
+        await message.reply_text("No Deleted Accounts In This Chat")
 
 
 
 
 @app.on_message(filters.command("warn") & ~filters.edited)
 @app.on_message(filters.command("warn") & ~filters.edited)
-@capture_err
-async def warn_user(_, message):
+@adminsOnly("can_restrict_members")
+async def warn_user(_, message: Message):
     if not message.reply_to_message:
     if not message.reply_to_message:
         await message.reply_text("Reply to a message to warn a user.")
         await message.reply_text("Reply to a message to warn a user.")
         return
         return
-    try:
-        from_user_id = message.from_user.id
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if "can_restrict_members" in permissions or from_user_id in SUDOERS:
-            user_id = message.reply_to_message.from_user.id
-            mention = message.reply_to_message.from_user.mention
-            if user_id in SUDOERS:
-                await message.reply_text("You Wanna Warn The Elevated One?")
-            elif user_id == BOT_ID:
-                await message.reply_text("Huh, Can't warn myself.")
-            elif user_id in await list_admins(message.chat.id):
-                await message.reply_text("Can't warn an admin.")
-            elif user_id == from_user_id:
-                await message.reply_text("I wouldn't do that if i were you.")
+    chat_id = message.chat.id
+    user_id = message.reply_to_message.from_user.id
+    mention = message.reply_to_message.from_user.mention
+    if user_id in SUDOERS:
+        await message.reply_text("You Wanna Warn The Elevated One?")
+    elif user_id == BOT_ID:
+        await message.reply_text("Huh, Can't warn myself.")
+    elif user_id in await list_admins(message.chat.id):
+        await message.reply_text("Can't warn an admin.")
+    else:
+        if user_id in await list_members(chat_id):
+            warns = await get_warn(chat_id, await int_to_alpha(user_id))
+            if warns:
+                warns = warns["warns"]
             else:
             else:
-                if user_id in await list_members(chat_id):
-                    warns = await get_warn(
-                        chat_id, await int_to_alpha(user_id)
-                    )
-                    if warns:
-                        warns = warns["warns"]
-                    else:
-                        warn = {"warns": 1}
-                        await add_warn(
-                            chat_id, await int_to_alpha(user_id), warn
-                        )
-                        await message.reply_text(
-                            f"Warned {mention} !, 1/3 warnings now."
-                        )
-                        return
-                    if warns >= 2:
-                        await message.chat.kick_member(user_id)
-                        await message.reply_text(
-                            f"Number of warns of {mention} exceeded, Banned!"
-                        )
-                        await remove_warns(
-                            chat_id, await int_to_alpha(user_id)
-                        )
-                    else:
-                        warn = {"warns": warns + 1}
-                        await add_warn(
-                            chat_id, await int_to_alpha(user_id), warn
-                        )
-                        await message.reply_text(
-                            f"Warned {mention} !, {warns+1}/3 warnings now."
-                        )
-                else:
-                    await message.reply_text("This user isn't here.")
+                warn = {"warns": 1}
+                await add_warn(chat_id, await int_to_alpha(user_id), warn)
+                await message.reply_text(
+                    f"Warned {mention} !, 1/3 warnings now."
+                )
+                return
+            if warns >= 2:
+                await message.chat.kick_member(user_id)
+                await message.reply_text(
+                    f"Number of warns of {mention} exceeded, Banned!"
+                )
+                await remove_warns(chat_id, await int_to_alpha(user_id))
+            else:
+                warn = {"warns": warns + 1}
+                await add_warn(chat_id, await int_to_alpha(user_id), warn)
+                await message.reply_text(
+                    f"Warned {mention} !, {warns+1}/3 warnings now."
+                )
         else:
         else:
-            await message.reply_text("You don't have enough permissions.")
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+            await message.reply_text("This user isn't here.")
+
+
+# Rmwarn
+
+
+@app.on_message(filters.command("rmwarn") & ~filters.edited)
+@adminsOnly("can_restrict_members")
+async def remove_warning(_, message: Message):
+    if not message.reply_to_message:
+        await message.reply_text(
+            "Reply to a message to remove a user's warning."
+        )
+        return
+    user_id = message.reply_to_message.from_user.id
+    mention = message.reply_to_message.from_user.mention
+    chat_id = message.chat.id
+    warns = await get_warn(chat_id, await int_to_alpha(user_id))
+    if warns:
+        warns = warns["warns"]
+    if warns == 0 or not warns:
+        await message.reply_text(f"{mention} have no warnings.")
+    else:
+        warn = {"warns": warns - 1}
+        await add_warn(chat_id, await int_to_alpha(user_id), warn)
+        await message.reply_text(f"Removed warning of {mention}.")
 
 
 
 
 # Rmwarns
 # Rmwarns
 
 
 
 
 @app.on_message(filters.command("rmwarns") & ~filters.edited)
 @app.on_message(filters.command("rmwarns") & ~filters.edited)
-@capture_err
-async def remove_warnings(_, message):
+@adminsOnly("can_restrict_members")
+async def remove_warnings(_, message: Message):
     if not message.reply_to_message:
     if not message.reply_to_message:
         await message.reply_text(
         await message.reply_text(
             "Reply to a message to remove a user's warnings."
             "Reply to a message to remove a user's warnings."
         )
         )
         return
         return
-    try:
-        from_user_id = message.from_user.id
-        user_id = message.reply_to_message.from_user.id
-        mention = message.reply_to_message.from_user.mention
-        chat_id = message.chat.id
-        permissions = await member_permissions(chat_id, from_user_id)
-        if "can_restrict_members" in permissions or from_user_id in SUDOERS:
-            warns = await get_warn(chat_id, await int_to_alpha(user_id))
-            if warns:
-                warns = warns["warns"]
-            if warns == 0 or not warns:
-                await message.reply_text(f"{mention} have no warnings.")
-            else:
-                await remove_warns(chat_id, await int_to_alpha(user_id))
-                await message.reply_text(f"Removed warnings of {mention}.")
-        else:
-            await message.reply_text("You don't have enough permissions")
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+    user_id = message.reply_to_message.from_user.id
+    mention = message.reply_to_message.from_user.mention
+    chat_id = message.chat.id
+    warns = await get_warn(chat_id, await int_to_alpha(user_id))
+    if warns:
+        warns = warns["warns"]
+    if warns == 0 or not warns:
+        await message.reply_text(f"{mention} have no warnings.")
+    else:
+        await remove_warns(chat_id, await int_to_alpha(user_id))
+        await message.reply_text(f"Removed warnings of {mention}.")
 
 
 
 
 # Warns
 # Warns
@@ -628,41 +470,32 @@ async def remove_warnings(_, message):
 
 
 @app.on_message(filters.command("warns") & ~filters.edited)
 @app.on_message(filters.command("warns") & ~filters.edited)
 @capture_err
 @capture_err
-async def check_warns(_, message):
+async def check_warns(_, message: Message):
     if not message.reply_to_message:
     if not message.reply_to_message:
         await message.reply_text(
         await message.reply_text(
             "Reply to a message to check a user's warnings."
             "Reply to a message to check a user's warnings."
         )
         )
         return
         return
-    try:
-        user_id = message.reply_to_message.from_user.id
-        mention_user = message.reply_to_message.from_user.mention
-        mention_from_user = message.from_user.mention
-        chat_id = message.chat.id
-        if message.reply_to_message:
-            warns = await get_warn(chat_id, await int_to_alpha(user_id))
-            if warns:
-                warns = warns["warns"]
-            else:
-                await message.reply_text(f"{mention_user} have no warnings.")
-                return
-            await message.reply_text(
-                f"{mention_user} have {warns}/3 warnings."
-            )
-            return
+    user_id = message.reply_to_message.from_user.id
+    mention_user = message.reply_to_message.from_user.mention
+    mention_from_user = message.from_user.mention
+    chat_id = message.chat.id
+    if message.reply_to_message:
         warns = await get_warn(chat_id, await int_to_alpha(user_id))
         warns = await get_warn(chat_id, await int_to_alpha(user_id))
         if warns:
         if warns:
             warns = warns["warns"]
             warns = warns["warns"]
         else:
         else:
             await message.reply_text(f"{mention_user} have no warnings.")
             await message.reply_text(f"{mention_user} have no warnings.")
             return
             return
-        await message.reply_text(
-            f"{mention_from_user} have {warns}/3 warnings."
-        )
-    except Exception as e:
-        await message.reply_text(str(e))
-        e = traceback.format_exc()
-        print(e)
+        await message.reply_text(f"{mention_user} have {warns}/3 warnings.")
+        return
+    warns = await get_warn(chat_id, await int_to_alpha(user_id))
+    if warns:
+        warns = warns["warns"]
+    else:
+        await message.reply_text(f"{mention_user} have no warnings.")
+        return
+    await message.reply_text(f"{mention_from_user} have {warns}/3 warnings.")
 
 
 
 
 # Report
 # Report

+ 37 - 74
wbb/modules/admin_misc.py

@@ -25,9 +25,8 @@ import os
 
 
 from pyrogram import filters
 from pyrogram import filters
 
 
-from wbb import SUDOERS, app
-from wbb.core.decorators.errors import capture_err
-from wbb.modules.admin import member_permissions
+from wbb import app
+from wbb.core.decorators.permissions import adminsOnly
 
 
 __MODULE__ = "Admin Miscs"
 __MODULE__ = "Admin Miscs"
 __HELP__ = """
 __HELP__ = """
@@ -38,85 +37,49 @@ __HELP__ = """
 
 
 
 
 @app.on_message(filters.command("set_chat_title") & ~filters.private)
 @app.on_message(filters.command("set_chat_title") & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def set_chat_title(_, message):
 async def set_chat_title(_, message):
-    try:
-        chat_id = message.chat.id
-        user_id = message.from_user.id
-        if user_id not in SUDOERS:
-            permissions = await member_permissions(chat_id, user_id)
-            if "can_change_info" not in permissions:
-                await message.reply_text("You Don't Have Enough Permissions.")
-                return
-        if len(message.command) < 2:
-            await message.reply_text("**Usage:**\n/set_chat_title NEW NAME")
-            return
-        old_title = message.chat.title
-        new_title = message.text.split(None, 1)[1]
-        await message.chat.set_title(new_title)
-        await message.reply_text(
-            f"Successfully Changed Group Title From {old_title} To {new_title}"
-        )
-    except Exception as e:
-        print(e)
-        await message.reply_text(e)
+    if len(message.command) < 2:
+        await message.reply_text("**Usage:**\n/set_chat_title NEW NAME")
+        return
+    old_title = message.chat.title
+    new_title = message.text.split(None, 1)[1]
+    await message.chat.set_title(new_title)
+    await message.reply_text(
+        f"Successfully Changed Group Title From {old_title} To {new_title}"
+    )
 
 
 
 
 @app.on_message(filters.command("set_user_title") & ~filters.private)
 @app.on_message(filters.command("set_user_title") & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def set_user_title(_, message):
 async def set_user_title(_, message):
-    try:
-        chat_id = message.chat.id
-        user_id = message.from_user.id
-        from_user = message.reply_to_message.from_user
-        if user_id not in SUDOERS:
-            permissions = await member_permissions(chat_id, user_id)
-            if "can_change_info" not in permissions:
-                await message.reply_text("You Don't Have Enough Permissions.")
-                return
-        if len(message.command) < 2:
-            await message.reply_text(
-                "**Usage:**\n/set_user_title NEW ADMINISTRATOR TITLE"
-            )
-            return
-        title = message.text.split(None, 1)[1]
-        await app.set_administrator_title(chat_id, from_user.id, title)
+    chat_id = message.chat.id
+    from_user = message.reply_to_message.from_user
+    if len(message.command) < 2:
         await message.reply_text(
         await message.reply_text(
-            f"Successfully Changed {from_user.mention}'s Admin Title To {title}"
+            "**Usage:**\n/set_user_title NEW ADMINISTRATOR TITLE"
         )
         )
-    except Exception as e:
-        print(e)
-        await message.reply_text(e)
+        return
+    title = message.text.split(None, 1)[1]
+    await app.set_administrator_title(chat_id, from_user.id, title)
+    await message.reply_text(
+        f"Successfully Changed {from_user.mention}'s Admin Title To {title}"
+    )
 
 
 
 
 @app.on_message(filters.command("set_chat_photo") & ~filters.private)
 @app.on_message(filters.command("set_chat_photo") & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def set_chat_photo(_, message):
 async def set_chat_photo(_, message):
-    try:
-        chat_id = message.chat.id
-        user_id = message.from_user.id
-        if user_id not in SUDOERS:
-            permissions = await member_permissions(chat_id, user_id)
-            if "can_change_info" not in permissions:
-                await message.reply_text("You Don't Have Enough Permissions.")
-                return
-        if not message.reply_to_message:
-            await message.reply_text(
-                "Reply to a photo to set it as chat_photo"
-            )
-            return
-        if (
-            not message.reply_to_message.photo
-            and not message.reply_to_message.document
-        ):
-            await message.reply_text(
-                "Reply to a photo to set it as chat_photo"
-            )
-            return
-        photo = await message.reply_to_message.download()
-        await message.chat.set_photo(photo)
-        await message.reply_text("Successfully Changed Group Photo")
-        os.remove(photo)
-    except Exception as e:
-        print(e)
-        await message.reply_text(e)
+    if not message.reply_to_message:
+        await message.reply_text("Reply to a photo to set it as chat_photo")
+        return
+    if (
+        not message.reply_to_message.photo
+        and not message.reply_to_message.document
+    ):
+        await message.reply_text("Reply to a photo to set it as chat_photo")
+        return
+    photo = await message.reply_to_message.download()
+    await message.chat.set_photo(photo)
+    await message.reply_text("Successfully Changed Group Photo")
+    os.remove(photo)

+ 2 - 9
wbb/modules/antiservice.py

@@ -4,8 +4,7 @@
 from pyrogram import filters
 from pyrogram import filters
 
 
 from wbb import app
 from wbb import app
-from wbb.core.decorators.errors import capture_err
-from wbb.modules.admin import member_permissions
+from wbb.core.decorators.permissions import adminsOnly
 from wbb.utils.dbfunctions import (antiservice_off, antiservice_on,
 from wbb.utils.dbfunctions import (antiservice_off, antiservice_on,
                                    is_antiservice_on)
                                    is_antiservice_on)
 
 
@@ -18,7 +17,7 @@ Plugin to delete service messages in a chat!
 
 
 
 
 @app.on_message(filters.command("antiservice") & ~filters.private)
 @app.on_message(filters.command("antiservice") & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def anti_service(_, message):
 async def anti_service(_, message):
     if len(message.command) != 2:
     if len(message.command) != 2:
         await message.reply_text("Usage: /antiservice [enable | disable]")
         await message.reply_text("Usage: /antiservice [enable | disable]")
@@ -26,11 +25,6 @@ async def anti_service(_, message):
     status = message.text.split(None, 1)[1].strip()
     status = message.text.split(None, 1)[1].strip()
     status = status.lower()
     status = status.lower()
     chat_id = message.chat.id
     chat_id = message.chat.id
-    user_id = message.from_user.id
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_change_info" not in permissions:
-        await message.reply_text("You don't have enough permissions.")
-        return
     if status == "enable":
     if status == "enable":
         await antiservice_on(chat_id)
         await antiservice_on(chat_id)
         await message.reply_text(
         await message.reply_text(
@@ -48,7 +42,6 @@ async def anti_service(_, message):
 
 
 
 
 @app.on_message(filters.service, group=11)
 @app.on_message(filters.service, group=11)
-@capture_err
 async def delete_service(_, message):
 async def delete_service(_, message):
     chat_id = message.chat.id
     chat_id = message.chat.id
     try:
     try:

+ 25 - 41
wbb/modules/blacklist.py

@@ -22,14 +22,14 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 SOFTWARE.
 """
 """
 import re
 import re
-import traceback
 
 
 from pyrogram import filters
 from pyrogram import filters
 from pyrogram.types import ChatPermissions
 from pyrogram.types import ChatPermissions
 
 
 from wbb import SUDOERS, app
 from wbb import SUDOERS, app
 from wbb.core.decorators.errors import capture_err
 from wbb.core.decorators.errors import capture_err
-from wbb.modules.admin import list_admins, member_permissions
+from wbb.core.decorators.permissions import adminsOnly
+from wbb.modules.admin import list_admins
 from wbb.utils.dbfunctions import (delete_blacklist_filter,
 from wbb.utils.dbfunctions import (delete_blacklist_filter,
                                    get_blacklisted_words,
                                    get_blacklisted_words,
                                    save_blacklist_filter)
                                    save_blacklist_filter)
@@ -46,21 +46,16 @@ __HELP__ = """
 @app.on_message(
 @app.on_message(
     filters.command("blacklist") & ~filters.edited & ~filters.private
     filters.command("blacklist") & ~filters.edited & ~filters.private
 )
 )
-@capture_err
+@adminsOnly("can_restrict_members")
 async def save_filters(_, message):
 async def save_filters(_, message):
     if len(message.command) < 2:
     if len(message.command) < 2:
         await message.reply_text("Usage:\n/blacklist [WORD|SENTENCE]")
         await message.reply_text("Usage:\n/blacklist [WORD|SENTENCE]")
         return
         return
-    chat_id = message.chat.id
-    user_id = message.from_user.id
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_restrict_members" not in permissions and user_id not in SUDOERS:
-        await message.reply_text("**You don't have enough permissions**")
-        return
     word = message.text.split(None, 1)[1].strip()
     word = message.text.split(None, 1)[1].strip()
     if not word:
     if not word:
         await message.reply_text("**Usage**\n__/blacklist [WORD|SENTENCE]__")
         await message.reply_text("**Usage**\n__/blacklist [WORD|SENTENCE]__")
         return
         return
+    chat_id = message.chat.id
     await save_blacklist_filter(chat_id, word)
     await save_blacklist_filter(chat_id, word)
     await message.reply_text(f"__**Blacklisted {word}.**__")
     await message.reply_text(f"__**Blacklisted {word}.**__")
 
 
@@ -83,29 +78,25 @@ async def get_filterss(_, message):
 @app.on_message(
 @app.on_message(
     filters.command("whitelist") & ~filters.edited & ~filters.private
     filters.command("whitelist") & ~filters.edited & ~filters.private
 )
 )
-@capture_err
+@adminsOnly("can_restrict_members")
 async def del_filter(_, message):
 async def del_filter(_, message):
     if len(message.command) < 2:
     if len(message.command) < 2:
         await message.reply_text("Usage:\n/whitelist [WORD|SENTENCE]")
         await message.reply_text("Usage:\n/whitelist [WORD|SENTENCE]")
         return
         return
-    chat_id = message.chat.id
-    user_id = message.from_user.id
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_restrict_members" not in permissions and user_id not in SUDOERS:
-        await message.reply_text("**You don't have enough permissions**")
-        return
     word = message.text.split(None, 1)[1].strip()
     word = message.text.split(None, 1)[1].strip()
     if not word:
     if not word:
         await message.reply_text("Usage:\n/whitelist [WORD|SENTENCE]")
         await message.reply_text("Usage:\n/whitelist [WORD|SENTENCE]")
         return
         return
+    chat_id = message.chat.id
     deleted = await delete_blacklist_filter(chat_id, word)
     deleted = await delete_blacklist_filter(chat_id, word)
     if deleted:
     if deleted:
-        await message.reply_text(f"**Whitelist {word}.**")
-    else:
-        await message.reply_text("**No such blacklist filter.**")
+        await message.reply_text(f"**Whitelisted {word}.**")
+        return
+    await message.reply_text("**No such blacklist filter.**")
 
 
 
 
 @app.on_message(filters.text & ~filters.private, group=blacklist_filters_group)
 @app.on_message(filters.text & ~filters.private, group=blacklist_filters_group)
+@capture_err
 async def blacklist_filters_re(_, message):
 async def blacklist_filters_re(_, message):
     text = message.text.lower().strip()
     text = message.text.lower().strip()
     if not text:
     if not text:
@@ -116,26 +107,19 @@ async def blacklist_filters_re(_, message):
         return
         return
     if user.id in SUDOERS:
     if user.id in SUDOERS:
         return
         return
-    try:
-        list_of_filters = await get_blacklisted_words(chat_id)
-        for word in list_of_filters:
-            pattern = r"( |^|[^\w])" + re.escape(word) + r"( |$|[^\w])"
-            if re.search(pattern, text, flags=re.IGNORECASE):
-                if user.id in await list_admins(chat_id):
-                    return
-                try:
-                    await message.chat.restrict_member(
-                        user.id, ChatPermissions()
-                    )
-                except Exception:
-                    return
-                await app.send_message(
-                    chat_id,
-                    f"Muted {user.mention} [`{user.id}`] due to a blacklist "
-                    + f"match on {word}.",
-                )
+    list_of_filters = await get_blacklisted_words(chat_id)
+    for word in list_of_filters:
+        pattern = r"( |^|[^\w])" + re.escape(word) + r"( |$|[^\w])"
+        if re.search(pattern, text, flags=re.IGNORECASE):
+            if user.id in await list_admins(chat_id):
+                return
+            try:
+                await message.chat.restrict_member(user.id, ChatPermissions())
+            except Exception:
                 return
                 return
-    except Exception as e:
-        e = traceback.format_exc()
-        print(e)
-        pass
+            await app.send_message(
+                chat_id,
+                f"Muted {user.mention} [`{user.id}`] due to a blacklist "
+                + f"match on {word}.",
+            )
+            return

+ 28 - 46
wbb/modules/filters.py

@@ -22,13 +22,12 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 SOFTWARE.
 """
 """
 import re
 import re
-import traceback
 
 
 from pyrogram import filters
 from pyrogram import filters
 
 
-from wbb import SUDOERS, app
+from wbb import app
 from wbb.core.decorators.errors import capture_err
 from wbb.core.decorators.errors import capture_err
-from wbb.modules.admin import member_permissions
+from wbb.core.decorators.permissions import adminsOnly
 from wbb.utils.dbfunctions import (add_served_chat, blacklisted_chats,
 from wbb.utils.dbfunctions import (add_served_chat, blacklisted_chats,
                                    delete_filter, get_filter,
                                    delete_filter, get_filter,
                                    get_filters_names, is_served_chat,
                                    get_filters_names, is_served_chat,
@@ -45,10 +44,8 @@ You can use markdown or html to save text too."""
 
 
 
 
 @app.on_message(filters.command("filter") & ~filters.edited & ~filters.private)
 @app.on_message(filters.command("filter") & ~filters.edited & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def save_filters(_, message):
 async def save_filters(_, message):
-    chat_id = message.chat.id
-    user_id = message.from_user.id
     if len(message.command) < 2 or not message.reply_to_message:
     if len(message.command) < 2 or not message.reply_to_message:
         await message.reply_text(
         await message.reply_text(
             "**Usage:**\nReply to a text or sticker with /filter [FILTER_NAME] to save it."
             "**Usage:**\nReply to a text or sticker with /filter [FILTER_NAME] to save it."
@@ -62,14 +59,11 @@ async def save_filters(_, message):
             "__**You can only save text or stickers in filters.**__"
             "__**You can only save text or stickers in filters.**__"
         )
         )
         return
         return
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_restrict_members" not in permissions and user_id not in SUDOERS:
-        await message.reply_text("**You don't have enough permissions**")
-        return
     name = message.text.split(None, 1)[1].strip()
     name = message.text.split(None, 1)[1].strip()
     if not name:
     if not name:
         await message.reply_text("**Usage**\n__/filter [FILTER_NAME]__")
         await message.reply_text("**Usage**\n__/filter [FILTER_NAME]__")
         return
         return
+    chat_id = message.chat.id
     _type = "text" if message.reply_to_message.text else "sticker"
     _type = "text" if message.reply_to_message.text else "sticker"
     _filter = {
     _filter = {
         "type": _type,
         "type": _type,
@@ -97,21 +91,16 @@ async def get_filterss(_, message):
 
 
 
 
 @app.on_message(filters.command("stop") & ~filters.edited & ~filters.private)
 @app.on_message(filters.command("stop") & ~filters.edited & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def del_filter(_, message):
 async def del_filter(_, message):
-    chat_id = message.chat.id
-    user_id = message.from_user.id
     if len(message.command) < 2:
     if len(message.command) < 2:
         await message.reply_text("**Usage**\n__/stop [FILTER_NAME]__")
         await message.reply_text("**Usage**\n__/stop [FILTER_NAME]__")
         return
         return
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_restrict_members" not in permissions and user_id not in SUDOERS:
-        await message.reply_text("**You don't have enough permissions**")
-        return
     name = message.text.split(None, 1)[1].strip()
     name = message.text.split(None, 1)[1].strip()
     if not name:
     if not name:
         await message.reply_text("**Usage**\n__/stop [FILTER_NAME]__")
         await message.reply_text("**Usage**\n__/stop [FILTER_NAME]__")
         return
         return
+    chat_id = message.chat.id
     deleted = await delete_filter(chat_id, name)
     deleted = await delete_filter(chat_id, name)
     if deleted:
     if deleted:
         await message.reply_text(f"**Deleted filter {name}.**")
         await message.reply_text(f"**Deleted filter {name}.**")
@@ -127,42 +116,35 @@ async def del_filter(_, message):
     & ~filters.forwarded,
     & ~filters.forwarded,
     group=chat_filters_group,
     group=chat_filters_group,
 )
 )
+@capture_err
 async def filters_re(_, message):
 async def filters_re(_, message):
     text = message.text.lower().strip()
     text = message.text.lower().strip()
     if not text:
     if not text:
         return
         return
     chat_id = message.chat.id
     chat_id = message.chat.id
-    try:
-        list_of_filters = await get_filters_names(chat_id)
-        for word in list_of_filters:
-            pattern = r"( |^|[^\w])" + re.escape(word) + r"( |$|[^\w])"
-            if re.search(pattern, text, flags=re.IGNORECASE):
-                _filter = await get_filter(chat_id, word)
-                data_type = _filter["type"]
-                data = _filter["data"]
-                if data_type == "text":
-                    if message.reply_to_message:
-                        await message.reply_to_message.reply_text(
-                            data, disable_web_page_preview=True
-                        )
-                        if text[0] == "~":
-                            await message.delete()
-                        return
-                    await message.reply_text(
+    list_of_filters = await get_filters_names(chat_id)
+    for word in list_of_filters:
+        pattern = r"( |^|[^\w])" + re.escape(word) + r"( |$|[^\w])"
+        if re.search(pattern, text, flags=re.IGNORECASE):
+            _filter = await get_filter(chat_id, word)
+            data_type = _filter["type"]
+            data = _filter["data"]
+            if data_type == "text":
+                if message.reply_to_message:
+                    await message.reply_to_message.reply_text(
                         data, disable_web_page_preview=True
                         data, disable_web_page_preview=True
                     )
                     )
-                else:
-                    if message.reply_to_message:
-                        await message.reply_to_message.reply_sticker(data)
-                        if text[0] == "~":
-                            await message.delete()
-                        return
-                    await message.reply_sticker(data)
-
-    except Exception as e:
-        e = traceback.format_exc()
-        print(e)
-        pass
+                    if text[0] == "~":
+                        await message.delete()
+                    return
+                await message.reply_text(data, disable_web_page_preview=True)
+            else:
+                if message.reply_to_message:
+                    await message.reply_to_message.reply_sticker(data)
+                    if text[0] == "~":
+                        await message.delete()
+                    return
+                await message.reply_sticker(data)
 
 
     """ CHAT WATCHER """
     """ CHAT WATCHER """
     blacklisted_chats_list = await blacklisted_chats()
     blacklisted_chats_list = await blacklisted_chats()

+ 9 - 29
wbb/modules/greetings.py

@@ -36,7 +36,7 @@ from pyrogram.types import (ChatPermissions, InlineKeyboardButton,
 
 
 from wbb import SUDOERS, WELCOME_DELAY_KICK_SEC, app
 from wbb import SUDOERS, WELCOME_DELAY_KICK_SEC, app
 from wbb.core.decorators.errors import capture_err
 from wbb.core.decorators.errors import capture_err
-from wbb.modules.admin import member_permissions
+from wbb.core.decorators.permissions import adminsOnly
 from wbb.utils.dbfunctions import (captcha_off, captcha_on, del_welcome,
 from wbb.utils.dbfunctions import (captcha_off, captcha_on, del_welcome,
                                    get_captcha_cache, get_welcome,
                                    get_captcha_cache, get_welcome,
                                    is_captcha_on, is_gbanned_user, set_welcome,
                                    is_captcha_on, is_gbanned_user, set_welcome,
@@ -46,7 +46,7 @@ from wbb.utils.functions import generate_captcha
 
 
 __MODULE__ = "Greetings"
 __MODULE__ = "Greetings"
 __HELP__ = """
 __HELP__ = """
-/captcha [ON|OFF] - Enable/Disable captcha.
+/captcha [ENABLE|DISABLE] - Enable/Disable captcha.
 
 
 /set_welcome - Reply this to a message containing correct
 /set_welcome - Reply this to a message containing correct
 format for a welcome message, check end of this message.
 format for a welcome message, check end of this message.
@@ -322,24 +322,19 @@ async def _ban_restricted_user_until_date(
 
 
 
 
 @app.on_message(filters.command("captcha") & ~filters.private)
 @app.on_message(filters.command("captcha") & ~filters.private)
-@capture_err
+@adminsOnly("can_restrict_members")
 async def captcha_state(_, message):
 async def captcha_state(_, message):
-    usage = "**Usage:**\n/captcha [ON|OFF]"
+    usage = "**Usage:**\n/captcha [ENABLE|DISABLE]"
     if len(message.command) != 2:
     if len(message.command) != 2:
         await message.reply_text(usage)
         await message.reply_text(usage)
         return
         return
-    user_id = message.from_user.id
     chat_id = message.chat.id
     chat_id = message.chat.id
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_restrict_members" not in permissions:
-        await message.reply_text("You don't have enough permissions.")
-        return
     state = message.text.split(None, 1)[1].strip()
     state = message.text.split(None, 1)[1].strip()
     state = state.lower()
     state = state.lower()
-    if state == "on":
+    if state == "enable":
         await captcha_on(chat_id)
         await captcha_on(chat_id)
         await message.reply_text("Enabled Captcha For New Users.")
         await message.reply_text("Enabled Captcha For New Users.")
-    elif state == "off":
+    elif state == "disable":
         await captcha_off(chat_id)
         await captcha_off(chat_id)
         await message.reply_text("Disabled Captcha For New Users.")
         await message.reply_text("Disabled Captcha For New Users.")
     else:
     else:
@@ -350,7 +345,7 @@ async def captcha_state(_, message):
 
 
 
 
 @app.on_message(filters.command("set_welcome") & ~filters.private)
 @app.on_message(filters.command("set_welcome") & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def set_welcome_func(_, message):
 async def set_welcome_func(_, message):
     usage = "You need to reply to a text, check the Greetings module in /help"
     usage = "You need to reply to a text, check the Greetings module in /help"
     if not message.reply_to_message:
     if not message.reply_to_message:
@@ -359,38 +354,23 @@ async def set_welcome_func(_, message):
     if not message.reply_to_message.text:
     if not message.reply_to_message.text:
         await message.reply_text(usage)
         await message.reply_text(usage)
         return
         return
-    user_id = message.from_user.id
     chat_id = message.chat.id
     chat_id = message.chat.id
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_change_info" not in permissions:
-        await message.reply_text("You don't have enough permissions.")
-        return
     raw_text = str(message.reply_to_message.text.markdown)
     raw_text = str(message.reply_to_message.text.markdown)
     await set_welcome(chat_id, raw_text)
     await set_welcome(chat_id, raw_text)
     await message.reply_text("Welcome message has been successfully set.")
     await message.reply_text("Welcome message has been successfully set.")
 
 
 
 
 @app.on_message(filters.command("del_welcome") & ~filters.private)
 @app.on_message(filters.command("del_welcome") & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def del_welcome_func(_, message):
 async def del_welcome_func(_, message):
-    user_id = message.from_user.id
     chat_id = message.chat.id
     chat_id = message.chat.id
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_change_info" not in permissions:
-        await message.reply_text("You don't have enough permissions.")
-        return
     await del_welcome(chat_id)
     await del_welcome(chat_id)
     await message.reply_text("Welcome message has been deleted.")
     await message.reply_text("Welcome message has been deleted.")
 
 
 
 
 @app.on_message(filters.command("get_welcome") & ~filters.private)
 @app.on_message(filters.command("get_welcome") & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def get_welcome_func(_, message):
 async def get_welcome_func(_, message):
-    user_id = message.from_user.id
     chat_id = message.chat.id
     chat_id = message.chat.id
-    permissions = await member_permissions(chat_id, user_id)
-    if "can_change_info" not in permissions:
-        await message.reply_text("You don't have enough permissions.")
-        return
     welcome_message = await get_welcome(chat_id)
     welcome_message = await get_welcome(chat_id)
     await message.reply_text(welcome_message)
     await message.reply_text(welcome_message)

+ 26 - 39
wbb/modules/locks.py

@@ -25,9 +25,10 @@ from pyrogram import filters
 from pyrogram.errors.exceptions.bad_request_400 import ChatNotModified
 from pyrogram.errors.exceptions.bad_request_400 import ChatNotModified
 from pyrogram.types import ChatPermissions
 from pyrogram.types import ChatPermissions
 
 
-from wbb import SUDOERS, app
+from wbb import app
 from wbb.core.decorators.errors import capture_err
 from wbb.core.decorators.errors import capture_err
-from wbb.modules.admin import current_chat_permissions, member_permissions
+from wbb.core.decorators.permissions import adminsOnly
+from wbb.modules.admin import current_chat_permissions
 
 
 __MODULE__ = "Locks"
 __MODULE__ = "Locks"
 __HELP__ = """
 __HELP__ = """
@@ -84,47 +85,33 @@ async def tg_lock(message, permissions: list, perm: str, lock: bool):
 
 
 
 
 @app.on_message(filters.command(["lock", "unlock"]) & ~filters.private)
 @app.on_message(filters.command(["lock", "unlock"]) & ~filters.private)
-@capture_err
+@adminsOnly("can_restrict_members")
 async def locks_func(_, message):
 async def locks_func(_, message):
-    try:
-        user_id = message.from_user.id
-        chat_id = message.chat.id
-        if len(message.command) != 2:
-            await message.reply_text(incorrect_parameters)
-            return
-
-        parameter = message.text.strip().split(None, 1)[1].lower()
-        state = message.command[0].lower()
-        if parameter not in data and parameter != "all":
-            await message.reply_text(incorrect_parameters)
-            return
-
-        permissions = await member_permissions(chat_id, user_id)
-        if (
-            "can_restrict_members" not in permissions
-            and user_id not in SUDOERS
-        ):
-            await message.reply_text("You Don't Have Enough Permissions.")
-            return
-
-        permissions = await current_chat_permissions(chat_id)
-        if parameter in data:
-            await tg_lock(
-                message,
-                permissions,
-                data[parameter],
-                True if state == "lock" else False,
-            )
-            return
-        elif parameter == "all" and state == "lock":
-            await app.set_chat_permissions(chat_id, ChatPermissions())
-            await message.reply_text("Locked Everything.")
-    except Exception as e:
-        await message.reply_text(str(e))
-        print(e)
+    if len(message.command) != 2:
+        await message.reply_text(incorrect_parameters)
+        return
+    chat_id = message.chat.id
+    parameter = message.text.strip().split(None, 1)[1].lower()
+    state = message.command[0].lower()
+    if parameter not in data and parameter != "all":
+        await message.reply_text(incorrect_parameters)
+        return
+    permissions = await current_chat_permissions(chat_id)
+    if parameter in data:
+        await tg_lock(
+            message,
+            permissions,
+            data[parameter],
+            True if state == "lock" else False,
+        )
+        return
+    elif parameter == "all" and state == "lock":
+        await app.set_chat_permissions(chat_id, ChatPermissions())
+        await message.reply_text("Locked Everything.")
 
 
 
 
 @app.on_message(filters.command("locks") & ~filters.private)
 @app.on_message(filters.command("locks") & ~filters.private)
+@capture_err
 async def locktypes(_, message):
 async def locktypes(_, message):
     permissions = await current_chat_permissions(message.chat.id)
     permissions = await current_chat_permissions(message.chat.id)
     if not permissions:
     if not permissions:

+ 13 - 26
wbb/modules/notes.py

@@ -25,7 +25,7 @@ from pyrogram import filters
 
 
 from wbb import app
 from wbb import app
 from wbb.core.decorators.errors import capture_err
 from wbb.core.decorators.errors import capture_err
-from wbb.modules.admin import member_permissions
+from wbb.core.decorators.permissions import adminsOnly
 from wbb.utils.dbfunctions import (delete_note, get_note, get_note_names,
 from wbb.utils.dbfunctions import (delete_note, get_note, get_note_names,
                                    save_note)
                                    save_note)
 
 
@@ -37,7 +37,7 @@ __HELP__ = """/notes To Get All The Notes In The Chat.
 
 
 
 
 @app.on_message(filters.command("save") & ~filters.edited & ~filters.private)
 @app.on_message(filters.command("save") & ~filters.edited & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def save_notee(_, message):
 async def save_notee(_, message):
     if len(message.command) < 2 or not message.reply_to_message:
     if len(message.command) < 2 or not message.reply_to_message:
         await message.reply_text(
         await message.reply_text(
@@ -51,12 +51,6 @@ async def save_notee(_, message):
         await message.reply_text(
         await message.reply_text(
             "__**You can only save text or stickers in notes.**__"
             "__**You can only save text or stickers in notes.**__"
         )
         )
-
-    elif (
-        len(await member_permissions(message.chat.id, message.from_user.id))
-        < 1
-    ):
-        await message.reply_text("**You don't have enough permissions**")
     else:
     else:
         name = message.text.split(None, 1)[1].strip()
         name = message.text.split(None, 1)[1].strip()
         if not name:
         if not name:
@@ -111,25 +105,18 @@ async def get_one_note(_, message):
 
 
 
 
 @app.on_message(filters.command("delete") & ~filters.edited & ~filters.private)
 @app.on_message(filters.command("delete") & ~filters.edited & ~filters.private)
-@capture_err
+@adminsOnly("can_change_info")
 async def del_note(_, message):
 async def del_note(_, message):
     if len(message.command) < 2:
     if len(message.command) < 2:
         await message.reply_text("**Usage**\n__/delete [NOTE_NAME]__")
         await message.reply_text("**Usage**\n__/delete [NOTE_NAME]__")
-
-    elif (
-        len(await member_permissions(message.chat.id, message.from_user.id))
-        < 1
-    ):
-        await message.reply_text("**You don't have enough permissions**")
-
+        return
+    name = message.text.split(None, 1)[1].strip()
+    if not name:
+        await message.reply_text("**Usage**\n__/delete [NOTE_NAME]__")
+        return
+    chat_id = message.chat.id
+    deleted = await delete_note(chat_id, name)
+    if deleted:
+        await message.reply_text(f"**Deleted note {name} successfully.**")
     else:
     else:
-        name = message.text.split(None, 1)[1].strip()
-        if not name:
-            await message.reply_text("**Usage**\n__/delete [NOTE_NAME]__")
-            return
-        chat_id = message.chat.id
-        deleted = await delete_note(chat_id, name)
-        if deleted:
-            await message.reply_text(f"**Deleted note {name} successfully.**")
-        else:
-            await message.reply_text("**No such note.**")
+        await message.reply_text("**No such note.**")

+ 0 - 3
wbb/modules/paste.py

@@ -25,16 +25,13 @@ import asyncio
 import os
 import os
 
 
 import aiofiles
 import aiofiles
-import aiohttp
 from pykeyboard import InlineKeyboard
 from pykeyboard import InlineKeyboard
 from pyrogram import filters
 from pyrogram import filters
-from pyrogram.errors.exceptions.bad_request_400 import WebpageCurlFailed
 from pyrogram.types import InlineKeyboardButton
 from pyrogram.types import InlineKeyboardButton
 
 
 from wbb import aiohttpsession as session
 from wbb import aiohttpsession as session
 from wbb import app
 from wbb import app
 from wbb.core.decorators.errors import capture_err
 from wbb.core.decorators.errors import capture_err
-from wbb.utils.functions import get_http_status_code
 from wbb.utils.pastebin import paste
 from wbb.utils.pastebin import paste
 
 
 __MODULE__ = "Paste"
 __MODULE__ = "Paste"

+ 0 - 171
wbb/modules/pipes.py

@@ -1,171 +0,0 @@
-"""
-MIT License
-
-Copyright (c) 2021 TheHamkerCat
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-"""
-import asyncio
-
-from pyrogram import filters
-from pyrogram.types import Message
-
-from wbb import BOT_ID, SUDOERS, USERBOT_ID, app, app2
-from wbb.core.decorators.errors import capture_err
-from wbb.utils.dbfunctions import (activate_pipe, deactivate_pipe,
-                                   is_pipe_active, show_pipes)
-from wbb.utils.filter_groups import pipes_group
-
-__MODULE__ = "Pipes"
-__HELP__ = """
-**THIS MODULE IS ONLY FOR DEVS**
-
-Use this module to create a pipe that will forward messages of one chat/channel to another.
-
-
-/activate_pipe [FROM_CHAT_ID] [TO_CHAT_ID] [BOT|USERBOT]
-
-Active a pipe.
-
-choose 'BOT' or 'USERBOT' according to your needs, this will decide
-which client will fetch the message from 'FROM_CHAT'.
-
-
-/deactivate_pipe [FROM_CHAT_ID] [TO_CHAT_ID]
-
-Deactivete a pipe.
-
-
-/show_pipes
-
-Show all the active pipes.
-"""
-pipes_list_bot = []
-pipes_list_userbot = []
-
-
-async def load_pipes():
-    print("[INFO]: LOADING PIPES")
-    global pipes_list_bot, pipes_list_userbot
-    pipes_list_bot = []
-    pipes_list_userbot = []
-    pipes = await show_pipes()
-    for pipe in pipes:
-        if pipe["fetcher"] == "bot":
-            pipes_list_bot.append(pipe)
-            continue
-        pipes_list_userbot.append(pipe)
-
-
-loop = asyncio.get_running_loop()
-loop.create_task(load_pipes())
-
-
-@app.on_message(~filters.me, group=pipes_group)
-@capture_err
-async def pipes_worker_bot(_, message: Message):
-    for pipe in pipes_list_bot:
-        if pipe["from_chat_id"] == message.chat.id:
-            await message.forward(pipe["to_chat_id"])
-
-
-@app2.on_message(~filters.me, group=pipes_group)
-@capture_err
-async def pipes_worker_userbot(_, message: Message):
-    for pipe in pipes_list_userbot:
-        if pipe["from_chat_id"] == message.chat.id:
-            if not message.text:
-                m, temp = await asyncio.gather(
-                    app.listen(USERBOT_ID), message.copy(BOT_ID)
-                )
-                caption = f"Forwarded from `{pipe['from_chat_id']}`"
-                caption = (
-                    f"{temp.caption}\n\n{caption}" if temp.caption else caption
-                )
-                await app.copy_message(
-                    pipe["to_chat_id"],
-                    USERBOT_ID,
-                    m.message_id,
-                    caption=caption,
-                )
-                await asyncio.sleep(10)
-                await temp.delete()
-                return
-            caption = f"Forwarded from `{pipe['from_chat_id']}`"
-            await app.send_message(
-                pipe["to_chat_id"], text=message.text + "\n\n" + caption
-            )
-
-
-@app.on_message(filters.command("activate_pipe") & filters.user(SUDOERS))
-@capture_err
-async def activate_pipe_func(_, message: Message):
-    if len(message.command) != 4:
-        await message.reply_text(
-            "**Usage:**\n/activate_pipe [FROM_CHAT_ID] [TO_CHAT_ID] [BOT|USERBOT]"
-        )
-        return
-    text = message.text.strip().split()
-    from_chat = int(text[1])
-    to_chat = int(text[2])
-    fetcher = text[3].lower()
-    if fetcher != "bot" and fetcher != "userbot":
-        await message.reply_text("Wrong fetcher, see help menu.")
-        return
-    if await is_pipe_active(from_chat, to_chat):
-        await message.reply_text("This pipe is already active.")
-        return
-    await activate_pipe(from_chat, to_chat, fetcher)
-    await load_pipes()
-    await message.reply_text("Activated pipe.")
-
-
-@app.on_message(filters.command("deactivate_pipe") & filters.user(SUDOERS))
-@capture_err
-async def deactivate_pipe_func(_, message: Message):
-    if len(message.command) != 3:
-        await message.reply_text(
-            "**Usage:**\n/deactivate_pipe [FROM_CHAT_ID] [TO_CHAT_ID]"
-        )
-        return
-    text = message.text.strip().split()
-    from_chat = int(text[1])
-    to_chat = int(text[2])
-    if not await is_pipe_active(from_chat, to_chat):
-        await message.reply_text("This pipe is already inactive.")
-        return
-    await deactivate_pipe(from_chat, to_chat)
-    await load_pipes()
-    await message.reply_text("Deactivated pipe.")
-
-
-@app.on_message(filters.command("pipes") & filters.user(SUDOERS))
-@capture_err
-async def show_pipes_func(_, message: Message):
-    pipes = pipes_list_bot + pipes_list_userbot
-    if not pipes:
-        await message.reply_text("No pipe is active.")
-        return
-    text = ""
-    for count, pipe in enumerate(pipes, 1):
-        text += (
-            f"**Pipe:** `{count}`\n**From:** `{pipe['from_chat_id']}`\n"
-            + f"**To:** `{pipe['to_chat_id']}`\n**Fetcher:** `{pipe['fetcher']}`\n\n"
-        )
-    await message.reply_text(text)

+ 1 - 1
wbb/modules/regex.py

@@ -133,7 +133,7 @@ def separate_sed(sed_string):
                 and counter + 1 < len(sed_string)
                 and counter + 1 < len(sed_string)
                 and sed_string[counter + 1] == delim
                 and sed_string[counter + 1] == delim
             ):
             ):
-                sed_string = sed_string[:counter] + sed_string[counter + 1 :]
+                sed_string = sed_string[:counter] + sed_string[counter + 1:]
 
 
             elif sed_string[counter] == delim:
             elif sed_string[counter] == delim:
                 replace_with = sed_string[start:counter]
                 replace_with = sed_string[start:counter]

+ 5 - 3
wbb/modules/stickers.py

@@ -27,10 +27,10 @@ from traceback import format_exc
 
 
 from pyrogram import filters
 from pyrogram import filters
 from pyrogram.errors.exceptions.bad_request_400 import (PeerIdInvalid,
 from pyrogram.errors.exceptions.bad_request_400 import (PeerIdInvalid,
+                                                        ShortnameOccupyFailed,
                                                         StickerPngDimensions,
                                                         StickerPngDimensions,
                                                         StickerPngNopng,
                                                         StickerPngNopng,
-                                                        UserIsBlocked,
-                                                        ShortnameOccupyFailed)
+                                                        UserIsBlocked)
 from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
 from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
 
 
 from wbb import BOT_USERNAME, app
 from wbb import BOT_USERNAME, app
@@ -100,7 +100,9 @@ async def kang(client, message):
                 await msg.edit("Format not supported! ({})".format(image_type))
                 await msg.edit("Format not supported! ({})".format(image_type))
                 return
                 return
             try:
             try:
-                temp_file_path = await resize_file_to_sticker_size(temp_file_path)
+                temp_file_path = await resize_file_to_sticker_size(
+                    temp_file_path
+                )
             except OSError as e:
             except OSError as e:
                 await msg.edit_text("Something wrong happened.")
                 await msg.edit_text("Something wrong happened.")
                 raise Exception(
                 raise Exception(

+ 9 - 8
wbb/modules/userbot.py

@@ -5,7 +5,6 @@
             https://github.com/pokurt/Nana-Remix/blob/master/nana/plugins/devs.py
             https://github.com/pokurt/Nana-Remix/blob/master/nana/plugins/devs.py
 """
 """
 
 
-import aiofiles
 import os
 import os
 import re
 import re
 import subprocess
 import subprocess
@@ -16,6 +15,7 @@ from inspect import getfullargspec
 from io import StringIO
 from io import StringIO
 from time import time
 from time import time
 
 
+import aiofiles
 from pyrogram import filters
 from pyrogram import filters
 from pyrogram.types import Message
 from pyrogram.types import Message
 
 
@@ -29,7 +29,7 @@ __HELP__ = """
 .approve | .disapprove - Approve Or Disapprove A User To PM You.
 .approve | .disapprove - Approve Or Disapprove A User To PM You.
 .block | .unblock - Block Or Unblock A User.
 .block | .unblock - Block Or Unblock A User.
 """
 """
-
+arq = arq
 
 
 # Eval and Sh module from nana-remix
 # Eval and Sh module from nana-remix
 
 
@@ -82,9 +82,7 @@ async def executor(client, message: Message):
         evaluation = stdout
         evaluation = stdout
     else:
     else:
         evaluation = "Success"
         evaluation = "Success"
-    final_output = (
-        f"**INPUT:**\n```{escape(cmd)}```\n\n**OUTPUT**:\n```{escape(evaluation.strip())}```"
-    )
+    final_output = f"**INPUT:**\n```{escape(cmd)}```\n\n**OUTPUT**:\n```{escape(evaluation.strip())}```"
     if len(final_output) > 4096:
     if len(final_output) > 4096:
         filename = "output.txt"
         filename = "output.txt"
         with open(filename, "w+", encoding="utf8") as out_file:
         with open(filename, "w+", encoding="utf8") as out_file:
@@ -182,6 +180,7 @@ async def shellrunner(client, message: Message):
 
 
 """ C Eval """
 """ C Eval """
 
 
+
 async def sendFile(message: Message, text: str):
 async def sendFile(message: Message, text: str):
     file = "output.txt"
     file = "output.txt"
     async with aiofiles.open(file, mode="w+") as f:
     async with aiofiles.open(file, mode="w+") as f:
@@ -190,12 +189,14 @@ async def sendFile(message: Message, text: str):
     os.remove(file)
     os.remove(file)
 
 
 
 
-@app2.on_message(filters.command("c", prefixes=USERBOT_PREFIX) & filters.user(SUDOERS))
+@app2.on_message(
+    filters.command("c", prefixes=USERBOT_PREFIX) & filters.user(SUDOERS)
+)
 async def cEval(_, message: Message):
 async def cEval(_, message: Message):
     code = message.text.strip()[3:]
     code = message.text.strip()[3:]
     file = "exec.c"
     file = "exec.c"
-    cmdCompile = ['gcc', '-g', 'exec.c', '-o', 'exec']
-    cmdRun = ['./exec']
+    cmdCompile = ["gcc", "-g", "exec.c", "-o", "exec"]
+    cmdRun = ["./exec"]
     async with aiofiles.open(file, mode="w+") as f:
     async with aiofiles.open(file, mode="w+") as f:
         await f.write(code)
         await f.write(code)
     t1 = time()
     t1 = time()

+ 1 - 0
wbb/modules/ytdl.py

@@ -20,6 +20,7 @@ VIDEO_DATA = {}
 
 
 
 
 @app.on_message(filters.command("ytdl"))
 @app.on_message(filters.command("ytdl"))
+@capture_err
 async def ytdl_func(_, message):
 async def ytdl_func(_, message):
     if len(message.command) != 2:
     if len(message.command) != 2:
         await message.reply_text("**Usage:**/ytdl [VIDEO_LINK]")
         await message.reply_text("**Usage:**/ytdl [VIDEO_LINK]")

+ 18 - 15
wbb/utils/inlinefuncs.py

@@ -40,8 +40,10 @@ from pyrogram.types import (InlineKeyboardButton, InlineQueryResultArticle,
 from search_engine_parser import GoogleSearch
 from search_engine_parser import GoogleSearch
 
 
 from wbb import (BOT_USERNAME, MESSAGE_DUMP_CHAT, SUDOERS, USERBOT_ID,
 from wbb import (BOT_USERNAME, MESSAGE_DUMP_CHAT, SUDOERS, USERBOT_ID,
-                 USERBOT_NAME, USERBOT_USERNAME, app, app2, arq, aiohttpsession)
-from wbb.core.types import InlineQueryResultCachedDocument, InlineQueryResultAudio
+                 USERBOT_NAME, USERBOT_USERNAME, aiohttpsession, app, app2,
+                 arq)
+from wbb.core.types import (InlineQueryResultAudio,
+                            InlineQueryResultCachedDocument)
 from wbb.modules.info import get_chat_info, get_user_info
 from wbb.modules.info import get_chat_info, get_user_info
 from wbb.modules.music import download_youtube_audio
 from wbb.modules.music import download_youtube_audio
 from wbb.modules.paste import isPreviewUp
 from wbb.modules.paste import isPreviewUp
@@ -352,11 +354,11 @@ async def shortify(url):
     payload = {"long_url": f"{url}"}
     payload = {"long_url": f"{url}"}
     payload = json.dumps(payload)
     payload = json.dumps(payload)
     async with aiohttpsession.post(
     async with aiohttpsession.post(
-            "https://api-ssl.bitly.com/v4/shorten",
-            headers=header,
-            data=payload,
-        ) as resp:
-            data = await resp.json()
+        "https://api-ssl.bitly.com/v4/shorten",
+        headers=header,
+        data=payload,
+    ) as resp:
+        data = await resp.json()
     msg = data["link"]
     msg = data["link"]
     a = []
     a = []
     b = InlineQueryResultArticle(
     b = InlineQueryResultArticle(
@@ -1078,13 +1080,14 @@ async def randomAudioFunc(answers: list, query: str) -> list:
     url = f"https://www.zedge.net/api-zedge-web/browse/search?query={query}&contentType=ringtones"
     url = f"https://www.zedge.net/api-zedge-web/browse/search?query={query}&contentType=ringtones"
     async with aiohttpsession.get(url) as resp:
     async with aiohttpsession.get(url) as resp:
         data = await resp.json()
         data = await resp.json()
-    items = data['items']
+    items = data["items"]
     answers = [
     answers = [
-            InlineQueryResultAudio(
-                audio_url=audio['audioUrl'],
-                thumb_url="https://tweety.drk1.workers.dev/0:/image_2021-05-22_20-56-47.png",
-                title=audio['title'],
-                mime_type="audio/mp3"
-                ) for audio in items
-            ]
+        InlineQueryResultAudio(
+            audio_url=audio["audioUrl"],
+            thumb_url="https://tweety.drk1.workers.dev/0:/image_2021-05-22_20-56-47.png",
+            title=audio["title"],
+            mime_type="audio/mp3",
+        )
+        for audio in items
+    ]
     return answers
     return answers

+ 1 - 1
wbb/utils/misc.py

@@ -85,7 +85,7 @@ def paginate_modules(page_n, module_dict, prefix, chat=None):
 
 
     # can only have a certain amount of buttons side by side
     # can only have a certain amount of buttons side by side
     if len(pairs) > 7:
     if len(pairs) > 7:
-        pairs = pairs[modulo_page * 7 : 7 * (modulo_page + 1)] + [
+        pairs = pairs[modulo_page * 7: 7 * (modulo_page + 1)] + [
             (
             (
                 EqInlineKeyboardButton(
                 EqInlineKeyboardButton(
                     "<",
                     "<",