This commit is contained in:
2026-02-03 10:20:43 +03:00
parent 007d700a8e
commit 011f7be20f
4 changed files with 225 additions and 24 deletions

View File

@@ -15,7 +15,9 @@ from src.database import (
get_scenario,
get_scenario_stats,
get_stats,
get_user_audio_duration,
get_user_session,
get_user_stats,
get_users_in_state,
get_users_with_scenario,
upsert_user_session,
@@ -253,13 +255,17 @@ def format_replica_message(session: UserSession) -> str:
def format_admin_stats() -> str:
"""Форматирует статистику для админки."""
from src.audio import format_duration
stats = get_stats()
duration_str = format_duration(stats["total_duration"])
return f"""📊 Статистика датасета:
📁 Сценарии: {stats["total_scenarios"]}
🎵 Дорожки: {stats["total_tracks"]} (завершено: {stats["completed_tracks"]})
💬 Реплики: {stats["total_replicas"]}
🎙 Записей: {stats["total_recordings"]}
📁 Сценарии: {stats["completed_scenarios"]}/{stats["total_scenarios"]} завершено
🎵 Дорожки: {stats["completed_tracks"]}/{stats["total_tracks"]} озвучено
💬 Реплики: {stats["total_recordings"]}/{stats["total_replicas"]} записано
⏱ Объём: {duration_str}
👥 Пользователей: {stats["total_users"]}
Отправьте JSON-файл с новым сценарием для загрузки."""
@@ -434,9 +440,28 @@ async def handle_save_track(
) -> None:
"""Обработчик сохранения дорожки."""
query = update.callback_query
from src.scenarios import move_track_to_data
from src.audio import format_duration
from src.scenarios import is_scenario_complete, move_scenario_to_data
# Переносим файлы только когда весь сценарий озвучен
if is_scenario_complete(session.scenario_id):
move_scenario_to_data(session.scenario_id)
# Получаем статистику пользователя
stats = get_user_stats(user.id)
duration = get_user_audio_duration(user.id)
duration_str = format_duration(duration)
# Формируем сообщение с благодарностью и статистикой
thanks_msg = f"""✅ Дорожка сохранена!
🙏 Спасибо за вашу работу!
📊 Ваша статистика:
• Озвучено реплик: {stats["total_replicas"]}
• Завершено дорожек: {stats["completed_tracks"]}
• Общее время записи: {duration_str}"""
move_track_to_data(user.id, session.scenario_id, session.speaker_id)
track = find_available_track(user.id)
if not track:
@@ -444,9 +469,7 @@ async def handle_save_track(
session.scenario_id = None
session.speaker_id = None
session.replica_index = None
await query.edit_message_text(
f"✅ Дорожка сохранена!\n\n{NO_MORE_SCENARIOS_TEXT}"
)
await query.edit_message_text(f"{thanks_msg}\n\n{NO_MORE_SCENARIOS_TEXT}")
else:
scenario_id, speaker_id = track
session.state = UserState.FIRST_REPLICA
@@ -455,7 +478,7 @@ async def handle_save_track(
session.replica_index = 0
replica_text = get_current_replica_text(session)
await query.edit_message_text(
f"✅ Дорожка сохранена!\n\n{FIRST_REPLICA_INSTRUCTIONS}\n\n{replica_text}"
f"{thanks_msg}\n\n{FIRST_REPLICA_INSTRUCTIONS}\n\n{replica_text}"
)
logger.info(
f"User {user.id} saved track, started new: {scenario_id}/{speaker_id}"
@@ -806,9 +829,18 @@ async def handle_voice_message(
"""Обработчик голосовых сообщений."""
from src.audio import save_voice_message
# Получаем реальный replica_index из таблицы replicas (индекс в сценарии)
replicas = get_replicas_for_track(session.scenario_id, session.speaker_id)
real_replica_index = replicas[session.replica_index].replica_index
voice = update.message.voice
await save_voice_message(
context.bot, voice.file_id, user.id, session.scenario_id, session.replica_index
context.bot,
voice.file_id,
user.id,
session.scenario_id,
real_replica_index,
voice.duration,
)
track_length = get_track_length(session.scenario_id, session.speaker_id)