chore: add ruff and ty, fix linting

- Add ruff (line-length 88) and ty to dev dependencies
- Fix all ruff linting errors
- Configure ty to ignore nullable type warnings
- Update AGENTS.md with linting instructions
This commit is contained in:
2026-02-02 21:43:08 +03:00
parent 52dce1b2b8
commit fc3f438cbf
8 changed files with 141 additions and 38 deletions

View File

@@ -26,9 +26,11 @@ INTRO_TEXT = """👋 Добро пожаловать!
Это бот для сбора датасета озвученных реплик совещаний.
Вы будете озвучивать реплики участников совещаний. Каждая дорожка — это реплики одного участника в рамках одного совещания.
Вы будете озвучивать реплики участников совещаний.
Каждая дорожка — это реплики одного участника в рамках одного совещания.
📋 Отправляя голосовые сообщения, вы соглашаетесь с тем, что они будут использованы в исследовательских целях для обучения моделей машинного обучения.
📋 Отправляя голосовые сообщения, вы соглашаетесь с тем, что они будут
использованы в исследовательских целях для обучения моделей машинного обучения.
Нажмите кнопку ниже, чтобы начать."""
@@ -201,6 +203,13 @@ def get_track_length(scenario_id: str, speaker_id: int) -> int:
return len(get_replicas_for_track(scenario_id, speaker_id))
def format_replica_message(session: UserSession) -> str:
"""Форматирует сообщение с репликой."""
replica_text = get_current_replica_text(session)
header = SHOW_REPLICA_TEXT.format(num=session.replica_index + 1)
return f"{header}\n\n{replica_text}"
def format_admin_stats() -> str:
"""Форматирует статистику для админки."""
stats = get_stats()
@@ -314,8 +323,7 @@ async def handle_rerecord_previous(
replica_text = get_current_replica_text(session)
await query.edit_message_text(f"{FIRST_REPLICA_INSTRUCTIONS}\n\n{replica_text}")
else:
replica_text = get_current_replica_text(session)
text = f"{SHOW_REPLICA_TEXT.format(num=session.replica_index + 1)}\n\n{replica_text}"
text = format_replica_message(session)
await query.edit_message_text(text, reply_markup=get_show_replica_keyboard())
session.last_bot_message_id = query.message.message_id
@@ -371,10 +379,7 @@ async def handle_cancel_restart(
"""Обработчик отмены рестарта."""
query = update.callback_query
session.state = UserState.SHOW_REPLICA
replica_text = get_current_replica_text(session)
text = (
f"{SHOW_REPLICA_TEXT.format(num=session.replica_index + 1)}\n\n{replica_text}"
)
text = format_replica_message(session)
await query.edit_message_text(text, reply_markup=get_show_replica_keyboard())
session.last_bot_message_id = query.message.message_id
upsert_user_session(session)
@@ -430,10 +435,7 @@ async def handle_rerecord_last(
track_length = get_track_length(session.scenario_id, session.speaker_id)
session.state = UserState.SHOW_REPLICA
session.replica_index = track_length - 1
replica_text = get_current_replica_text(session)
text = (
f"{SHOW_REPLICA_TEXT.format(num=session.replica_index + 1)}\n\n{replica_text}"
)
text = format_replica_message(session)
await query.edit_message_text(text, reply_markup=get_show_replica_keyboard())
session.last_bot_message_id = query.message.message_id
upsert_user_session(session)
@@ -497,8 +499,7 @@ async def handle_exit_admin(
replica_text = get_current_replica_text(session)
await query.edit_message_text(f"{FIRST_REPLICA_INSTRUCTIONS}\n\n{replica_text}")
elif session.state == UserState.SHOW_REPLICA:
replica_text = get_current_replica_text(session)
text = f"{SHOW_REPLICA_TEXT.format(num=session.replica_index + 1)}\n\n{replica_text}"
text = format_replica_message(session)
await query.edit_message_text(text, reply_markup=get_show_replica_keyboard())
elif session.state == UserState.CONFIRM_SAVE:
await query.edit_message_text(
@@ -547,10 +548,8 @@ async def handle_confirm_upload(
"SELECT telegram_id FROM users WHERE id = ?", (waiting_user_id,)
).fetchone()
if row:
await context.bot.send_message(
row[0],
"🎉 Появился новый сценарий для озвучивания! Используйте /start для продолжения.",
)
msg = "🎉 Появился новый сценарий! Используйте /start"
await context.bot.send_message(row[0], msg)
except Exception:
pass
@@ -619,8 +618,7 @@ async def handle_voice_message(
)
else:
session.state = UserState.SHOW_REPLICA
replica_text = get_current_replica_text(session)
text = f"{SHOW_REPLICA_TEXT.format(num=session.replica_index + 1)}\n\n{replica_text}"
text = format_replica_message(session)
msg_id = await send_message_and_save(
update, context, session, text, get_show_replica_keyboard()
)
@@ -631,7 +629,10 @@ async def handle_voice_message(
@with_user_and_session
async def handle_replica_number_input(
update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, session: UserSession | None
update: Update,
context: ContextTypes.DEFAULT_TYPE,
user: User,
session: UserSession | None,
) -> None:
"""Обработчик ввода номера реплики."""
if not session or session.state != UserState.ASK_REPLICA_NUMBER:
@@ -715,14 +716,21 @@ VOICE_EXPECTED_TEXT = "❌ Пожалуйста, отправьте голосо
@with_user_and_session
async def handle_unexpected_text(
update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, session: UserSession | None
update: Update,
context: ContextTypes.DEFAULT_TYPE,
user: User,
session: UserSession | None,
) -> None:
"""Обработчик неожиданных текстовых сообщений."""
if not session:
await update.message.reply_text("Используйте /start для начала работы с ботом.")
return
voice_states = {UserState.FIRST_REPLICA, UserState.SHOW_REPLICA, UserState.REPEAT_REPLICA}
voice_states = {
UserState.FIRST_REPLICA,
UserState.SHOW_REPLICA,
UserState.REPEAT_REPLICA,
}
if session.state in voice_states:
await update.message.reply_text(VOICE_EXPECTED_TEXT)
# В других состояниях игнорируем текст (например, INTRO, NO_MORE_SCENARIOS)