Пол пользователя
This commit is contained in:
@@ -13,6 +13,7 @@ from src.database import (
|
||||
get_or_create_user,
|
||||
get_replicas_for_track,
|
||||
get_scenario,
|
||||
get_scenario_genders,
|
||||
get_scenario_stats,
|
||||
get_stats,
|
||||
get_user_audio_duration,
|
||||
@@ -20,6 +21,7 @@ from src.database import (
|
||||
get_user_stats,
|
||||
get_users_in_state,
|
||||
get_users_with_scenario,
|
||||
update_user_gender,
|
||||
upsert_user_session,
|
||||
)
|
||||
from src.decorators import answer_callback, require_state, with_user_and_session
|
||||
@@ -40,6 +42,10 @@ INTRO_TEXT = """👋 Добро пожаловать!
|
||||
|
||||
Нажмите кнопку ниже, чтобы начать."""
|
||||
|
||||
SPECIFY_GENDER_TEXT = """👤 Укажите ваш пол.
|
||||
|
||||
Это необходимо для подбора подходящих сценариев для озвучивания."""
|
||||
|
||||
NO_MORE_SCENARIOS_TEXT = """📭 Пока нет доступных сценариев для озвучивания.
|
||||
|
||||
Вы получите уведомление, когда появятся новые сценарии."""
|
||||
@@ -82,6 +88,15 @@ def get_intro_keyboard() -> InlineKeyboardMarkup:
|
||||
)
|
||||
|
||||
|
||||
def get_specify_gender_keyboard() -> InlineKeyboardMarkup:
|
||||
return InlineKeyboardMarkup(
|
||||
[
|
||||
[InlineKeyboardButton("👨 Мужской", callback_data="select_gender:male")],
|
||||
[InlineKeyboardButton("👩 Женский", callback_data="select_gender:female")],
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def get_show_replica_keyboard() -> InlineKeyboardMarkup:
|
||||
return InlineKeyboardMarkup(
|
||||
[
|
||||
@@ -343,6 +358,27 @@ async def handle_accept_intro(
|
||||
) -> None:
|
||||
"""Обработчик кнопки 'Принять и продолжить'."""
|
||||
query = update.callback_query
|
||||
session.state = UserState.SPECIFY_GENDER
|
||||
await query.edit_message_text(
|
||||
SPECIFY_GENDER_TEXT, reply_markup=get_specify_gender_keyboard()
|
||||
)
|
||||
session.last_bot_message_id = query.message.message_id
|
||||
upsert_user_session(session)
|
||||
|
||||
|
||||
@answer_callback
|
||||
@with_user_and_session
|
||||
@require_state(UserState.SPECIFY_GENDER)
|
||||
async def handle_select_gender(
|
||||
update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, session: UserSession
|
||||
) -> None:
|
||||
"""Обработчик выбора пола."""
|
||||
query = update.callback_query
|
||||
gender = query.data.replace("select_gender:", "")
|
||||
|
||||
update_user_gender(user.id, gender)
|
||||
user.gender = gender
|
||||
|
||||
track = find_available_track(user.id)
|
||||
|
||||
if not track:
|
||||
@@ -355,7 +391,10 @@ async def handle_accept_intro(
|
||||
session.speaker_id = speaker_id
|
||||
session.replica_index = 0
|
||||
await query.edit_message_text(format_first_replica(session))
|
||||
logger.info(f"User {user.id} started track {scenario_id}/{speaker_id}")
|
||||
logger.info(
|
||||
f"User {user.id} selected gender {gender}, "
|
||||
f"started track {scenario_id}/{speaker_id}"
|
||||
)
|
||||
|
||||
session.last_bot_message_id = query.message.message_id
|
||||
upsert_user_session(session)
|
||||
@@ -559,6 +598,10 @@ async def handle_exit_admin(
|
||||
# Показываем соответствующее сообщение
|
||||
if session.state == UserState.INTRO:
|
||||
await query.edit_message_text(INTRO_TEXT, reply_markup=get_intro_keyboard())
|
||||
elif session.state == UserState.SPECIFY_GENDER:
|
||||
await query.edit_message_text(
|
||||
SPECIFY_GENDER_TEXT, reply_markup=get_specify_gender_keyboard()
|
||||
)
|
||||
elif session.state == UserState.NO_MORE_SCENARIOS:
|
||||
await query.edit_message_text(NO_MORE_SCENARIOS_TEXT)
|
||||
elif session.state == UserState.FIRST_REPLICA:
|
||||
@@ -605,30 +648,37 @@ async def handle_confirm_upload(
|
||||
|
||||
del context.user_data["pending_scenario"]
|
||||
|
||||
# Получаем полы, представленные в новом сценарии
|
||||
scenario_genders = get_scenario_genders(pending["id"])
|
||||
|
||||
# Уведомляем и переводим пользователей в NO_MORE_SCENARIOS на новый сценарий
|
||||
for waiting_user_id in get_users_in_state(UserState.NO_MORE_SCENARIOS):
|
||||
try:
|
||||
with get_connection() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT telegram_id FROM users WHERE id = ?", (waiting_user_id,)
|
||||
"SELECT telegram_id, gender FROM users WHERE id = ?",
|
||||
(waiting_user_id,),
|
||||
).fetchone()
|
||||
if row:
|
||||
waiting_session = get_user_session(waiting_user_id)
|
||||
if waiting_session:
|
||||
track = find_available_track(waiting_user_id)
|
||||
if track:
|
||||
scenario_id, speaker_id = track
|
||||
waiting_session.state = UserState.FIRST_REPLICA
|
||||
waiting_session.scenario_id = scenario_id
|
||||
waiting_session.speaker_id = speaker_id
|
||||
waiting_session.replica_index = 0
|
||||
upsert_user_session(waiting_session)
|
||||
user_gender = row[1]
|
||||
# Уведомляем только если пол пользователя представлен в сценарии
|
||||
if user_gender and user_gender in scenario_genders:
|
||||
waiting_session = get_user_session(waiting_user_id)
|
||||
if waiting_session:
|
||||
track = find_available_track(waiting_user_id)
|
||||
if track:
|
||||
scenario_id, speaker_id = track
|
||||
waiting_session.state = UserState.FIRST_REPLICA
|
||||
waiting_session.scenario_id = scenario_id
|
||||
waiting_session.speaker_id = speaker_id
|
||||
waiting_session.replica_index = 0
|
||||
upsert_user_session(waiting_session)
|
||||
|
||||
msg = (
|
||||
f"🎉 Появился новый сценарий!\n\n"
|
||||
f"{format_first_replica(waiting_session)}"
|
||||
)
|
||||
await context.bot.send_message(row[0], msg)
|
||||
msg = (
|
||||
f"🎉 Появился новый сценарий!\n\n"
|
||||
f"{format_first_replica(waiting_session)}"
|
||||
)
|
||||
await context.bot.send_message(row[0], msg)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
Reference in New Issue
Block a user