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))