d4rktg 0.5.3__tar.gz → 0.5.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {d4rktg-0.5.3 → d4rktg-0.5.5}/PKG-INFO +1 -1
- d4rktg-0.5.5/VERSION.txt +1 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Handlers/_bot.py +0 -2
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Models/_commands.py +6 -2
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Utils/__init__.py +1 -1
- d4rktg-0.5.5/d4rk/Utils/_decorators.py +72 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Utils/_round.py +33 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rktg.egg-info/PKG-INFO +1 -1
- d4rktg-0.5.3/VERSION.txt +0 -1
- d4rktg-0.5.3/d4rk/Utils/_decorators.py +0 -78
- {d4rktg-0.5.3 → d4rktg-0.5.5}/MANIFEST.in +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/README.rst +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Database/__init__.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Database/db.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Handlers/__init__.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Handlers/_scheduler.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Logs/__init__.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Logs/_logger.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Models/__init__.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Models/_movie_title.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Utils/_delete.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Utils/_fonts.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Utils/_ip.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Utils/_movie_parser.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Utils/_ractions.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/Utils/_terminal.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rk/__init__.py +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rktg.egg-info/SOURCES.txt +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rktg.egg-info/dependency_links.txt +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rktg.egg-info/requires.txt +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/d4rktg.egg-info/top_level.txt +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/requirements.txt +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/setup.cfg +0 -0
- {d4rktg-0.5.3 → d4rktg-0.5.5}/setup.py +0 -0
d4rktg-0.5.5/VERSION.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.5.5
|
@@ -51,8 +51,6 @@ class BotManager(Client):
|
|
51
51
|
if self._loop:asyncio.run_coroutine_threadsafe(coro_func(), self._loop)
|
52
52
|
else:logger.error("Event loop is not set for _safe_async")
|
53
53
|
|
54
|
-
|
55
|
-
|
56
54
|
async def powerup(self,appname):
|
57
55
|
if hasattr(self, "db"):
|
58
56
|
self.font = self.db.Settings.get(key="font",datatype=str)
|
@@ -30,7 +30,7 @@ def reorder_command_registry():
|
|
30
30
|
def get_commands():
|
31
31
|
return command_registry
|
32
32
|
|
33
|
-
def command(command: Union[str, list], description: str):
|
33
|
+
def command(command: Union[str, list], description: str,Custom_filter=None):
|
34
34
|
def decorator(func):
|
35
35
|
command_registry.append({
|
36
36
|
"command": command,
|
@@ -38,7 +38,11 @@ def command(command: Union[str, list], description: str):
|
|
38
38
|
"handler": func
|
39
39
|
})
|
40
40
|
logger.info(f"Registered command: {command} - {description}")
|
41
|
-
|
41
|
+
if Custom_filter:
|
42
|
+
filter = filters.command(command) & Custom_filter
|
43
|
+
else:
|
44
|
+
filter = filters.command(command)
|
45
|
+
@Client.on_message(filter)
|
42
46
|
@wraps(func)
|
43
47
|
async def wrapper(client, message):
|
44
48
|
return await func(client, message)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import os
|
2
|
+
import asyncio
|
3
|
+
import functools
|
4
|
+
|
5
|
+
from typing import Union
|
6
|
+
from pyrogram import Client , filters
|
7
|
+
from d4rk.Logs import setup_logger
|
8
|
+
from pyrogram.types import Message , CallbackQuery , ChatPrivileges
|
9
|
+
|
10
|
+
from ._delete import delete
|
11
|
+
from ._ractions import Reacts
|
12
|
+
from dotenv import load_dotenv
|
13
|
+
load_dotenv()
|
14
|
+
|
15
|
+
logger = setup_logger(__name__)
|
16
|
+
|
17
|
+
OWNER = int(os.getenv("OWNER", 7859877609))
|
18
|
+
|
19
|
+
|
20
|
+
def authorize(
|
21
|
+
sudo=True,
|
22
|
+
admin=False,
|
23
|
+
permission=None,
|
24
|
+
owner_id: int = None
|
25
|
+
):
|
26
|
+
async def func(flt, client: Client, message: Union[Message, CallbackQuery]):
|
27
|
+
try:
|
28
|
+
user = message.from_user
|
29
|
+
if not user:
|
30
|
+
logger.warning(f"Unauthorized access attempt from non-user message: {message}")
|
31
|
+
return False
|
32
|
+
|
33
|
+
me = await client.get_me()
|
34
|
+
is_admin = False
|
35
|
+
|
36
|
+
if admin:
|
37
|
+
if message.chat.type.name.lower() in ["group", "supergroup"]:
|
38
|
+
role = await client.get_chat_member(message.chat.id, user.id)
|
39
|
+
myrole = await client.get_chat_member(message.chat.id, me.id)
|
40
|
+
|
41
|
+
role_status = getattr(role.status, "name", role.status).lower()
|
42
|
+
myrole_status = getattr(myrole.status, "name", myrole.status).lower()
|
43
|
+
|
44
|
+
if role_status in ["creator", "administrator"] and \
|
45
|
+
myrole_status in ["creator", "administrator"]:
|
46
|
+
|
47
|
+
if permission:
|
48
|
+
privileges = getattr(role, "privileges", None)
|
49
|
+
myprivileges = getattr(myrole, "privileges", None)
|
50
|
+
if privileges and myprivileges:
|
51
|
+
has_permission = getattr(privileges, permission, False)
|
52
|
+
has_my_permission = getattr(myprivileges, permission, False)
|
53
|
+
if has_permission and has_my_permission:
|
54
|
+
is_admin = True
|
55
|
+
else:
|
56
|
+
return False
|
57
|
+
else:
|
58
|
+
is_admin = True
|
59
|
+
else:
|
60
|
+
return False
|
61
|
+
|
62
|
+
authorized = (
|
63
|
+
(owner_id and user.id == owner_id)
|
64
|
+
or (sudo and user.id in getattr(client, "sudo_users", []))
|
65
|
+
or is_admin
|
66
|
+
)
|
67
|
+
return bool(authorized)
|
68
|
+
except Exception as e:
|
69
|
+
logger.error(f"Error in authorize filter: {e}")
|
70
|
+
return bool(owner_id and user.id == user.id)
|
71
|
+
|
72
|
+
return filters.create(func, name="AuthorizeFilter")
|
@@ -11,6 +11,39 @@ responded_messages = {}
|
|
11
11
|
# Lock per chat to prevent race conditions
|
12
12
|
chat_locks = {}
|
13
13
|
|
14
|
+
def round():
|
15
|
+
async def func(flt, client: Client, message: Union[Message, CallbackQuery]):
|
16
|
+
chat_id = message.chat.id
|
17
|
+
msg_id = message.id
|
18
|
+
|
19
|
+
if message.chat.type.name.lower() == "private":
|
20
|
+
return True
|
21
|
+
|
22
|
+
if chat_id not in bot_order_per_chat:
|
23
|
+
bot_order_per_chat[chat_id] = [client.me.id]
|
24
|
+
last_index_per_chat[chat_id] = 0
|
25
|
+
responded_messages[chat_id] = set()
|
26
|
+
chat_locks[chat_id] = asyncio.Lock()
|
27
|
+
|
28
|
+
if client.me.id not in bot_order_per_chat[chat_id]:
|
29
|
+
bot_order_per_chat[chat_id].append(client.me.id)
|
30
|
+
|
31
|
+
async with chat_locks[chat_id]:
|
32
|
+
# Skip if message already responded
|
33
|
+
if msg_id in responded_messages[chat_id]:
|
34
|
+
return False
|
35
|
+
|
36
|
+
# Decide which bot should respond
|
37
|
+
current_index = last_index_per_chat[chat_id]
|
38
|
+
selected_bot_id = bot_order_per_chat[chat_id][current_index]
|
39
|
+
|
40
|
+
if client.me.id == selected_bot_id:
|
41
|
+
# Mark message as responded
|
42
|
+
responded_messages[chat_id].add(msg_id)
|
43
|
+
# Rotate for next message
|
44
|
+
last_index_per_chat[chat_id] = (current_index + 1) % len(bot_order_per_chat[chat_id])
|
45
|
+
return True
|
46
|
+
|
14
47
|
def round_robin():
|
15
48
|
def decorator(func):
|
16
49
|
@wraps(func)
|
d4rktg-0.5.3/VERSION.txt
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.5.3
|
@@ -1,78 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import asyncio
|
3
|
-
import functools
|
4
|
-
|
5
|
-
from typing import Union
|
6
|
-
from pyrogram import Client
|
7
|
-
from d4rk.Logs import setup_logger
|
8
|
-
from pyrogram.types import Message , CallbackQuery , ChatPrivileges
|
9
|
-
|
10
|
-
from ._delete import delete
|
11
|
-
from ._ractions import Reacts
|
12
|
-
from dotenv import load_dotenv
|
13
|
-
load_dotenv()
|
14
|
-
|
15
|
-
logger = setup_logger(__name__)
|
16
|
-
|
17
|
-
OWNER = int(os.getenv("OWNER", 7859877609))
|
18
|
-
|
19
|
-
def authorize(sudo=True,admin=False,delete_command=True, react=True,react_emoji:Reacts=Reacts.fire,alert=True,permission=None):
|
20
|
-
def decorator(func):
|
21
|
-
@functools.wraps(func)
|
22
|
-
async def wrapper(client: Client, message: Union[Message,CallbackQuery]):
|
23
|
-
try:
|
24
|
-
user = message.from_user
|
25
|
-
if not user:
|
26
|
-
logger.warning(f"Unauthorized access attempt from non-user message: {message}")
|
27
|
-
me = await client.get_me()
|
28
|
-
is_admin = False
|
29
|
-
if admin:
|
30
|
-
if message.chat.type.name.lower() in ["group","supergroup"]:
|
31
|
-
role = await client.get_chat_member(message.chat.id, user.id)
|
32
|
-
myrole = await client.get_chat_member(message.chat.id, me.id)
|
33
|
-
if (user_admin:= role.status.name.lower() in ["creator", "administrator","owner"]) and (i_am_admin:=myrole.status.name.lower() in ["creator", "administrator","owner"]):
|
34
|
-
if permission:
|
35
|
-
privileges = getattr(role, "privileges", None)
|
36
|
-
myprivileges = getattr(myrole, "privileges", None)
|
37
|
-
if privileges and myprivileges:
|
38
|
-
has_permission = getattr(privileges, permission, False)
|
39
|
-
has_my_permission = getattr(myprivileges, permission, False)
|
40
|
-
if has_permission and has_my_permission:
|
41
|
-
is_admin = True
|
42
|
-
else:
|
43
|
-
msg = ""
|
44
|
-
if not has_permission and not has_my_permission:msg = f"❌ Neither you nor I "
|
45
|
-
elif not has_permission:msg = f"❌ You don't"
|
46
|
-
elif not has_my_permission:msg = f"❌ I don't"
|
47
|
-
msg += f" have the required permission: `{permission}`."
|
48
|
-
return await client.send_alert(message=message,text=msg)
|
49
|
-
else:is_admin = True
|
50
|
-
else:
|
51
|
-
if alert:
|
52
|
-
return await client.send_alert(message=message,text="❌ This command can only be used in groups.")
|
53
|
-
|
54
|
-
authorized = user.id == OWNER or (sudo and user.id in client.sudo_users) or is_admin
|
55
|
-
if react and isinstance(message, Message):
|
56
|
-
try:await message.react(react_emoji)
|
57
|
-
except:pass
|
58
|
-
|
59
|
-
if not authorized:
|
60
|
-
logger.warning(f"Unauthorized {func.__name__} request from user {user.id} @{user.username}")
|
61
|
-
if alert:
|
62
|
-
m = await client.send_alert(message=message,text="❌ Unauthorized access.")
|
63
|
-
if react and isinstance(message, Message):
|
64
|
-
await message.react(Reacts.shit)
|
65
|
-
if m:await delete(client, message.chat.id, m.id, timeout=5)
|
66
|
-
|
67
|
-
else:
|
68
|
-
logger.info(f"Authorized user {user.id} executing {func.__name__}")
|
69
|
-
await func(client, message)
|
70
|
-
if delete_command:
|
71
|
-
try:await delete(client, message.chat.id, message.id, timeout=5)
|
72
|
-
except:pass
|
73
|
-
except Exception as e:
|
74
|
-
logger.error(f"Error in {func.__name__}: {e}")
|
75
|
-
return
|
76
|
-
return wrapper
|
77
|
-
return decorator
|
78
|
-
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|