File size: 2,513 Bytes
89dd8f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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()