import os import sys from typing import Optional from dotenv import load_dotenv from database.async_db import AsyncBotDB from helper_bot.utils.s3_storage import S3StorageService 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() self._init_s3_storage() 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")), } self.settings["S3"] = { "enabled": self._parse_bool(os.getenv("S3_ENABLED", "false")), "endpoint_url": os.getenv("S3_ENDPOINT_URL", ""), "access_key": os.getenv("S3_ACCESS_KEY", ""), "secret_key": os.getenv("S3_SECRET_KEY", ""), "bucket_name": os.getenv("S3_BUCKET_NAME", ""), "region": os.getenv("S3_REGION", "us-east-1"), } def _init_s3_storage(self): """Инициализирует S3StorageService если S3 включен.""" self.s3_storage = None if self.settings["S3"]["enabled"]: s3_config = self.settings["S3"] if ( s3_config["endpoint_url"] and s3_config["access_key"] and s3_config["secret_key"] and s3_config["bucket_name"] ): self.s3_storage = S3StorageService( endpoint_url=s3_config["endpoint_url"], access_key=s3_config["access_key"], secret_key=s3_config["secret_key"], bucket_name=s3_config["bucket_name"], region=s3_config["region"], ) 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 def get_s3_storage(self) -> Optional[S3StorageService]: """Возвращает S3StorageService если S3 включен, иначе None.""" return self.s3_storage _global_instance = None def get_global_instance(): """Возвращает глобальный экземпляр BaseDependencyFactory.""" global _global_instance if _global_instance is None: _global_instance = BaseDependencyFactory() return _global_instance