d4rktg 1.2.4__py3-none-any.whl → 1.2.6__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/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, scheduler , FontMessageMixin
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']