fix: Use context.bot_data for plan persistence
- Store pending plan in context.bot_data (Telegram persists this) - Add debug prints for troubleshooting - Fixes plan not being retrieved on confirmation
This commit is contained in:
31
bot_logic.py
31
bot_logic.py
@@ -45,9 +45,6 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
# Memória persistente da conversa (em memória RAM)
|
# Memória persistente da conversa (em memória RAM)
|
||||||
chat_histories = {}
|
chat_histories = {}
|
||||||
|
|
||||||
# Armazena planos pendentes de confirmação
|
|
||||||
pending_plans = {}
|
|
||||||
|
|
||||||
async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
if not await auth_check(update): return
|
if not await auth_check(update): return
|
||||||
|
|
||||||
@@ -88,17 +85,19 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if user_msg.lower() in ['sim', 'confirmar', 'confirma', 'sim!', 'confirma!', 's']:
|
if user_msg.lower() in ['sim', 'confirmar', 'confirma', 'sim!', 'confirma!', 's']:
|
||||||
# Verifica se há confirmação pendente
|
# Verifica se há confirmação pendente (usa chat_id do update atual)
|
||||||
plan_key = f"plan_{chat_id}"
|
if 'pending_plan' in context.bot_data:
|
||||||
if plan_key in pending_plans:
|
plan = context.bot_data['pending_plan']
|
||||||
plan = pending_plans[plan_key]
|
del context.bot_data['pending_plan']
|
||||||
del pending_plans[plan_key]
|
# Executa o plano
|
||||||
# Executa o plano usando execute_plan
|
|
||||||
from orchestrator import execute_step
|
from orchestrator import execute_step
|
||||||
results = []
|
results = []
|
||||||
|
print(f"[CONFIRM] Executando plano com {len(plan.get('steps', []))} passos")
|
||||||
for step in plan.get("steps", []):
|
for step in plan.get("steps", []):
|
||||||
|
print(f"[STEP] Executando: {step.get('action')}")
|
||||||
result = execute_step(step)
|
result = execute_step(step)
|
||||||
results.append(result)
|
results.append(result)
|
||||||
|
print(f"[STEP RESULT] Success: {result.get('success')}, Output: {str(result.get('output'))[:100]}")
|
||||||
# Para em erro crítico
|
# Para em erro crítico
|
||||||
if not result.get("success") and step.get("danger") == "dangerous":
|
if not result.get("success") and step.get("danger") == "dangerous":
|
||||||
results.append({
|
results.append({
|
||||||
@@ -116,12 +115,14 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
reply = format_completion_message(plan_result)
|
reply = format_completion_message(plan_result)
|
||||||
await update.message.reply_text(reply)
|
await update.message.reply_text(reply)
|
||||||
return
|
return
|
||||||
|
else:
|
||||||
|
await update.message.reply_text("Nenhuma operacao pendente para confirmar.")
|
||||||
|
return
|
||||||
|
|
||||||
if user_msg.lower() in ['nao', 'não', 'cancelar', 'cancela', 'n', 'n!']:
|
if user_msg.lower() in ['nao', 'não', 'cancelar', 'cancela', 'n', 'n!']:
|
||||||
# Cancela confirmação pendente
|
# Cancela confirmação pendente
|
||||||
plan_key = f"plan_{chat_id}"
|
if 'pending_plan' in context.bot_data:
|
||||||
if plan_key in pending_plans:
|
del context.bot_data['pending_plan']
|
||||||
del pending_plans[plan_key]
|
|
||||||
await update.message.reply_text("Operacao cancelada.")
|
await update.message.reply_text("Operacao cancelada.")
|
||||||
return
|
return
|
||||||
await update.message.reply_text("Nada pendente para cancelar.")
|
await update.message.reply_text("Nada pendente para cancelar.")
|
||||||
@@ -141,9 +142,9 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
if is_orchestrator_task:
|
if is_orchestrator_task:
|
||||||
result = orchestrate(user_msg, user_confirmed=False)
|
result = orchestrate(user_msg, user_confirmed=False)
|
||||||
if result["status"] == "needs_confirmation":
|
if result["status"] == "needs_confirmation":
|
||||||
# Salva plano pendente
|
# Salva plano pendente no context (persistente entre mensagens)
|
||||||
plan_key = f"plan_{chat_id}"
|
context.bot_data['pending_plan'] = result["plan"]
|
||||||
pending_plans[plan_key] = result["plan"]
|
print(f"[ORCH] Plano salvo. Steps: {len(result['plan'].get('steps', []))}")
|
||||||
reply = format_confirmation_message(result)
|
reply = format_confirmation_message(result)
|
||||||
reply += "\n\nResponda *sim* para confirmar ou *nao* para cancelar."
|
reply += "\n\nResponda *sim* para confirmar ou *nao* para cancelar."
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user