From 3df6a7406867757b64911c5718d7246ea5b19543 Mon Sep 17 00:00:00 2001 From: Kaia-Alenia Date: Fri, 31 Jul 2026 21:01:27 -0600 Subject: [PATCH] feat: complete Modulo 10 Nerve challenges --- .../Modulo-10-Nerve/100-topologia-red/reto.py | 11 ++++ .../91-local-first/mensajero.py | 27 +++++++++ python/Modulo-10-Nerve/91-local-first/reto.py | 27 +++++++++ .../92-arquitectura-nodos/alarma.py | 31 ++++++++++ .../92-arquitectura-nodos/reto.py | 31 ++++++++++ python/Modulo-10-Nerve/93-p2p/radio_lunar.py | 32 ++++++++++ python/Modulo-10-Nerve/93-p2p/reto.py | 32 ++++++++++ .../Modulo-10-Nerve/94-estado-global/banco.py | 26 +++++++++ .../Modulo-10-Nerve/94-estado-global/reto.py | 26 +++++++++ .../95-criptografia/boveda.nrv | Bin 0 -> 261 bytes .../Modulo-10-Nerve/95-criptografia/reto.py | 16 +++++ .../Modulo-10-Nerve/96-sincronizacion/reto.py | 55 ++++++++++++++++++ .../Modulo-10-Nerve/97-microservicios/reto.py | 39 +++++++++++++ .../98-despliegue/cliente_legal.py | 8 +++ .../98-despliegue/hub_fortaleza.py | 4 ++ .../98-despliegue/nerve.config | 1 + .../99-optimizacion/hub_estricto.py | 4 ++ .../99-optimizacion/nerve.config | 1 + .../Modulo-10-Nerve/99-optimizacion/sensor.py | 13 +++++ 19 files changed, 384 insertions(+) create mode 100644 python/Modulo-10-Nerve/100-topologia-red/reto.py create mode 100644 python/Modulo-10-Nerve/91-local-first/mensajero.py create mode 100644 python/Modulo-10-Nerve/91-local-first/reto.py create mode 100644 python/Modulo-10-Nerve/92-arquitectura-nodos/alarma.py create mode 100644 python/Modulo-10-Nerve/92-arquitectura-nodos/reto.py create mode 100644 python/Modulo-10-Nerve/93-p2p/radio_lunar.py create mode 100644 python/Modulo-10-Nerve/93-p2p/reto.py create mode 100644 python/Modulo-10-Nerve/94-estado-global/banco.py create mode 100644 python/Modulo-10-Nerve/94-estado-global/reto.py create mode 100644 python/Modulo-10-Nerve/95-criptografia/boveda.nrv create mode 100644 python/Modulo-10-Nerve/95-criptografia/reto.py create mode 100644 python/Modulo-10-Nerve/96-sincronizacion/reto.py create mode 100644 python/Modulo-10-Nerve/97-microservicios/reto.py create mode 100644 python/Modulo-10-Nerve/98-despliegue/cliente_legal.py create mode 100644 python/Modulo-10-Nerve/98-despliegue/hub_fortaleza.py create mode 100644 python/Modulo-10-Nerve/98-despliegue/nerve.config create mode 100644 python/Modulo-10-Nerve/99-optimizacion/hub_estricto.py create mode 100644 python/Modulo-10-Nerve/99-optimizacion/nerve.config create mode 100644 python/Modulo-10-Nerve/99-optimizacion/sensor.py diff --git a/python/Modulo-10-Nerve/100-topologia-red/reto.py b/python/Modulo-10-Nerve/100-topologia-red/reto.py new file mode 100644 index 0000000..c11010a --- /dev/null +++ b/python/Modulo-10-Nerve/100-topologia-red/reto.py @@ -0,0 +1,11 @@ +# Reto 100: El Observador de la Matriz +# Este archivo sirve para verificar que se comprendió el funcionamiento del dashboard y la topología en estrella. + +from nerve import NexusClient + +def main(): + print("Reto 100: Visualización de la Topología Estrella de Nerve completada.") + print("Para verificar esto, puedes iniciar 'nerve start' y 'nerve dashboard' en tu navegador.") + +if __name__ == "__main__": + main() diff --git a/python/Modulo-10-Nerve/91-local-first/mensajero.py b/python/Modulo-10-Nerve/91-local-first/mensajero.py new file mode 100644 index 0000000..ff57809 --- /dev/null +++ b/python/Modulo-10-Nerve/91-local-first/mensajero.py @@ -0,0 +1,27 @@ +import time +from nerve import NexusClient + +print("Iniciando transmisor...") + +# Connect client +cliente = NexusClient() +cliente.connect("agente_007") +print("Conectado como agente_007.") + +# Secret report +informe_secreto = { + "mision": "Aterrizaje Lunar", + "objetivo": "Establecer base de comunicación", + "nivel_peligro": 5 +} + +print("Enviando informe secreto al cuartel_general...") +cliente.send("cuartel_general", informe_secreto) +print("Informe enviado.") + +print("Avisando a la red local...") +cliente.broadcast({"aviso": "Misión cumplida. Agente fuera."}) + +# Wait for transmission +time.sleep(1) +print("Misión cumplida. Agente fuera.") diff --git a/python/Modulo-10-Nerve/91-local-first/reto.py b/python/Modulo-10-Nerve/91-local-first/reto.py new file mode 100644 index 0000000..ff57809 --- /dev/null +++ b/python/Modulo-10-Nerve/91-local-first/reto.py @@ -0,0 +1,27 @@ +import time +from nerve import NexusClient + +print("Iniciando transmisor...") + +# Connect client +cliente = NexusClient() +cliente.connect("agente_007") +print("Conectado como agente_007.") + +# Secret report +informe_secreto = { + "mision": "Aterrizaje Lunar", + "objetivo": "Establecer base de comunicación", + "nivel_peligro": 5 +} + +print("Enviando informe secreto al cuartel_general...") +cliente.send("cuartel_general", informe_secreto) +print("Informe enviado.") + +print("Avisando a la red local...") +cliente.broadcast({"aviso": "Misión cumplida. Agente fuera."}) + +# Wait for transmission +time.sleep(1) +print("Misión cumplida. Agente fuera.") diff --git a/python/Modulo-10-Nerve/92-arquitectura-nodos/alarma.py b/python/Modulo-10-Nerve/92-arquitectura-nodos/alarma.py new file mode 100644 index 0000000..0850260 --- /dev/null +++ b/python/Modulo-10-Nerve/92-arquitectura-nodos/alarma.py @@ -0,0 +1,31 @@ +from nerve import NexusClient + +# Connect client +cliente = NexusClient() +cliente.connect("central_alarmas") + +# Define callback +def vigilante(datos): + # Support both wrapped and unwrapped payload formats + payload = datos.get("payload") if isinstance(datos, dict) else None + if isinstance(payload, dict): + inner_datos = payload + else: + inner_datos = datos + + if not isinstance(inner_datos, dict): + return + + peligro = inner_datos.get("peligro") + if peligro == "fuego": + print("¡ALERTA ROJA! Activando aspersores de agua.") + elif peligro == "ladron": + print("¡ALERTA AZUL! Llamando a la policía local.") + else: + print("Situación normal. Seguimos vigilando.") + +# Register listener +cliente.listen(vigilante) + +# Wait for reports +input("Central de Alarmas activada. Esperando reportes...\n") diff --git a/python/Modulo-10-Nerve/92-arquitectura-nodos/reto.py b/python/Modulo-10-Nerve/92-arquitectura-nodos/reto.py new file mode 100644 index 0000000..0850260 --- /dev/null +++ b/python/Modulo-10-Nerve/92-arquitectura-nodos/reto.py @@ -0,0 +1,31 @@ +from nerve import NexusClient + +# Connect client +cliente = NexusClient() +cliente.connect("central_alarmas") + +# Define callback +def vigilante(datos): + # Support both wrapped and unwrapped payload formats + payload = datos.get("payload") if isinstance(datos, dict) else None + if isinstance(payload, dict): + inner_datos = payload + else: + inner_datos = datos + + if not isinstance(inner_datos, dict): + return + + peligro = inner_datos.get("peligro") + if peligro == "fuego": + print("¡ALERTA ROJA! Activando aspersores de agua.") + elif peligro == "ladron": + print("¡ALERTA AZUL! Llamando a la policía local.") + else: + print("Situación normal. Seguimos vigilando.") + +# Register listener +cliente.listen(vigilante) + +# Wait for reports +input("Central de Alarmas activada. Esperando reportes...\n") diff --git a/python/Modulo-10-Nerve/93-p2p/radio_lunar.py b/python/Modulo-10-Nerve/93-p2p/radio_lunar.py new file mode 100644 index 0000000..9762f26 --- /dev/null +++ b/python/Modulo-10-Nerve/93-p2p/radio_lunar.py @@ -0,0 +1,32 @@ +from nerve import NexusClient + +# Connect client +cliente = NexusClient() +cliente.connect("astronauta") + +# Define callback +def auricular(datos): + payload = datos.get("payload") if isinstance(datos, dict) else None + if isinstance(payload, dict): + inner_datos = payload + else: + inner_datos = datos + + if not isinstance(inner_datos, dict): + return + + mensaje_recibido = inner_datos.get("mensaje") + if mensaje_recibido: + print("\n[Tierra]: " + str(mensaje_recibido)) + +# Register listener +cliente.listen(auricular) + +# Interactive loop +while True: + try: + msg = input("Luna: ") + paquete = {"mensaje": msg} + cliente.send("tierra", paquete) + except (KeyboardInterrupt, EOFError): + break diff --git a/python/Modulo-10-Nerve/93-p2p/reto.py b/python/Modulo-10-Nerve/93-p2p/reto.py new file mode 100644 index 0000000..9762f26 --- /dev/null +++ b/python/Modulo-10-Nerve/93-p2p/reto.py @@ -0,0 +1,32 @@ +from nerve import NexusClient + +# Connect client +cliente = NexusClient() +cliente.connect("astronauta") + +# Define callback +def auricular(datos): + payload = datos.get("payload") if isinstance(datos, dict) else None + if isinstance(payload, dict): + inner_datos = payload + else: + inner_datos = datos + + if not isinstance(inner_datos, dict): + return + + mensaje_recibido = inner_datos.get("mensaje") + if mensaje_recibido: + print("\n[Tierra]: " + str(mensaje_recibido)) + +# Register listener +cliente.listen(auricular) + +# Interactive loop +while True: + try: + msg = input("Luna: ") + paquete = {"mensaje": msg} + cliente.send("tierra", paquete) + except (KeyboardInterrupt, EOFError): + break diff --git a/python/Modulo-10-Nerve/94-estado-global/banco.py b/python/Modulo-10-Nerve/94-estado-global/banco.py new file mode 100644 index 0000000..c0d6eae --- /dev/null +++ b/python/Modulo-10-Nerve/94-estado-global/banco.py @@ -0,0 +1,26 @@ +from nerve import NexusClient + +saldo_boveda = 1000 + +def cajero(datos): + global saldo_boveda + payload = datos.get("payload") if isinstance(datos, dict) else None + if isinstance(payload, dict): + inner_datos = payload + else: + inner_datos = datos + + if not isinstance(inner_datos, dict): + return + + retiro = inner_datos.get("retiro", 0) + if retiro > 0: + saldo_boveda = saldo_boveda - retiro + print(f"Retiro procesado de: {retiro}. Saldo actual: {saldo_boveda}") + +# Setup client +cliente = NexusClient() +cliente.connect("banco_central") +cliente.listen(cajero) + +input("Banco abierto. Presiona ENTER para cerrar...\n") diff --git a/python/Modulo-10-Nerve/94-estado-global/reto.py b/python/Modulo-10-Nerve/94-estado-global/reto.py new file mode 100644 index 0000000..c0d6eae --- /dev/null +++ b/python/Modulo-10-Nerve/94-estado-global/reto.py @@ -0,0 +1,26 @@ +from nerve import NexusClient + +saldo_boveda = 1000 + +def cajero(datos): + global saldo_boveda + payload = datos.get("payload") if isinstance(datos, dict) else None + if isinstance(payload, dict): + inner_datos = payload + else: + inner_datos = datos + + if not isinstance(inner_datos, dict): + return + + retiro = inner_datos.get("retiro", 0) + if retiro > 0: + saldo_boveda = saldo_boveda - retiro + print(f"Retiro procesado de: {retiro}. Saldo actual: {saldo_boveda}") + +# Setup client +cliente = NexusClient() +cliente.connect("banco_central") +cliente.listen(cajero) + +input("Banco abierto. Presiona ENTER para cerrar...\n") diff --git a/python/Modulo-10-Nerve/95-criptografia/boveda.nrv b/python/Modulo-10-Nerve/95-criptografia/boveda.nrv new file mode 100644 index 0000000000000000000000000000000000000000..8f4a911cad51d66d9c60ce6e950efa7f129812e8 GIT binary patch literal 261 zcmV+g0s8(lZJ<;t?ZJW9@~v5T4}~)J zCJn>5@zS1owQ|KPkp5sWf@KEoNm#aES5E8;RQVNoU(u#`_C0MoJSvRQ%vkLpvUY-A zaIFeXW4~)bx}rCY(KM6}2j-TG^iV4xYB!<>s09gHaYNo~m^QIVPJXX9`Z`ie@xxk3 L7E++zTIM=CFK>8| literal 0 HcmV?d00001 diff --git a/python/Modulo-10-Nerve/95-criptografia/reto.py b/python/Modulo-10-Nerve/95-criptografia/reto.py new file mode 100644 index 0000000..dc3a55a --- /dev/null +++ b/python/Modulo-10-Nerve/95-criptografia/reto.py @@ -0,0 +1,16 @@ +import os +from nerve import pack_nrv + +print("Iniciando protocolo de seguridad...") + +base_dir = os.path.dirname(os.path.abspath(__file__)) +archivo_txt = os.path.join(base_dir, "codigos_nucleares.txt") +caja_fuerte = os.path.join(base_dir, "boveda.nrv") +password = "alenia_secreto" + +pack_nrv(archivo_txt, caja_fuerte, password) + +print("Archivos encriptados con éxito en boveda.nrv") + +if os.path.exists(archivo_txt): + os.remove(archivo_txt) diff --git a/python/Modulo-10-Nerve/96-sincronizacion/reto.py b/python/Modulo-10-Nerve/96-sincronizacion/reto.py new file mode 100644 index 0000000..38de4da --- /dev/null +++ b/python/Modulo-10-Nerve/96-sincronizacion/reto.py @@ -0,0 +1,55 @@ +import time +from nerve import NexusClient + +lista_tareas = [] + +def al_recibir_mensaje(remitente, mensaje=None): + global lista_tareas + if mensaje is None: + payload = remitente + sender = payload.get("from") + msg = payload.get("payload") + else: + sender = remitente + msg = mensaje + + if not isinstance(msg, dict): + return + + accion = msg.get("accion") + if accion == "pedir_tareas": + if len(lista_tareas) > 0: + respuesta = { + "accion": "enviar_tareas", + "datos": lista_tareas + } + cliente.broadcast(respuesta) + elif accion == "enviar_tareas": + lista_tareas = msg.get("datos", []) + print(f"\n[!] ¡Sincronizado! Tareas actuales: {lista_tareas}") + elif accion == "nueva_tarea": + tarea = msg.get("datos") + if tarea and tarea not in lista_tareas: + lista_tareas.append(tarea) + print(f"\n[*] Nueva tarea recibida: {tarea}") + +# Setup client +cliente = NexusClient() +cliente.connect("todo_client") +cliente.listen(al_recibir_mensaje) + +print("[*] Pidiendo sincronización a la red...") +cliente.broadcast({"accion": "pedir_tareas"}) +time.sleep(1) + +while True: + try: + print("\n--- Lista de Tareas ---") + for i, t in enumerate(lista_tareas, 1): + print(f"{i}. {t}") + nueva = input("Ingresa una nueva tarea: ") + if nueva: + lista_tareas.append(nueva) + cliente.broadcast({"accion": "nueva_tarea", "datos": nueva}) + except (KeyboardInterrupt, EOFError): + break diff --git a/python/Modulo-10-Nerve/97-microservicios/reto.py b/python/Modulo-10-Nerve/97-microservicios/reto.py new file mode 100644 index 0000000..f9b9bab --- /dev/null +++ b/python/Modulo-10-Nerve/97-microservicios/reto.py @@ -0,0 +1,39 @@ +import time +from nerve import NexusClient + +# Connect client +cliente = NexusClient() +cliente.connect("cerebro_matematico") + +# Define callback +def al_recibir_mensaje(remitente, mensaje=None): + if mensaje is None: + payload = remitente + sender = payload.get("from") + msg = payload.get("payload") + else: + sender = remitente + msg = mensaje + + if not isinstance(msg, dict): + return + + accion = msg.get("accion") + if accion == "sumar": + a = msg.get("a", 0) + b = msg.get("b", 0) + total = a + b + print(f"\n[!] Petición de '{sender}' recibida: sumar {a} y {b}.") + # Send result back + cliente.send(sender, {"accion": "resultado", "total": total}) + print("[✓] Resultado calculado y enviado.") + +# Register listener +cliente.listen(al_recibir_mensaje) + +print("--- MODO CALCULADORA ---") +print("[*] Cerebro encendido.") + +# Keep alive +while True: + time.sleep(1) diff --git a/python/Modulo-10-Nerve/98-despliegue/cliente_legal.py b/python/Modulo-10-Nerve/98-despliegue/cliente_legal.py new file mode 100644 index 0000000..10bad0e --- /dev/null +++ b/python/Modulo-10-Nerve/98-despliegue/cliente_legal.py @@ -0,0 +1,8 @@ +import time +from nerve import NexusClient + +cliente = NexusClient() +cliente.connect("infiltrado") + +while True: + time.sleep(1) diff --git a/python/Modulo-10-Nerve/98-despliegue/hub_fortaleza.py b/python/Modulo-10-Nerve/98-despliegue/hub_fortaleza.py new file mode 100644 index 0000000..be4b957 --- /dev/null +++ b/python/Modulo-10-Nerve/98-despliegue/hub_fortaleza.py @@ -0,0 +1,4 @@ +from nerve import NexusHub + +hub = NexusHub() +hub.start() diff --git a/python/Modulo-10-Nerve/98-despliegue/nerve.config b/python/Modulo-10-Nerve/98-despliegue/nerve.config new file mode 100644 index 0000000..0af61e8 --- /dev/null +++ b/python/Modulo-10-Nerve/98-despliegue/nerve.config @@ -0,0 +1 @@ +auth_token=patito_de_goma diff --git a/python/Modulo-10-Nerve/99-optimizacion/hub_estricto.py b/python/Modulo-10-Nerve/99-optimizacion/hub_estricto.py new file mode 100644 index 0000000..be4b957 --- /dev/null +++ b/python/Modulo-10-Nerve/99-optimizacion/hub_estricto.py @@ -0,0 +1,4 @@ +from nerve import NexusHub + +hub = NexusHub() +hub.start() diff --git a/python/Modulo-10-Nerve/99-optimizacion/nerve.config b/python/Modulo-10-Nerve/99-optimizacion/nerve.config new file mode 100644 index 0000000..9f160fc --- /dev/null +++ b/python/Modulo-10-Nerve/99-optimizacion/nerve.config @@ -0,0 +1 @@ +rate_limit_messages_per_sec=2 diff --git a/python/Modulo-10-Nerve/99-optimizacion/sensor.py b/python/Modulo-10-Nerve/99-optimizacion/sensor.py new file mode 100644 index 0000000..8db4f3c --- /dev/null +++ b/python/Modulo-10-Nerve/99-optimizacion/sensor.py @@ -0,0 +1,13 @@ +import time +from nerve import NexusClient + +cliente = NexusClient() +cliente.connect("sensor_temp") + +while True: + try: + print("Enviando temperatura...") + cliente.broadcast({"temp": 25}) + time.sleep(1) + except (KeyboardInterrupt, EOFError): + break