d4rktg 1.2.4__py3-none-any.whl → 1.2.5__py3-none-any.whl
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.
- d4rk/Database/db.py +1 -2
- d4rk/Handlers/__init__.py +2 -2
- d4rk/Handlers/_bot.py +31 -123
- d4rk/Handlers/_logger_bot.py +88 -0
- d4rk/Utils/_decorators.py +1 -15
- d4rk/Utils/_filters.py +7 -13
- d4rk/Utils/_movie_parser.py +2 -2
- d4rk/Web/__init__.py +4 -0
- d4rk/Web/web.py +201 -0
- d4rk/Web/web_server.py +52 -0
- d4rk/__init__.py +15 -2
- d4rk/_base.py +115 -0
- d4rk/_bot_manager.py +507 -0
- d4rk/errors/__init__.py +19 -0
- d4rk/errors/base.py +16 -0
- d4rk/errors/bot.py +33 -0
- d4rk/errors/config.py +17 -0
- d4rk/errors/database.py +22 -0
- {d4rktg-1.2.4.dist-info → d4rktg-1.2.5.dist-info}/METADATA +1 -1
- d4rktg-1.2.5.dist-info/RECORD +33 -0
- d4rk/Handlers/_scheduler.py +0 -33
- d4rktg-1.2.4.dist-info/RECORD +0 -23
- {d4rktg-1.2.4.dist-info → d4rktg-1.2.5.dist-info}/WHEEL +0 -0
- {d4rktg-1.2.4.dist-info → d4rktg-1.2.5.dist-info}/top_level.txt +0 -0
d4rk/Web/web_server.py
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# src/Web/web_server.py
|
2
|
+
|
3
|
+
from typing import Literal
|
4
|
+
|
5
|
+
from pyrogram import Client
|
6
|
+
|
7
|
+
from aiohttp import web
|
8
|
+
from aiohttp.web_runner import AppRunner
|
9
|
+
|
10
|
+
from d4rk.Logs import setup_logger
|
11
|
+
from d4rk.Utils import get_public_ip, check_public_ip_reachable
|
12
|
+
|
13
|
+
from d4rk.Web.web import _web_server
|
14
|
+
WEB_APP = 'http://localhost'
|
15
|
+
|
16
|
+
logger = setup_logger("WebServerManager")
|
17
|
+
|
18
|
+
class WebServerManager:
|
19
|
+
def __init__(self,bot:Client=None) -> None:
|
20
|
+
self._web_runner = None
|
21
|
+
self._tcp_site = None
|
22
|
+
self._web_port = None
|
23
|
+
self._bot = bot
|
24
|
+
|
25
|
+
async def setup_web_server(self, preferred_port=8443) -> AppRunner | Literal[False]:
|
26
|
+
try:
|
27
|
+
self._web_port = preferred_port
|
28
|
+
logger.info(f'Starting API server on port {preferred_port}...')
|
29
|
+
|
30
|
+
self._web_runner = web.AppRunner(await _web_server(self._bot))
|
31
|
+
await self._web_runner.setup()
|
32
|
+
self._tcp_site = web.TCPSite(self._web_runner, "0.0.0.0", preferred_port)
|
33
|
+
await self._tcp_site.start()
|
34
|
+
if WEB_APP:
|
35
|
+
if 'localhost' in WEB_APP:logger.info(f"Web app is running on http://localhost:{preferred_port}")
|
36
|
+
else:logger.info(f"Web app is running on {WEB_APP}")
|
37
|
+
else:
|
38
|
+
myIP = get_public_ip()
|
39
|
+
if await check_public_ip_reachable(myIP):logger.info(f"Web app running on http://{myIP}:{preferred_port}")
|
40
|
+
else:logger.info(f"Web app running on http://localhost:{preferred_port}")
|
41
|
+
return self._web_runner
|
42
|
+
except Exception as e:
|
43
|
+
logger.error(f"Failed to setup web server: {e}")
|
44
|
+
return False
|
45
|
+
|
46
|
+
async def cleanup(self) -> None:
|
47
|
+
if self._web_runner:
|
48
|
+
await self._web_runner.cleanup()
|
49
|
+
logger.info("Web server cleaned up")
|
50
|
+
|
51
|
+
|
52
|
+
|
d4rk/__init__.py
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
from .Database import db
|
2
|
-
from .Handlers import BotManager
|
2
|
+
from .Handlers import BotManager , FontMessageMixin
|
3
3
|
from .Logs import setup_logger , get_timezone_offset
|
4
4
|
from .Utils import *
|
5
|
+
from ._base import TGBase
|
6
|
+
from ._bot_manager import D4RK_BotManager
|
7
|
+
from . import errors
|
5
8
|
|
6
|
-
__version__ = "0.9.7"
|
9
|
+
__version__ = "0.9.7"
|
10
|
+
__all__ = [
|
11
|
+
"TGBase",
|
12
|
+
"D4RK_BotManager",
|
13
|
+
"db",
|
14
|
+
"errors",
|
15
|
+
"FontMessageMixin",
|
16
|
+
"setup_logger",
|
17
|
+
"get_timezone_offset",
|
18
|
+
"BotManager",
|
19
|
+
]
|
d4rk/_base.py
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
import sys
|
2
|
+
import signal
|
3
|
+
import asyncio
|
4
|
+
|
5
|
+
from pyrogram import Client
|
6
|
+
|
7
|
+
from d4rk.Logs import setup_logger
|
8
|
+
from d4rk.Handlers import BotManager, FontMessageMixin , LoggerBotUtil
|
9
|
+
|
10
|
+
logger = setup_logger("TGBase")
|
11
|
+
|
12
|
+
class TGBase(FontMessageMixin, BotManager, Client):
|
13
|
+
def __init__(self,
|
14
|
+
api_id: int = None,
|
15
|
+
api_hash: str = None,
|
16
|
+
token: str = None,
|
17
|
+
app_name: str = None,
|
18
|
+
plugins: dict = None,
|
19
|
+
database_url: str = None,
|
20
|
+
log_chat_id: int = None,
|
21
|
+
owner_id: int = None,
|
22
|
+
web_app_url: str = None,
|
23
|
+
web_server_manager = None,
|
24
|
+
rename: bool = False,
|
25
|
+
logger_bot_util: LoggerBotUtil = None) -> None:
|
26
|
+
|
27
|
+
self.api_id = api_id
|
28
|
+
self.api_hash = api_hash
|
29
|
+
self.token = token
|
30
|
+
self.app_name = app_name
|
31
|
+
self.plugins = plugins
|
32
|
+
self.database_url = database_url
|
33
|
+
self.log_chat_id = log_chat_id
|
34
|
+
self.owner_id = owner_id
|
35
|
+
self.web_app_url = web_app_url
|
36
|
+
self.web_server_manager = web_server_manager
|
37
|
+
self._rename = rename
|
38
|
+
self.logger_bot_util = logger_bot_util
|
39
|
+
self.start_message = ""
|
40
|
+
self.start_message_id = None
|
41
|
+
self.start_message_chat_id = None
|
42
|
+
self._is_connected = False
|
43
|
+
|
44
|
+
super().__init__(
|
45
|
+
name=self.app_name,
|
46
|
+
api_id=self.api_id,
|
47
|
+
api_hash=self.api_hash,
|
48
|
+
bot_token=self.token,
|
49
|
+
plugins=self.plugins,
|
50
|
+
in_memory=True
|
51
|
+
)
|
52
|
+
|
53
|
+
def run(self):
|
54
|
+
"""Run single bot - simple blocking call"""
|
55
|
+
signal.signal(signal.SIGINT, self._signal_handler)
|
56
|
+
signal.signal(signal.SIGTERM, self._signal_handler)
|
57
|
+
|
58
|
+
try:
|
59
|
+
loop = asyncio.get_event_loop()
|
60
|
+
except RuntimeError:
|
61
|
+
loop = asyncio.new_event_loop()
|
62
|
+
asyncio.set_event_loop(loop)
|
63
|
+
|
64
|
+
try:
|
65
|
+
loop.run_until_complete(self._run_async())
|
66
|
+
except KeyboardInterrupt:
|
67
|
+
logger.info("Received interrupt signal, stopping bot...")
|
68
|
+
loop.run_until_complete(self._stop_single_bot())
|
69
|
+
|
70
|
+
def _signal_handler(self, signum, frame):
|
71
|
+
"""Handle shutdown signals"""
|
72
|
+
logger.info(f"Received signal {signum}, stopping bot...")
|
73
|
+
sys.exit(0)
|
74
|
+
|
75
|
+
async def _run_async(self):
|
76
|
+
"""Internal async method to run single bot"""
|
77
|
+
await self._send_startup_message()
|
78
|
+
await self._start_single_bot()
|
79
|
+
try:
|
80
|
+
while True:
|
81
|
+
await asyncio.sleep(5)
|
82
|
+
except Exception as e:
|
83
|
+
logger.error(f"Error in bot operation: {e}")
|
84
|
+
finally:
|
85
|
+
await self._stop_single_bot()
|
86
|
+
|
87
|
+
async def _send_startup_message(self):
|
88
|
+
"""Send startup message using logger bot if available"""
|
89
|
+
if self.logger_bot_util and self.log_chat_id:
|
90
|
+
try:
|
91
|
+
logger.info("Sending startup message via logger bot...")
|
92
|
+
await self.logger_bot_util.send_log_message(
|
93
|
+
chat_id=self.log_chat_id,
|
94
|
+
message=f"🚀 Starting bot {self.app_name}..."
|
95
|
+
)
|
96
|
+
except Exception as e:
|
97
|
+
logger.error(f"Failed to send startup message: {e}")
|
98
|
+
|
99
|
+
async def _start_single_bot(self):
|
100
|
+
"""Start this single bot instance"""
|
101
|
+
await self.powerup(self.app_name)
|
102
|
+
|
103
|
+
async def _stop_single_bot(self):
|
104
|
+
"""Stop this single bot instance"""
|
105
|
+
try:
|
106
|
+
if hasattr(self, '_is_connected') and self._is_connected:
|
107
|
+
await self.powerdown()
|
108
|
+
await asyncio.sleep(2)
|
109
|
+
logger.info(f"Bot instance {self.app_name} stopped successfully")
|
110
|
+
else:
|
111
|
+
logger.info(f"Bot instance {self.app_name} was not running, skipping stop")
|
112
|
+
except Exception as e:
|
113
|
+
logger.error(f"Error stopping bot instance {self.app_name}: {e}")
|
114
|
+
|
115
|
+
__all__ = ['TGBase']
|