From 85947754c7a0070e68ffc360d8d550d1794c00cc Mon Sep 17 00:00:00 2001 From: mirivlad Date: Fri, 27 Feb 2026 19:20:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D1=8F=D1=8E=D1=82=D1=81=D1=8F=20=D1=81?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=83=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B6=D0=B0=D1=82=D0=B8=D1=8F,=20=D0=BE=D0=B6?= =?UTF-8?q?=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B5=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Qwen-Coder --- bot/handlers/callbacks.py | 12 +++++++-- bot/utils/formatters.py | 55 ++++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/bot/handlers/callbacks.py b/bot/handlers/callbacks.py index 14a5822..a1e1301 100644 --- a/bot/handlers/callbacks.py +++ b/bot/handlers/callbacks.py @@ -56,7 +56,11 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): state = state_manager.get(user_id) state.waiting_for_output_control = False state.continue_output = True - await query.answer(f"▶️ Продолжаем вывод (осталось {remaining} сообщений)") + # Сразу удаляем сообщение с кнопками + try: + await query.delete_message() + except: + pass return elif callback == "cancel_output": @@ -64,7 +68,11 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): state = state_manager.get(user_id) state.waiting_for_output_control = False state.continue_output = False - await query.answer("❌ Вывод отменен") + # Сразу удаляем сообщение с кнопками + try: + await query.delete_message() + except: + pass return elif callback == "preset_menu": diff --git a/bot/utils/formatters.py b/bot/utils/formatters.py index d0425dc..3483f23 100644 --- a/bot/utils/formatters.py +++ b/bot/utils/formatters.py @@ -157,6 +157,7 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p - Если блок кода не влезает — отправляется без Markdown - Нумерация (1/N), (2/N) только если сообщений > 1 - КАЖДЫЕ pause_every сообщений — пауза с кнопками "Продолжить" / "Отменить" + - Ждём нажатия кнопки бесконечно, не продолжаем автоматически Args: update: Telegram update @@ -183,7 +184,7 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p # Проверяем нужно ли открыть блок в начале этого сообщения if i > 0 and not parts[i-1][3]: # предыдущее не закрыло блок part = "```\n" + part - + # Проверяем нужно ли закрыть блок в конце этого сообщения if i < total - 1 and not code_closed: # Следующее сообщение не начинается с ``` — закрываем блок @@ -217,7 +218,7 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p InlineKeyboardButton("❌ Отменить", callback_data="cancel_output") ] ]) - + wait_msg = await update.message.reply_text( f"📊 **Отправлено {messages_sent} из {total} сообщений**\n\n" f"Осталось ещё {remaining} сообщений.\n\n" @@ -225,46 +226,40 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p parse_mode="Markdown", reply_markup=keyboard ) - - # Ждём ответа пользователя (до 60 секунд) + + # Ждём ответа пользователя БЕСКОНЕЧНО from bot.config import state_manager - + user_id = update.effective_user.id - + # Сохраняем состояние ожидания state = state_manager.get(user_id) state.waiting_for_output_control = True state.output_remaining = remaining state.output_wait_message = wait_msg - - # Ждём 60 секунд - for _ in range(60): + + # Ждём пока пользователь не нажмёт кнопку + while state.waiting_for_output_control: await asyncio.sleep(1) state = state_manager.get(user_id) - if not state.waiting_for_output_control: - # Пользователь ответил - if state.continue_output: - # Продолжаем - удаляем кнопки - try: - await wait_msg.delete() - except: - pass - break - else: - # Отменил - редактируем сообщение и убираем кнопки - try: - await wait_msg.edit_text("❌ **Вывод отменен пользователем**", parse_mode="Markdown") - except: - pass - return - - # Таймаут - if state.waiting_for_output_control: - state.waiting_for_output_control = False + + # Пользователь ответил + if state.continue_output: + # Продолжаем - удаляем кнопки try: - await wait_msg.edit_text("⏱️ **Время ожидания истекло**. Вывод продолжен.", parse_mode="Markdown") + await wait_msg.delete() except: pass + # Очищаем состояние + state.output_remaining = None + state.output_wait_message = None + else: + # Отменил - редактируем сообщение и убираем кнопки + try: + await wait_msg.edit_text("❌ **Вывод отменен пользователем**", parse_mode="Markdown") + except: + pass + return # Прерываем вывод def format_long_output(text: str, max_lines: int = 100, head_lines: int = 50, tail_lines: int = 50) -> str: