11import asyncio
22import socket
3+ import ssl
4+ import sys
35from typing import Any
46
57import lz4 .block
810
911from pymax .filters import Message
1012from pymax .interfaces import ClientProtocol
11- from pymax .mixins import self
1213from pymax .payloads import BaseWebSocketMessage , SyncPayload
1314from pymax .static import Opcode
1415from pymax .types import Channel , Chat , Dialog , Me
@@ -69,6 +70,15 @@ def _pack_packet(
6970
7071 async def _connect (self , user_agent : dict [str , Any ]) -> dict [str , Any ]:
7172 try :
73+ if sys .version_info [:2 ] == (3 , 12 ):
74+ self .logger .warning (
75+ """
76+ ===============================================================
77+ ⚠️⚠️ \033 [0;31mWARNING: Python 3.12 detected!\033 [0m ⚠️⚠️
78+ Socket connections may be unstable, SSL issues are possible.
79+ ===============================================================
80+ """
81+ )
7282 self .logger .info ("Connecting to socket %s:%s" , self .host , self .port )
7383 loop = asyncio .get_running_loop ()
7484 raw_sock = await loop .run_in_executor (
@@ -108,7 +118,6 @@ async def _recv_loop(self) -> None:
108118 self .logger .warning ("Recv loop started without socket instance" )
109119 return
110120
111- self .logger .warning (">>> Recv loop started (socket)" )
112121 loop = asyncio .get_running_loop ()
113122
114123 def _recv_exactly (n : int ) -> bytes :
@@ -283,6 +292,8 @@ async def _send_and_wait(
283292 cmd : int = 0 ,
284293 timeout : float = 10.0 ,
285294 ) -> dict [str , Any ]:
295+ if not self .is_connected or self ._socket is None :
296+ raise ConnectionError ("Socket not connected" )
286297 sock = self .sock
287298 msg = self ._make_message (opcode , payload , cmd )
288299 loop = asyncio .get_running_loop ()
@@ -303,11 +314,21 @@ async def _send_and_wait(
303314 data .get ("opcode" ),
304315 )
305316 return data
317+
318+ except (ssl .SSLEOFError , ssl .SSLError , ConnectionError ):
319+ self .logger .warning ("Connection lost, reconnecting..." )
320+ self .is_connected = False
321+ try :
322+ await self ._connect (self .user_agent )
323+ except Exception :
324+ self .logger .error ("Reconnect failed" , exc_info = True )
325+ raise
306326 except Exception :
307327 self .logger .exception (
308328 "Send and wait failed (opcode=%s, seq=%s)" , opcode , msg ["seq" ]
309329 )
310330 raise RuntimeError ("Send and wait failed (socket)" )
331+
311332 finally :
312333 self ._pending .pop (msg ["seq" ], None )
313334
0 commit comments