fix: кнопки удаляются сразу после нажатия, ожидание бесконечное
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
parent
4b69ee0310
commit
85947754c7
|
|
@ -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":
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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]: # предыдущее не закрыло блок
|
if i > 0 and not parts[i-1][3]: # предыдущее не закрыло блок
|
||||||
part = "```\n" + part
|
part = "```\n" + part
|
||||||
|
|
||||||
# Проверяем нужно ли закрыть блок в конце этого сообщения
|
# Проверяем нужно ли закрыть блок в конце этого сообщения
|
||||||
if i < total - 1 and not code_closed:
|
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")
|
InlineKeyboardButton("❌ Отменить", callback_data="cancel_output")
|
||||||
]
|
]
|
||||||
])
|
])
|
||||||
|
|
||||||
wait_msg = await update.message.reply_text(
|
wait_msg = await update.message.reply_text(
|
||||||
f"📊 **Отправлено {messages_sent} из {total} сообщений**\n\n"
|
f"📊 **Отправлено {messages_sent} из {total} сообщений**\n\n"
|
||||||
f"Осталось ещё {remaining} сообщений.\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",
|
parse_mode="Markdown",
|
||||||
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
|
||||||
|
|
||||||
# Сохраняем состояние ожидания
|
# Сохраняем состояние ожидания
|
||||||
state = state_manager.get(user_id)
|
state = state_manager.get(user_id)
|
||||||
state.waiting_for_output_control = True
|
state.waiting_for_output_control = True
|
||||||
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:
|
||||||
# Продолжаем - удаляем кнопки
|
# Продолжаем - удаляем кнопки
|
||||||
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
|
|
||||||
try:
|
try:
|
||||||
await wait_msg.edit_text("⏱️ **Время ожидания истекло**. Вывод продолжен.", parse_mode="Markdown")
|
await wait_msg.delete()
|
||||||
except:
|
except:
|
||||||
pass
|
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:
|
def format_long_output(text: str, max_lines: int = 100, head_lines: int = 50, tail_lines: int = 50) -> str:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue