fix: кнопки удаляются сразу после нажатия, ожидание бесконечное

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
mirivlad 2026-02-27 19:20:48 +08:00
parent 4b69ee0310
commit 85947754c7
2 changed files with 35 additions and 32 deletions

View File

@ -56,7 +56,11 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
state = state_manager.get(user_id) state = state_manager.get(user_id)
state.waiting_for_output_control = False state.waiting_for_output_control = False
state.continue_output = True state.continue_output = True
await query.answer(f"▶️ Продолжаем вывод (осталось {remaining} сообщений)") # Сразу удаляем сообщение с кнопками
try:
await query.delete_message()
except:
pass
return return
elif callback == "cancel_output": 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 = state_manager.get(user_id)
state.waiting_for_output_control = False state.waiting_for_output_control = False
state.continue_output = False state.continue_output = False
await query.answer("❌ Вывод отменен") # Сразу удаляем сообщение с кнопками
try:
await query.delete_message()
except:
pass
return return
elif callback == "preset_menu": elif callback == "preset_menu":

View File

@ -157,6 +157,7 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p
- Если блок кода не влезает отправляется без Markdown - Если блок кода не влезает отправляется без Markdown
- Нумерация (1/N), (2/N) только если сообщений > 1 - Нумерация (1/N), (2/N) только если сообщений > 1
- КАЖДЫЕ pause_every сообщений пауза с кнопками "Продолжить" / "Отменить" - КАЖДЫЕ pause_every сообщений пауза с кнопками "Продолжить" / "Отменить"
- Ждём нажатия кнопки бесконечно, не продолжаем автоматически
Args: Args:
update: Telegram update update: Telegram update
@ -226,7 +227,7 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p
reply_markup=keyboard reply_markup=keyboard
) )
# Ждём ответа пользователя (до 60 секунд) # Ждём ответа пользователя БЕСКОНЕЧНО
from bot.config import state_manager from bot.config import state_manager
user_id = update.effective_user.id user_id = update.effective_user.id
@ -237,11 +238,11 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p
state.output_remaining = remaining state.output_remaining = remaining
state.output_wait_message = wait_msg state.output_wait_message = wait_msg
# Ждём 60 секунд # Ждём пока пользователь не нажмёт кнопку
for _ in range(60): while state.waiting_for_output_control:
await asyncio.sleep(1) await asyncio.sleep(1)
state = state_manager.get(user_id) state = state_manager.get(user_id)
if not state.waiting_for_output_control:
# Пользователь ответил # Пользователь ответил
if state.continue_output: if state.continue_output:
# Продолжаем - удаляем кнопки # Продолжаем - удаляем кнопки
@ -249,22 +250,16 @@ async def send_long_message(update: Update, text: str, parse_mode: str = None, p
await wait_msg.delete() await wait_msg.delete()
except: except:
pass pass
break # Очищаем состояние
state.output_remaining = None
state.output_wait_message = None
else: else:
# Отменил - редактируем сообщение и убираем кнопки # Отменил - редактируем сообщение и убираем кнопки
try: try:
await wait_msg.edit_text("❌ **Вывод отменен пользователем**", parse_mode="Markdown") await wait_msg.edit_text("❌ **Вывод отменен пользователем**", parse_mode="Markdown")
except: except:
pass pass
return return # Прерываем вывод
# Таймаут
if state.waiting_for_output_control:
state.waiting_for_output_control = False
try:
await wait_msg.edit_text("⏱️ **Время ожидания истекло**. Вывод продолжен.", parse_mode="Markdown")
except:
pass
def format_long_output(text: str, max_lines: int = 100, head_lines: int = 50, tail_lines: int = 50) -> str: def format_long_output(text: str, max_lines: int = 100, head_lines: int = 50, tail_lines: int = 50) -> str: