diff --git a/src/scenarios.py b/src/scenarios.py index f71dd6b..4c581b2 100644 --- a/src/scenarios.py +++ b/src/scenarios.py @@ -4,6 +4,7 @@ from pathlib import Path from src.config import DATA_DIR, DATA_PARTIAL_DIR from src.database import ( + UserState, create_replicas, create_scenario, get_connection, @@ -12,6 +13,16 @@ from src.database import ( ) from src.logger import logger +# Состояния, в которых пользователь активно работает с дорожкой +_RECORDING_STATES = ( + UserState.FIRST_REPLICA.value, + UserState.SHOW_REPLICA.value, + UserState.CONFIRM_RESTART.value, + UserState.CONFIRM_SAVE.value, + UserState.ASK_REPLICA_NUMBER.value, + UserState.REPEAT_REPLICA.value, +) + def load_scenario_from_json(scenario_id: str, json_data: list[dict]) -> int: """Загружает сценарий из JSON. Возвращает количество реплик.""" @@ -135,6 +146,22 @@ def find_available_track(user_id: int) -> tuple[str, int] | None: track_recordings[key] = {} track_recordings[key][row[2]] = row[3] + # Дорожки, назначенные другим пользователям через активные сессии + placeholders = ",".join("?" * len(_RECORDING_STATES)) + session_rows = conn.execute( + f""" + SELECT scenario_id, speaker_id FROM user_sessions + WHERE user_id != ? + AND scenario_id IS NOT NULL + AND speaker_id IS NOT NULL + AND state IN ({placeholders}) + """, + (user_id, *_RECORDING_STATES), + ).fetchall() + assigned_tracks: set[tuple[str, int]] = { + (row[0], row[1]) for row in session_rows + } + # Категоризация дорожек untouched: list[tuple[str, int]] = [] # никто не начал in_progress: list[tuple[str, int]] = [] # начато, не закончено @@ -154,7 +181,10 @@ def find_available_track(user_id: int) -> tuple[str, int] | None: continue if key not in track_recordings: - untouched.append(key) + if key in assigned_tracks: + in_progress.append(key) + else: + untouched.append(key) else: has_complete = any( count == replica_count for count in track_recordings[key].values()