diff --git a/vigilancia/menu_idd.py b/vigilancia/menu_idd.py
index 93d6299..cbf85df 100644
--- a/vigilancia/menu_idd.py
+++ b/vigilancia/menu_idd.py
@@ -291,16 +291,17 @@ def _cerrar_menu(chat_id, message_id):
_log(f"cerrar menu error: {e}")
-def _disp(chat_id, message_id, comando):
- """Ejecuta un comando del bot y cierra el menu (opcion elegida)."""
+def _disp(chat_id, message_id, comando, categoria=None):
+ """Ejecuta un comando, cierra el menu viejo y devuelve al menu."""
import pi_bot
pi_bot.procesar(comando, chat_id)
_cerrar_menu(chat_id, message_id)
+ _reenviar_menu(chat_id, categoria)
-def _fin_accion(chat_id):
- """Tras una accion: deja ver el resultado, limpia toda la pantalla
- y deja el mensaje para volver al menu."""
+def _fin_accion(chat_id, categoria=None):
+ """Tras una accion terminal: deja ver el resultado, limpia toda la
+ pantalla y devuelve al menu de la categoria."""
import time as _time
import pi_bot
_time.sleep(4)
@@ -308,7 +309,7 @@ def _fin_accion(chat_id):
pi_bot.limpiar_pantalla(chat_id)
except Exception:
pass
- _enviar_nuevo(chat_id, "✅ Hecho. Pulsa /menu para volver al menú.", None)
+ _reenviar_menu(chat_id, categoria)
def _reabrir(chat_id, message_id, categoria, comando):
@@ -329,9 +330,7 @@ def _reabrir(chat_id, message_id, categoria, comando):
except Exception:
pass
_borrar(chat_id, message_id)
- teclado = _teclado_categoria(chat_id, categoria)
- if teclado is not None:
- _enviar_nuevo(chat_id, _header(categoria), teclado)
+ _reenviar_menu(chat_id, categoria)
# ----------------------------------------------------------------- menu ----
@@ -359,6 +358,34 @@ def _header(categoria):
return nombres.get(categoria, "🧭 Menú IDD")
+# Ultima categoria visitada por chat: a ella se vuelve tras cada accion.
+menu_cat = {}
+
+
+def _record_cat(chat_id, categoria):
+ menu_cat[chat_id] = categoria
+
+
+def _reenviar_menu(chat_id, categoria=None):
+ """Envia de nuevo el menu de la categoria (con su volver operativo)."""
+ cat = categoria or menu_cat.get(chat_id)
+ if not cat:
+ _enviar_nuevo(chat_id, "🧭 Menú IDD\nElige una categoría:",
+ teclado_principal())
+ return
+ teclado = _teclado_categoria(chat_id, cat)
+ if teclado is None:
+ _enviar_nuevo(chat_id, "🧭 Menú IDD\nElige una categoría:",
+ teclado_principal())
+ return
+ _enviar_nuevo(chat_id, _header(cat), teclado)
+
+
+def volver_al_menu(chat_id, categoria=None):
+ """API para pi_bot: tras un texto libre del menu, devuelve al menu."""
+ _reenviar_menu(chat_id, categoria)
+
+
def _teclado_categoria(chat_id, categoria):
teclados = {
"videoclub": lambda: teclado_videoclub(chat_id),
@@ -376,6 +403,7 @@ def _teclado_categoria(chat_id, categoria):
def _abrir_categoria(chat_id, message_id, categoria):
+ _record_cat(chat_id, categoria)
teclado = _teclado_categoria(chat_id, categoria)
if teclado is None:
return False
@@ -400,11 +428,14 @@ def procesar_callback(data, chat_id, message_id):
# sub:torrents / sub:bajar / sub:router / sub:parental:
sub = partes[1]
if sub in ("router",):
+ _record_cat(chat_id, "router")
_enviar_edit(chat_id, message_id, _header("router"), teclado_router())
return
if sub in ("torrents", "bajar"):
+ _record_cat(chat_id, "videoclub")
return _mostrar_resultados(chat_id, message_id, sub)
if len(partes) == 2 and sub in ("desactivar", "activar", "pausa"):
+ _record_cat(chat_id, "parental")
_enviar_edit(chat_id, message_id,
f"¿Sobre qué dispositivo? ({sub})",
teclado_nombres(sub))
@@ -419,6 +450,13 @@ def procesar_callback(data, chat_id, message_id):
# pide un dato por teclado: lo captura el siguiente mensaje
accion = partes[1]
_guardar_pendiente(chat_id, accion)
+ CAT_TXT = {
+ "busca": "videoclub", "pelicula": "videoclub", "serie": "videoclub",
+ "tv": "tv", "alarma": "tv", "youtube": "tv",
+ "descargar": "nas",
+ "desactivar": "parental", "activar": "parental",
+ }
+ _record_cat(chat_id, CAT_TXT.get(accion, "sistema"))
preguntas = {
"busca": "🔎 ¿Qué busco? Escribe el nombre.",
"pelicula": "🎬 ¿Qué película busco?",
@@ -447,8 +485,10 @@ def procesar_callback(data, chat_id, message_id):
_cerrar_menu(chat_id, message_id)
return
minutos = partes[1]
- _disp(chat_id, message_id,
- f"parental pausa {nombre} {minutos}")
+ import pi_bot
+ pi_bot.procesar(f"parental pausa {nombre} {minutos}", chat_id)
+ _cerrar_menu(chat_id, message_id)
+ _fin_accion(chat_id, "parental")
return
if ruta == "acc":
@@ -481,13 +521,17 @@ def _mostrar_resultados(chat_id, message_id, tipo):
def _ejecutar_parental(chat_id, message_id, accion, nombre):
if accion == "pausa":
+ _record_cat(chat_id, "parental")
_set_pausa_nombre(chat_id, nombre)
_enviar_edit(chat_id, message_id,
f"⏸️ Pausa para {nombre}. ¿Cuántos minutos?",
teclado_minutos_pausa(nombre))
return
comando = f"parental {'desactivar' if accion == 'desactivar' else 'activar'} {nombre}"
- _disp(chat_id, message_id, comando)
+ import pi_bot
+ pi_bot.procesar(comando, chat_id)
+ _cerrar_menu(chat_id, message_id)
+ _fin_accion(chat_id, "parental")
def _ejecutar_accion(chat_id, message_id, partes):
@@ -512,23 +556,32 @@ def _ejecutar_accion(chat_id, message_id, partes):
if accion == "parental_listar":
_reabrir(chat_id, message_id, "parental", "parental listar")
return
+ CAT_ACC = {
+ "ayuda": None, "genero": "videoclub", "novedades": "videoclub",
+ "descargas": "nas", "estado": "sistema", "temperatura": "sistema",
+ "panorama": "sistema", "limpieza": "sistema", "limpiar": "sistema",
+ "aimesh": "sistema", "qos": "sistema", "limite": "sistema",
+ "seguridad": "sistema",
+ }
if accion in directos:
- _disp(chat_id, message_id, directos[accion])
+ _disp(chat_id, message_id, directos[accion], CAT_ACC.get(accion))
return
if accion == "termo":
if sub == "estado":
_reabrir(chat_id, message_id, "termo", "termo estado")
elif sub in ("on", "off"):
- _disp(chat_id, message_id, f"termo {sub}")
- _fin_accion(chat_id)
+ pi_bot.procesar(f"termo {sub}", chat_id)
+ _cerrar_menu(chat_id, message_id)
+ _fin_accion(chat_id, "termo")
return
if accion == "aspiradora":
if sub in ("estado", "start", "stop", "home", "pause", "locate"):
if sub == "estado":
_reabrir(chat_id, message_id, "aspi", "aspiradora estado")
else:
- _disp(chat_id, message_id, f"aspiradora {sub}")
- _fin_accion(chat_id)
+ pi_bot.procesar(f"aspiradora {sub}", chat_id)
+ _cerrar_menu(chat_id, message_id)
+ _fin_accion(chat_id, "aspi")
return
if accion == "tablets":
if sub in ("bloquear", "desbloquear"):
@@ -536,7 +589,7 @@ def _ejecutar_accion(chat_id, message_id, partes):
pi_bot.procesar(f"parental {verbo} Inés", chat_id)
pi_bot.procesar(f"parental {verbo} Carolina", chat_id)
_cerrar_menu(chat_id, message_id)
- _fin_accion(chat_id)
+ _fin_accion(chat_id, "parental")
return
if accion == "router":
mapeo = {
@@ -548,12 +601,12 @@ def _ejecutar_accion(chat_id, message_id, partes):
"reiniciar": "router reiniciar",
"reservar": "router reservar",
}
- _disp(chat_id, message_id, mapeo.get(sub, "router ayuda"))
+ _disp(chat_id, message_id, mapeo.get(sub, "router ayuda"), "router")
return
if accion in ("torrents", "bajar"):
numero = int(sub) if sub.isdigit() else 0
if numero:
- _disp(chat_id, message_id, f"{accion} {numero}")
+ _disp(chat_id, message_id, f"{accion} {numero}", "videoclub")
return
@@ -623,6 +676,7 @@ def resolver_pausa_minutos(chat_id, texto):
return True
import pi_bot
pi_bot.procesar(f"parental pausa {nombre} {minutos}", chat_id)
+ _reenviar_menu(chat_id, "parental")
return True
diff --git a/vigilancia/pi_bot.py b/vigilancia/pi_bot.py
index 98b19e7..598ba5b 100644
--- a/vigilancia/pi_bot.py
+++ b/vigilancia/pi_bot.py
@@ -412,7 +412,12 @@ def procesar(texto, chat_id):
enviar("⏱️ Escribe un número de minutos entre 1 y 1440.", chat_id)
return
if cmd:
- return procesar(cmd, chat_id)
+ procesar(cmd, chat_id)
+ try:
+ menu_idd.volver_al_menu(chat_id)
+ except Exception:
+ pass
+ return
# Borrado de descargas pendiente (numero de tarea NAS)
if t.isdigit() and chat_id in borrar_pend:
_ejecutar_borrado(chat_id, int(t))