2222from .interfaces import BaseClient
2323from .mixins import ApiMixin , SocketMixin , WebSocketMixin
2424from .payloads import UserAgentPayload
25- from .static .constant import (
26- HOST ,
27- PORT ,
28- WEBSOCKET_URI ,
29- )
25+ from .static .constant import HOST , PORT , SESSION_STORAGE_DB , WEBSOCKET_URI
3026
3127if TYPE_CHECKING :
3228 from collections .abc import Callable
4238
4339
4440class MaxClient (ApiMixin , WebSocketMixin , BaseClient ):
41+ allowed_device_types : set [str ] = {"WEB" }
4542 """
4643 Основной клиент для работы с WebSocket API сервиса Max.
4744
@@ -81,7 +78,8 @@ def __init__(
8178 self ,
8279 phone : str ,
8380 uri : str = WEBSOCKET_URI ,
84- headers : UserAgentPayload = UserAgentPayload (),
81+ session_name : str = SESSION_STORAGE_DB ,
82+ headers : UserAgentPayload | None = None ,
8583 token : str | None = None ,
8684 send_fake_telemetry : bool = True ,
8785 host : str = HOST ,
@@ -120,7 +118,7 @@ def __init__(
120118 self ._users : dict [int , User ] = {}
121119
122120 self ._work_dir : str = work_dir
123- self ._database_path : Path = Path (work_dir ) / "session.db"
121+ self ._database_path : Path = Path (work_dir ) / session_name
124122 self ._database_path .parent .mkdir (parents = True , exist_ok = True )
125123 self ._database_path .touch (exist_ok = True )
126124 self ._database = Database (self ._work_dir )
@@ -143,7 +141,10 @@ def __init__(
143141 self ._file_upload_waiters : dict [int , asyncio .Future [dict [str , Any ]]] = {}
144142
145143 self ._token = self ._database .get_auth_token () or token
144+ if headers is None :
145+ headers = self ._default_headers ()
146146 self .user_agent = headers
147+ self ._validate_device_type ()
147148 self ._send_fake_telemetry : bool = send_fake_telemetry
148149 self ._session_id : int = int (time .time () * 1000 )
149150 self ._action_id : int = 1
@@ -181,6 +182,17 @@ def __init__(
181182 self ._work_dir ,
182183 )
183184
185+ @staticmethod
186+ def _default_headers () -> UserAgentPayload :
187+ return UserAgentPayload (device_type = "WEB" )
188+
189+ def _validate_device_type (self ) -> None :
190+ if self .user_agent .device_type not in self .allowed_device_types :
191+ raise ValueError (
192+ f"{ self .__class__ .__name__ } does not support "
193+ f"device_type={ self .user_agent .device_type } "
194+ )
195+
184196 async def _wait_forever (self ) -> None :
185197 try :
186198 await self .ws .wait_closed ()
@@ -267,7 +279,6 @@ async def start(self) -> None:
267279 :return: None
268280 :rtype: None
269281 """
270-
271282 self .logger .info ("Client starting" )
272283 while not self ._stop_event .is_set ():
273284 try :
@@ -318,6 +329,12 @@ async def start(self) -> None:
318329
319330
320331class SocketMaxClient (SocketMixin , MaxClient ):
332+ allowed_device_types = {"ANDROID" , "IOS" , "DESKTOP" }
333+
334+ @staticmethod
335+ def _default_headers () -> UserAgentPayload :
336+ return UserAgentPayload (device_type = "DESKTOP" )
337+
321338 @override
322339 async def _wait_forever (self ):
323340 if self ._recv_task :
0 commit comments