Files
tg2max-relay/app/maxapi.py
T

52 lines
1.8 KiB
Python

"""Тонкая обёртка над vkmax (unofficial user-client MAX), переживающая разрывы WS."""
from __future__ import annotations
import asyncio
import logging
from vkmax.client import MaxClient
from vkmax.functions.messages import send_file as vk_send_file
from vkmax.functions.messages import send_message as vk_send_message
log = logging.getLogger("relay.maxapi")
class MaxUser:
def __init__(self, device_id: str, login_token: str) -> None:
self.device_id = device_id
self.login_token = login_token
self._client: MaxClient | None = None
async def _new_client(self) -> MaxClient:
await self.close()
client = MaxClient()
await client.connect()
await client.login_by_token(self.login_token, self.device_id)
self._client = client
log.info("MAX: вход выполнен (device=%s)", self.device_id[:8])
return client
async def ensure(self) -> MaxClient:
if self._client is None or self._client._connection is None:
return await self._new_client()
return self._client
async def close(self) -> None:
if self._client is not None:
try:
await self._client.disconnect()
except Exception:
pass
self._client = None
async def send_text(self, chat_id: int, text: str) -> None:
client = await self.ensure()
await asyncio.wait_for(vk_send_message(client, chat_id, text), 150)
async def send_pdf(self, chat_id: int, path, caption: str) -> None:
client = await self.ensure()
await asyncio.wait_for(vk_send_file(client, chat_id, str(path), caption), 300)
async def test_send(self, chat_id: int) -> None:
await self.send_text(chat_id, "🟢 tg2max-relay: тестовое сообщение с сервера")