Files
TDATA-Checker/modules/checker.py
T

172 lines
6.1 KiB
Python

import logging
from dataclasses import dataclass
from phonenumbers import parse, geocoder
from typing import List, Optional
from telethon.types import User, Chat, Channel
from telethon.tl.functions.payments import GetStarsStatusRequest
from telethon.tl.functions.contacts import GetContactsRequest
from modules.tdata import TDATA
logger = logging.getLogger(__name__)
# Unified Result class
@dataclass
class Result:
valid: bool
error: Optional[str] = None
me: Optional[User] = None
stars: Optional[int] = None
country: Optional[str] = None
contacts: Optional[List[User]] = None
chats: Optional[List[Chat]] = None
channels: Optional[List[Channel]] = None
admin_channels: Optional[List[Channel]] = None
class Checker:
def __init__(self, path: str):
self.path = path
self.client = None
logger.info(f"Инициализация проверки для пути: {path}")
try:
self.desktop = TDATA(path=self.path)
except Exception as e:
logger.error(f"Ошибка инициализации TDATA: {e}")
self.desktop = None
async def __aenter__(self):
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
if self.client:
logger.debug("Отключение клиента Telethon")
try:
await self.client.disconnect()
except:
pass
async def _ensure_client(self):
"""Обеспечение инициализации клиента перед операцией"""
if self.client is None:
if self.desktop is None:
raise Exception("TDATA не инициализирована")
logger.debug("Инициализация клиента Telethon из TDATA")
self.client = await self.desktop.convert()
async def validate(self) -> Result:
"""Валидация TDATA"""
try:
if self.desktop is None:
return Result(valid=False, error="TDATA не инициализирована")
if not await self.desktop.validate():
return Result(valid=False, error="TDATA невалидна или пуста")
await self._ensure_client()
me = await self.client.get_me()
if not me:
return Result(
valid=False, error="Не удалось получить информацию о пользователе"
)
return Result(valid=True, me=me)
except Exception as e:
logger.error(f"Ошибка валидации: {e}")
return Result(valid=False, error=str(e))
async def check_all(self) -> Result:
"""Полная проверка аккаунта"""
try:
# Сначала валидация
validation = await self.validate()
if not validation.valid:
return validation
me = validation.me
logger.debug(f"Пользователь: {me.first_name} (+{me.phone})")
# Собираем данные с обработкой ошибок
stars = None
country = None
contacts = None
chats = None
channels = None
admin_channels = None
try:
stars_status = await self.client(GetStarsStatusRequest(peer=me))
stars = stars_status.balance.amount
except Exception as e:
logger.warning(f"Не удалось получить баланс звезд: {e}")
try:
phone_parse = parse(str(f"+{me.phone}"))
country = geocoder.description_for_number(phone_parse, "ru")
except Exception as e:
logger.warning(f"Не удалось определить страну: {e}")
try:
logger.debug("Получение контактов")
result = await self.client(GetContactsRequest(hash=0))
contacts = result.users
except Exception as e:
logger.warning(f"Не удалось получить контакты: {e}")
try:
logger.debug("Получение всех диалогов")
chats = []
async for dialog in self.client.iter_dialogs():
chats.append(dialog.entity)
except Exception as e:
logger.warning(f"Не удалось получить чаты: {e}")
if chats:
try:
channels = [chat for chat in chats if isinstance(chat, Channel)]
except Exception as e:
logger.warning(f"Не удалось отфильтровать каналы: {e}")
try:
logger.debug("Проверка прав администратора")
admin_channels = []
for chat in chats:
if isinstance(chat, Channel):
try:
permissions = await self.client.get_permissions(
chat, "me"
)
if permissions.is_admin or permissions.is_creator:
admin_channels.append(chat)
except:
pass
except Exception as e:
logger.warning(f"Не удалось проверить админские права: {e}")
return Result(
valid=True,
me=me,
stars=stars,
country=country,
contacts=contacts,
chats=chats,
channels=channels,
admin_channels=admin_channels,
)
except Exception as e:
logger.error(f"Критическая ошибка при проверке: {e}")
return Result(valid=False, error=str(e))
class MassChecker:
def __init__(self):
pass