|
import os
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
|
|
from telethon import TelegramClient
|
|
|
|
|
|
@dataclass
|
|
class ValidationResult:
|
|
is_valid: bool
|
|
is_error: bool = False
|
|
message: str = ''
|
|
|
|
|
|
class Validator:
|
|
env_vars = ['API_ID', 'API_HASH', 'PHONE_NUMBER']
|
|
|
|
@staticmethod
|
|
def validate_env_file(env_filename: str = '.env') -> ValidationResult:
|
|
if not Path(env_filename).is_file():
|
|
log_msg = 'Отсутвует файл .env'
|
|
return ValidationResult(is_valid=False, message=log_msg)
|
|
return ValidationResult(is_valid=True)
|
|
|
|
@staticmethod
|
|
def validate_env_var(var_name: str, error_msg: str | None = None) -> ValidationResult:
|
|
if os.getenv(var_name) is None:
|
|
return ValidationResult(is_valid=False, message=error_msg)
|
|
return ValidationResult(is_valid=True)
|
|
|
|
@classmethod
|
|
def validate_env_id(cls) -> ValidationResult:
|
|
return cls.validate_env_var('API_ID', 'Отсутствует переменная API_ID')
|
|
|
|
@classmethod
|
|
def validate_env_hash(cls) -> ValidationResult:
|
|
return cls.validate_env_var('API_HASH', 'Отсутствует переменная API_HASH')
|
|
|
|
@classmethod
|
|
def validate_env_phone_number(cls) -> ValidationResult:
|
|
return cls.validate_env_var('PHONE_NUMBER', 'Отсутствует переменная PHONE_NUMBER')
|
|
|
|
@classmethod
|
|
def validate_env_vars(cls) -> ValidationResult:
|
|
if all([cls.validate_env_var(var).is_valid for var in cls.env_vars]):
|
|
return ValidationResult(is_valid=True)
|
|
return ValidationResult(is_valid=False)
|
|
|
|
@staticmethod
|
|
async def validate_auth(client: TelegramClient) -> ValidationResult:
|
|
try:
|
|
if not client.is_connected():
|
|
await client.connect()
|
|
is_user_authorized = await client.is_user_authorized()
|
|
if not is_user_authorized:
|
|
log_msg = 'Клиент не авторизован'
|
|
return ValidationResult(is_valid=False, message=log_msg)
|
|
return ValidationResult(is_valid=True)
|
|
except Exception as ex:
|
|
log_msg = f'Ошибка при подключении клиента, код ошибки: {ex}'
|
|
return ValidationResult(is_valid=False, is_error=True, message=log_msg)
|
|
finally:
|
|
if client.is_connected():
|
|
await client.disconnect() |