From a13238dc6e0606a78278adfdb864ca74d5d55918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A7=D0=B5=D1=80=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BA=D0=BE?= Date: Thu, 23 Apr 2026 14:56:40 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent.py | 43 +++++++++++++++++++++++-------------------- app.py | 7 +------ 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/agent.py b/agent.py index 95cfe4f..c1fb435 100644 --- a/agent.py +++ b/agent.py @@ -18,6 +18,7 @@ POLL_INTERVAL = 3 REQUEST_TIMEOUT = 3 RECONNECT_DELAY = 5 + def read_vmix_dynamic_values(): try: resp = requests.get(VMIX_API, timeout=REQUEST_TIMEOUT) @@ -55,6 +56,7 @@ def read_vmix_dynamic_values(): "operator_login": None, } + def execute_vmix_command(path: str): path = str(path or "").strip() if not path.startswith("/api/"): @@ -76,52 +78,55 @@ def execute_vmix_command(path: str): "error": str(e), } -async def wait_for_session(): + +async def wait_for_routing(): while True: data = read_vmix_dynamic_values() - if data["ok"] and data["session_token"]: + if data["ok"] and data["match_id"] is not None and data["operator_login"]: return data - print("[agent] waiting for vMix session...", data) + print("[agent] waiting for match_id + operator_login...", data) await asyncio.sleep(POLL_INTERVAL) -def build_ws_url(session_token: str, match_id: int | None, group_name: str | None, operator_login: str | None): + +def build_ws_url(match_id: int, group_name: str | None, operator_login: str): params = { "client_id": CLIENT_ID, - "session_token": session_token, + "match_id": match_id, + "operator_name": operator_login, } - if match_id is not None: - params["match_id"] = match_id if group_name: params["group_name"] = group_name - if operator_login: - params["operator_name"] = operator_login return f"{WS_BASE}?{urlencode(params)}" + async def ping_loop(ws): while True: await asyncio.sleep(15) await ws.send(json.dumps({"type": "ping"})) + async def run_agent(): - current_session = None current_match_id = None current_group_name = None current_operator_login = None while True: - vmix_data = await wait_for_session() + vmix_data = await wait_for_routing() - session_token = vmix_data["session_token"] match_id = vmix_data["match_id"] group_name = vmix_data["group_name"] operator_login = vmix_data["operator_login"] - if current_session != session_token: - print(f"[agent] found session: {session_token}") - current_session = session_token + if current_match_id != match_id or current_operator_login != operator_login or current_group_name != group_name: + print( + f"[agent] routing: match_id={match_id}, operator_login={operator_login}, group_name={group_name}" + ) + current_match_id = match_id + current_group_name = group_name + current_operator_login = operator_login - ws_url = build_ws_url(session_token, match_id, group_name, operator_login) + ws_url = build_ws_url(match_id, group_name, operator_login) try: async with websockets.connect(ws_url, ping_interval=None, max_size=2**20) as ws: @@ -130,7 +135,6 @@ async def run_agent(): await ws.send(json.dumps({ "type": "register", "client_id": CLIENT_ID, - "session_token": session_token, "match_id": match_id, "group_name": group_name, "operator_name": operator_login, @@ -140,7 +144,6 @@ async def run_agent(): try: while True: - # следим, не сменился ли проект/session в vMix latest = read_vmix_dynamic_values() if latest["ok"]: latest_match_id = latest.get("match_id") @@ -167,7 +170,6 @@ async def run_agent(): await ws.send(json.dumps({ "type": "vmix_result", "client_id": CLIENT_ID, - "session_token": session_token, "match_id": match_id, "operator_name": operator_login, "results": results, @@ -181,5 +183,6 @@ async def run_agent(): await asyncio.sleep(RECONNECT_DELAY) + if __name__ == "__main__": - asyncio.run(run_agent()) \ No newline at end of file + asyncio.run(run_agent()) diff --git a/app.py b/app.py index 51039f1..dcd001b 100644 --- a/app.py +++ b/app.py @@ -229,13 +229,12 @@ class VmixConnectionManager: except Exception: await self.disconnect(client_id) return False - + async def send_to_match( self, match_id: int, message: dict, target_group: str | None = None, - session_token: str | None = None, target_login: str | None = None, ): async with self.lock: @@ -249,8 +248,6 @@ class VmixConnectionManager: continue if target_login and conn.get("operator_name") != target_login: continue - if session_token and conn.get("session_token") != session_token: - continue matched.append(conn["client_id"]) results = [] @@ -1625,7 +1622,6 @@ async def publish_vmix_command(payload: PublishVmixCommandPayload, request: Requ message = { "type": "vmix_command", "match_id": payload.match_id, - "session_token": payload.session_token, "commands": commands, "target_login": payload.target_login, "meta": payload.meta or {}, @@ -1640,7 +1636,6 @@ async def publish_vmix_command(payload: PublishVmixCommandPayload, request: Requ match_id=payload.match_id, message=message, target_group=payload.target_group, - session_token=payload.session_token, target_login=payload.target_login, )