File size: 4,140 Bytes
3fc8928 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# <============================================== IMPORTS =========================================================>
from functools import wraps
from time import time
from traceback import format_exc as err
from pyrogram.enums import ChatMembersFilter
from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden
from pyrogram.types import Message
from Mikobot import DRAGONS, app
# <=======================================================================================================>
# <================================================ FUNCTION =======================================================>
async def member_permissions(chat_id: int, user_id: int):
perms = []
member = (await app.get_chat_member(chat_id, user_id)).privileges
if not member:
return []
if member.can_post_messages:
perms.append("can_post_messages")
if member.can_edit_messages:
perms.append("can_edit_messages")
if member.can_delete_messages:
perms.append("can_delete_messages")
if member.can_restrict_members:
perms.append("can_restrict_members")
if member.can_promote_members:
perms.append("can_promote_members")
if member.can_change_info:
perms.append("can_change_info")
if member.can_invite_users:
perms.append("can_invite_users")
if member.can_pin_messages:
perms.append("can_pin_messages")
if member.can_manage_video_chats:
perms.append("can_manage_video_chats")
return perms
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.MESSAGE))
except AttributeError:
await message.reply_text(str(e))
e = err()
print(str(e))
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 and message.sender_chat.id == message.chat.id:
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 DRAGONS and permission not in permissions:
return await unauthorised(message, permission, subFunc2)
return await authorised(func, subFunc2, client, message, *args, **kwargs)
return subFunc2
return subFunc
admins_in_chat = {}
async def list_admins(chat_id: int):
global admins_in_chat
if chat_id in admins_in_chat:
interval = time() - admins_in_chat[chat_id]["last_updated_at"]
if interval < 3600:
return admins_in_chat[chat_id]["data"]
admins_in_chat[chat_id] = {
"last_updated_at": time(),
"data": [
member.user.id
async for member in app.get_chat_members(
chat_id, filter=ChatMembersFilter.ADMINISTRATORS
)
],
}
return admins_in_chat[chat_id]["data"]
# <================================================ END =======================================================>
|