From 304c44ba0435beca77ea2d38b0378275eb723037 Mon Sep 17 00:00:00 2001 From: AURUMVORXX Date: Sat, 8 Nov 2025 00:25:00 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20Sq=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/server/main.nut | 3 ++- include/server/messages.nut | 2 +- src/pyg2o/server.py | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/include/server/main.nut b/include/server/main.nut index 6495e80..8149acc 100644 --- a/include/server/main.nut +++ b/include/server/main.nut @@ -54,6 +54,7 @@ class PyG2O if (!_silent) print("[PyG2O] Successfully connected to " + url); + _send({"event": "register_server"}); _send({"event": "init_temp_tokens", "token": _clientTokens}); } @@ -73,7 +74,7 @@ class PyG2O { local request = JSON.parse_ansi(message); if (!("uuid" in request) || - !("data" in request)) + !("code" in request)) return; _message_call.bindenv(this)(request); diff --git a/include/server/messages.nut b/include/server/messages.nut index 8ac269b..0fffa5a 100644 --- a/include/server/messages.nut +++ b/include/server/messages.nut @@ -1,7 +1,7 @@ function _message_call(data) { - local compile_string = "try { " + data["data"] + " } catch(id) { print(\"[PyG2O] Error white executing the code: \" + id); return null; }"; + local compile_string = "try { " + data["code"] + " } catch(id) { print(\"[PyG2O] Error white executing the code: \" + id); return null; }"; local result = compilestring(compile_string)(); _send({"event": "sq_response", "uuid": data["uuid"], "data": result}); } diff --git a/src/pyg2o/server.py b/src/pyg2o/server.py index b252e03..5edf977 100644 --- a/src/pyg2o/server.py +++ b/src/pyg2o/server.py @@ -22,6 +22,7 @@ class Server: _logger: loguru.Logger = loguru.logger _static_tokens: list[str] = [] _temp_tokens: list[str] = [] + _server_connection: WebSocket | None = None _registered_clients: dict[int, list] = {} _requests: WeakValueDictionary[str, asyncio.Future] = WeakValueDictionary() _topics = TopicWeakDict() @@ -74,6 +75,21 @@ class Server: except ValueError: cls._logger.exception('message должен быть типа dict') + @classmethod + def sq_execute(cls, code: str) -> asyncio.Future | None: + if cls._server_connection is None: + return + + request, data = cls._make_request() + data['code'] = code + data = json.dumps(data) + + # Меняем синтаксис под Squirrel + data = data.replace("'", '\\"').replace('True', 'true').replace('False', 'false') + + asyncio.create_task(cls._server_connection.send_text(data)) + return request + @classmethod def _make_request(cls): request_id = str(uuid4()) @@ -128,6 +144,8 @@ class Server: cls._logger.exception(f'Ошибка декодирования JSON: {e}') except WebSocketDisconnect: cls._logger.info('WebSocket клиент отключился') + playerid = next((key for key, values in cls._registered_clients.items() if connection in values), None) + if playerid is not None: cls._registered_clients[playerid].remove(connection) except WebSocketException as e: cls._logger.exception(f'Ошибка WebSocket подключения: {e}') @@ -168,6 +186,10 @@ class Server: except KeyError: cls._registered_clients[playerid] = [connection] + case {'event': 'register_server'}: + if cls._server_connection is None: + cls._server_connection = connection + case {'event': 'sq_response', 'uuid': uuid, 'data': data}: try: cls._requests[uuid].set_result(data)