feat: Добавлен отдельный метод исполнения Sq кода
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user