Skip to content

Commit d37a640

Browse files
committed
Добавил варн для питона 3.12
1 parent 075d98c commit d37a640

3 files changed

Lines changed: 32 additions & 7 deletions

File tree

examples/example.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
# client = MaxClient(phone=phone, work_dir="cache")
13-
client = SocketMaxClient(phone=phone, work_dir="cache", send_fake_telemetry=False)
13+
client = SocketMaxClient(phone=phone, work_dir="cache")
1414

1515

1616
async def main() -> None:

src/pymax/core.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,17 @@
77
from pathlib import Path
88
from typing import TYPE_CHECKING, Any
99

10-
import websockets
1110
from typing_extensions import override
1211

13-
from pymax.mixins import self
14-
1512
from .crud import Database
16-
from .exceptions import InvalidPhoneError, WebSocketNotConnectedError
13+
from .exceptions import InvalidPhoneError
1714
from .mixins import ApiMixin, SocketMixin, WebSocketMixin
1815
from .static import Constants
1916
from .types import Channel, Chat, Dialog, Me, Message, User
2017

2118
if TYPE_CHECKING:
19+
import websockets
20+
2221
from .filters import Filter
2322

2423
logger = logging.getLogger(__name__)
@@ -95,6 +94,11 @@ def __init__(
9594
self._on_start_handler: Callable[[], Any | Awaitable[Any]] | None = None
9695
self._background_tasks: set[asyncio.Task[Any]] = set()
9796
self._ssl_context = ssl.create_default_context()
97+
self._ssl_context.set_ciphers("DEFAULT")
98+
self._ssl_context.check_hostname = True
99+
self._ssl_context.verify_mode = ssl.CERT_REQUIRED
100+
self._ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2
101+
self._ssl_context.load_default_certs()
98102
self._socket: socket.socket | None = None
99103
self.logger = logger or logging.getLogger(f"{__name__}.MaxClient")
100104
self._setup_logger()

src/pymax/mixins/socket.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import asyncio
22
import socket
3+
import ssl
4+
import sys
35
from typing import Any
46

57
import lz4.block
@@ -8,7 +10,6 @@
810

911
from pymax.filters import Message
1012
from pymax.interfaces import ClientProtocol
11-
from pymax.mixins import self
1213
from pymax.payloads import BaseWebSocketMessage, SyncPayload
1314
from pymax.static import Opcode
1415
from 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

Comments
 (0)