Улучшен доступ к настройкам: заменён импорт USER_ID на settings, обновлены проверки прав доступа в командах и мидлваре.
This commit is contained in:
+21
-17
@@ -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)
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user