diff --git a/src/config.py b/src/config.py index 231bcc0..15fd88f 100644 --- a/src/config.py +++ b/src/config.py @@ -1,34 +1,38 @@ +from typing import Any + from pydantic import Field, ValidationError from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): - """App settings loaded from environment, но может быть переопределён через параметры.""" + """App settings loaded from environment (или .env), но могут быть переопределены через параметры.""" - TOKEN: str = Field(default='default_value', description='Токен Telegram-бота') + TOKEN: str = Field(default='0', description='Токен Telegram-бота') USER_ID: int = Field(default=0, description='ID пользователя для доступа') model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8') -def get_settings(token: str = None, user_id: int = None) -> Settings: - """Возвращает объект Settings, приоритет: параметры > env/.env""" +# Стартовая загрузка настроек — попытается взять переменные из среды или .env + +settings: Settings = Settings() + + +def get_settings(token: str | None = None, user_id: int | None = None) -> Settings: + """Возвращает новый объект Settings. Приоритет: параметры > env > .env.""" try: - if token is not None or user_id is not None: - # Переопределяем только если явно передано - data = {} - if token is not None: - data['TOKEN'] = token - if user_id is not None: - data['USER_ID'] = user_id + data: dict[str, Any] = {} + if token is not None: + data['TOKEN'] = token + if user_id is not None: + data['USER_ID'] = user_id + if data: return Settings(**data) return Settings() except ValidationError as exc: - msg = f'Ошибка валидации настроек: {exc}' - raise RuntimeError(msg) from exc + raise RuntimeError(f'Ошибка валидации настроек: {exc}') from exc -# Для обратной совместимости: -settings = get_settings() -TOKEN: str = settings.TOKEN -USER_ID: str = str(settings.USER_ID) +def set_settings(token: str | None = None, user_id: int | None = None) -> Settings: + """Возвращает новый объект settings с обновлёнными параметрами.""" + return get_settings(token=token, user_id=user_id) diff --git a/src/handlers/commands.py b/src/handlers/commands.py index e72f46a..2625dd5 100644 --- a/src/handlers/commands.py +++ b/src/handlers/commands.py @@ -7,7 +7,7 @@ from aiogram.enums import ParseMode from aiogram.filters import Command from aiogram.types import Message -from src.config import USER_ID +from src.config import settings from src.utils.system import execute_command, get_cpu_temperature router = Router() @@ -56,7 +56,7 @@ async def cmd_execute(message: Message) -> None: """Команда /c <команда> - выполняет указанную команду на сервере и возвращает результат.""" global current_directory user_id = message.from_user.id if message.from_user else 'Unknown' - if str(user_id) != str(USER_ID): + if str(user_id) != str(settings.USER_ID): await message.answer('❌ У вас нет прав для использования этого бота.') return @@ -78,7 +78,7 @@ async def cmd_sysinfo(message: Message) -> None: """Sysinfo - Показать информацию о системе, включая имя хоста, ОС и количество ядер CPU.""" """Команда /sysinfo - выводит информацию о системе, включая имя хоста, ОС и количество ядер CPU.""" user_id = message.from_user.id if message.from_user else 'Unknown' - if str(user_id) != str(USER_ID): + if str(user_id) != str(settings.USER_ID): await message.answer('❌ У вас нет прав для использования этого бота.') return logging.info(f'Пользователь {user_id} выполнил команду /sysinfo') diff --git a/src/middlewares/access.py b/src/middlewares/access.py index 5243e95..a402f17 100644 --- a/src/middlewares/access.py +++ b/src/middlewares/access.py @@ -4,7 +4,7 @@ from typing import Any from aiogram.dispatcher.middlewares.base import BaseMiddleware from aiogram.types import Message, TelegramObject -from src.config import USER_ID +from src.config import settings class AccessMiddleware(BaseMiddleware): @@ -21,7 +21,7 @@ class AccessMiddleware(BaseMiddleware): if event.from_user is None: return None - if str(event.from_user.id) != USER_ID: + if str(event.from_user.id) != str(settings.USER_ID): await event.answer('❌ У вас нет прав для использования этого бота.') return None