Karma commited on
Commit
3fc8928
·
1 Parent(s): f3c7238

Create permissions.py

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