52 lines
1.8 KiB
Python
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: тестовое сообщение с сервера")
|