feat: Добавлен отдельный метод исполнения Sq кода

This commit is contained in:
AURUMVORXX
2025-11-08 00:25:00 +05:00
parent 4b03e6fac8
commit 304c44ba04
3 changed files with 25 additions and 2 deletions

View File

@@ -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)