import os import sys from dotenv import load_dotenv from database.async_db import AsyncBotDB class BaseDependencyFactory: def __init__(self): project_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) env_path = os.path.join(project_dir, '.env') if os.path.exists(env_path): load_dotenv(env_path) self.settings = {} database_path = os.getenv('DATABASE_PATH', 'database/tg-bot-database.db') if not os.path.isabs(database_path): database_path = os.path.join(project_dir, database_path) self.database = AsyncBotDB(database_path) self._load_settings_from_env() def _load_settings_from_env(self): """Загружает настройки из переменных окружения.""" self.settings['Telegram'] = { 'bot_token': os.getenv('BOT_TOKEN', ''), 'listen_bot_token': os.getenv('LISTEN_BOT_TOKEN', ''), 'test_bot_token': os.getenv('TEST_BOT_TOKEN', ''), 'preview_link': self._parse_bool(os.getenv('PREVIEW_LINK', 'false')), 'main_public': os.getenv('MAIN_PUBLIC', ''), 'group_for_posts': self._parse_int(os.getenv('GROUP_FOR_POSTS', '0')), 'group_for_message': self._parse_int(os.getenv('GROUP_FOR_MESSAGE', '0')), 'group_for_logs': self._parse_int(os.getenv('GROUP_FOR_LOGS', '0')), 'important_logs': self._parse_int(os.getenv('IMPORTANT_LOGS', '0')), 'archive': self._parse_int(os.getenv('ARCHIVE', '0')), 'test_group': self._parse_int(os.getenv('TEST_GROUP', '0')) } self.settings['Settings'] = { 'logs': self._parse_bool(os.getenv('LOGS', 'false')), 'test': self._parse_bool(os.getenv('TEST', 'false')) } self.settings['Metrics'] = { 'host': os.getenv('METRICS_HOST', '0.0.0.0'), 'port': self._parse_int(os.getenv('METRICS_PORT', '8080')) } def _parse_bool(self, value: str) -> bool: """Парсит строковое значение в boolean.""" return value.lower() in ('true', '1', 'yes', 'on') def _parse_int(self, value: str) -> int: """Парсит строковое значение в integer.""" try: return int(value) except (ValueError, TypeError): return 0 def get_settings(self): return self.settings def get_db(self) -> AsyncBotDB: """Возвращает подключение к базе данных.""" return self.database _global_instance = None def get_global_instance(): """Возвращает глобальный экземпляр BaseDependencyFactory.""" global _global_instance if _global_instance is None: _global_instance = BaseDependencyFactory() return _global_instance