From 6d1d0276b9efb3420b5b5efed5f24055ca4f5317 Mon Sep 17 00:00:00 2001 From: AURUMVORXX Date: Tue, 26 Aug 2025 18:27:10 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D1=82=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pyg2o/server_v3.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/pyg2o/server_v3.py b/src/pyg2o/server_v3.py index 06a8d79..72f7b56 100644 --- a/src/pyg2o/server_v3.py +++ b/src/pyg2o/server_v3.py @@ -1,5 +1,7 @@ import json import logging +import asyncio +from weakref import WeakValueDictionary from fastapi import WebSocket, FastAPI, Depends, HTTPException, WebSocketDisconnect, WebSocketException from fastapi.security import HTTPBasic, HTTPBasicCredentials from uuid import uuid4 @@ -17,7 +19,36 @@ class Server: self._logger.addHandler(logging.NullHandler()) self._server_connection: WebSocket | None = None + self._requests: WeakValueDictionary[str, asyncio.Future] = WeakValueDictionary() self._register_routes(app) + + async def server_call(self, message: str): + return await self._call(self._server_connection, message) + + async def _call(self, socket: WebSocket | None, message: str): + if socket is None: + raise ConnectionError('PyG2O сервер не подключен') + + request, data = self._make_request() + data['data'] = message + data = json.dumps(data) + # Меняем синтаксис под Squirrel + data = data.replace("'", '\\"').replace('True', 'true').replace('False', 'false') + + await socket.send_text(message) + return request + + def _make_request(self): + request_id = str(uuid4()) + request = asyncio.Future() + self._requests[request_id] = request + + data = { + 'uuid': request_id, + 'data': None, + } + + return request, data def _register_routes(self, app): @app.get('/pyg2o/auth') @@ -94,9 +125,9 @@ class Server: async def _process_server_message(self, message: dict): match message: - case {'type': 'message', 'uuid': id, 'data': data}: + case {'uuid': id, 'data': data}: ... - case {'type': 'event', 'uuid': id, 'data': data}: + case {'data': data}: ... case _: raise ValueError(f'Неподдерживаемый тип PyG2O Server сообщения: {message}')