fix: add safe_edit_message to prevent BadRequest errors

Добавлена helper-функция safe_edit_message, которая игнорирует ошибку
'Message is not modified' при повторном редактировании сообщений с тем же
содержимым. Все обработчики удаления сценариев используют эту функцию.
This commit is contained in:
2026-02-02 23:01:05 +03:00
parent d0445d4480
commit 0ae290c81f

View File

@@ -202,6 +202,16 @@ async def remove_previous_keyboard(
pass pass
async def safe_edit_message(
query, text: str, reply_markup: InlineKeyboardMarkup | None = None
) -> None:
"""Безопасно редактирует сообщение, игнорируя ошибку 'Message is not modified'."""
try:
await query.edit_message_text(text, reply_markup=reply_markup)
except Exception:
pass # Сообщение уже такое же или другая ошибка
async def send_message_and_save( async def send_message_and_save(
update: Update, update: Update,
context: ContextTypes.DEFAULT_TYPE, context: ContextTypes.DEFAULT_TYPE,
@@ -625,19 +635,16 @@ async def handle_delete_scenario_list(
scenarios = get_all_scenarios() scenarios = get_all_scenarios()
if not scenarios: if not scenarios:
await query.edit_message_text( await safe_edit_message(
query,
"📭 Нет сценариев для удаления.\n\n" + format_admin_stats(), "📭 Нет сценариев для удаления.\n\n" + format_admin_stats(),
reply_markup=get_admin_keyboard(), get_admin_keyboard(),
) )
return return
try: await safe_edit_message(
await query.edit_message_text( query, "🗑 Выберите сценарий для удаления:", get_admin_delete_list_keyboard()
"🗑 Выберите сценарий для удаления:",
reply_markup=get_admin_delete_list_keyboard(),
) )
except Exception:
pass # Сообщение уже такое же
session.last_bot_message_id = query.message.message_id session.last_bot_message_id = query.message.message_id
upsert_user_session(session) upsert_user_session(session)
@@ -667,9 +674,7 @@ async def handle_select_scenario_delete(
Пользователи, озвучивающие этот сценарий, будут перенаправлены.""" Пользователи, озвучивающие этот сценарий, будут перенаправлены."""
session.state = UserState.ADMIN_DELETE_CONFIRM session.state = UserState.ADMIN_DELETE_CONFIRM
await query.edit_message_text( await safe_edit_message(query, text, get_admin_delete_confirm_keyboard())
text, reply_markup=get_admin_delete_confirm_keyboard()
)
session.last_bot_message_id = query.message.message_id session.last_bot_message_id = query.message.message_id
upsert_user_session(session) upsert_user_session(session)
@@ -685,7 +690,7 @@ async def handle_confirm_delete(
scenario_id = context.user_data.get("pending_delete_scenario") scenario_id = context.user_data.get("pending_delete_scenario")
if not scenario_id: if not scenario_id:
await query.edit_message_text("❌ Данные потеряны. Попробуйте снова.") await safe_edit_message(query, "❌ Данные потеряны. Попробуйте снова.")
session.state = UserState.ADMIN session.state = UserState.ADMIN
upsert_user_session(session) upsert_user_session(session)
return return
@@ -734,10 +739,11 @@ async def handle_confirm_delete(
pass pass
session.state = UserState.ADMIN session.state = UserState.ADMIN
await query.edit_message_text( await safe_edit_message(
query,
f"✅ Сценарий {scenario_id} удалён! (файлов: {deleted_files})\n\n" f"✅ Сценарий {scenario_id} удалён! (файлов: {deleted_files})\n\n"
+ format_admin_stats(), + format_admin_stats(),
reply_markup=get_admin_keyboard(), get_admin_keyboard(),
) )
session.last_bot_message_id = query.message.message_id session.last_bot_message_id = query.message.message_id
upsert_user_session(session) upsert_user_session(session)
@@ -754,9 +760,7 @@ async def handle_cancel_delete(
query = update.callback_query query = update.callback_query
context.user_data.pop("pending_delete_scenario", None) context.user_data.pop("pending_delete_scenario", None)
session.state = UserState.ADMIN session.state = UserState.ADMIN
await query.edit_message_text( await safe_edit_message(query, format_admin_stats(), get_admin_keyboard())
format_admin_stats(), reply_markup=get_admin_keyboard()
)
session.last_bot_message_id = query.message.message_id session.last_bot_message_id = query.message.message_id
upsert_user_session(session) upsert_user_session(session)
@@ -769,9 +773,7 @@ async def handle_cancel_delete_list(
) -> None: ) -> None:
"""Отмена выбора сценария для удаления.""" """Отмена выбора сценария для удаления."""
query = update.callback_query query = update.callback_query
await query.edit_message_text( await safe_edit_message(query, format_admin_stats(), get_admin_keyboard())
format_admin_stats(), reply_markup=get_admin_keyboard()
)
session.last_bot_message_id = query.message.message_id session.last_bot_message_id = query.message.message_id
upsert_user_session(session) upsert_user_session(session)