caissaa23 commited on
Commit
a836283
·
verified ·
1 Parent(s): 34706c0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -143
app.py CHANGED
@@ -7,173 +7,86 @@ from registro import guardar_registro, cargar_registro
7
  from chatbot_nuti import buscar_respuesta
8
  from optimizacion import resize_imagen, cargar_modelo_ligero, cache_resultado
9
 
10
- # -------------------- ARCHIVOS --------------------
11
  USUARIOS_FILE = "usuarios.json"
12
  SESION_FILE = "sesion.json"
13
 
14
  def cargar_usuarios():
15
  if os.path.exists(USUARIOS_FILE):
16
- with open(USUARIOS_FILE, "r") as f:
17
  return json.load(f)
18
  return {}
19
 
20
  def guardar_usuarios(data):
21
- with open(USUARIOS_FILE, "w") as f:
22
- json.dump(data, f, indent=4)
23
 
24
- def registrar_usuario(nombre, email, password):
25
  usuarios = cargar_usuarios()
26
  if email in usuarios:
27
  return "⚠️ Ya existe una cuenta con ese correo."
28
- usuarios[email] = {"nombre": nombre, "password": password}
29
  guardar_usuarios(usuarios)
30
  return "✅ Registro exitoso. ¡Ahora puedes iniciar sesión!"
31
 
32
- def iniciar_sesion(email, password):
33
  usuarios = cargar_usuarios()
34
  if email not in usuarios:
35
  return "❌ Usuario no encontrado.", False, ""
36
  if usuarios[email]["password"] != password:
37
  return "🔐 Contraseña incorrecta.", False, ""
38
  # Guardar sesión
39
- with open(SESION_FILE, "w") as f:
40
- json.dump({"usuario": email, "nombre": usuarios[email]["nombre"]}, f)
41
  return f"✅ Bienvenido de nuevo, {usuarios[email]['nombre']}!", True, usuarios[email]['nombre']
42
 
43
- # -------------------- ESTADO --------------------
44
  estado = cargar_registro()
45
- for k, v in {
46
- "meta_diaria": 0, "restantes": 0, "quemas": 0, "puntos": 0,
47
- "registro": [], "badges": [], "emocion": "", "nivel": 1
48
- }.items():
49
- estado.setdefault(k, v)
50
 
51
- # -------------------- MODELO --------------------
52
  modelo = cargar_modelo_ligero()
53
 
54
- # -------------------- DATOS --------------------
55
- calorias_promedio = {
56
- "pizza": 285, "hamburger": 354, "apple": 95, "banana": 105,
57
- "salad": 150, "pasta": 350, "rice": 200, "ice cream": 210,
58
- "donut": 195, "fish": 206, "chicken": 239, "broccoli": 55
59
- }
60
-
61
- actividades = {
62
- "Correr": 700, "Caminar": 250, "Fútbol": 600,
63
- "Natación": 550, "Básquetbol": 500, "Voleibol": 400, "Yoga": 200,
64
- }
65
-
66
- nutriologos = [
67
- {"nombre": "Dra. Ana López", "pais": "México", "estado": "Sonora", "ciudad": "Hermosillo",
68
- "especialidad": "Nutrición deportiva", "direccion": "Av. Universidad 200", "contacto": "Instagram: @dra.analpz"},
69
- {"nombre": "Lic. Jorge Ramírez", "pais": "México", "estado": "CDMX", "ciudad": "Coyoacán",
70
- "especialidad": "Control de peso", "direccion": "Centro NutriVida, Av. Pacífico 300", "contacto": "Tel: +52 55 1234 5678"},
71
- {"nombre": "Dra. Camila Torres", "pais": "Colombia", "estado": "Antioquia", "ciudad": "Medellín",
72
- "especialidad": "Nutrición infantil", "direccion": "Cra 40 #23", "contacto": "Email: camilatorresnutri@gmail.com"},
73
- {"nombre": "Dr. Luis Fernández", "pais": "España", "estado": "Madrid", "ciudad": "Madrid",
74
- "especialidad": "Nutrición clínica", "direccion": "Calle Mayor 45", "contacto": "Web: www.drfernandez.es"},
75
- {"nombre": "Lic. Sofía Rivera", "pais": "México", "estado": "Jalisco", "ciudad": "Guadalajara",
76
- "especialidad": "Nutrición general y recetas personalizadas", "direccion": "Av. Chapultepec 100", "contacto": "IG: @sofiariveranutri"},
77
- ]
78
-
79
- # -------------------- FUNCIONES NUTRIBOT --------------------
80
- # Aquí pegas tus funciones: calcular_calorias, analizar_foto, registrar_actividad, coach_emocional, generar_mision, chatbot_nuti, buscar_nutriologo
81
-
82
  def calcular_calorias(edad, peso, altura, sexo, actividad):
83
- if sexo.lower() == "hombre":
84
- bmr = 88.36 + (13.4 * peso) + (4.8 * altura) - (5.7 * edad)
85
  else:
86
- bmr = 447.6 + (9.2 * peso) + (3.1 * altura) - (4.3 * edad)
87
- niveles = {"Sedentario": 1.2, "Ligero": 1.375, "Moderado": 1.55, "Activo": 1.725, "Muy activo": 1.9}
88
- tdee = bmr * niveles.get(actividad, 1.2)
89
  estado["meta_diaria"] = round(tdee)
90
  estado["restantes"] = round(tdee)
91
  guardar_registro(estado)
92
  return f"🔥 Tu meta calórica diaria es de {round(tdee)} cal."
93
 
94
- def analizar_foto(img):
95
- if estado["meta_diaria"] == 0:
96
- return "⚠️ Primero calcula tu meta diaria."
97
- img_opt = resize_imagen(img)
98
- resultado = cache_resultado(str(img_opt.tobytes()), modelo, img_opt)
99
- nombre = resultado[0]['label'].lower()
100
- calorias = calorias_promedio.get(nombre, 250)
101
- estado["restantes"] = max(0, estado["restantes"] - calorias)
102
- estado["registro"].append({"fecha": str(datetime.datetime.now()), "tipo": "comida", "nombre": nombre, "calorias": calorias})
103
- estado["puntos"] += 10
104
- guardar_registro(estado)
105
- return f"🍽️ {nombre.title()} ≈ {calorias} cal. Restan {estado['restantes']} / {estado['meta_diaria']} cal."
106
-
107
- def registrar_actividad(tipo, duracion):
108
- if tipo not in actividades:
109
- return "Selecciona una actividad válida."
110
- quemadas = int(actividades[tipo] * (duracion / 60))
111
- estado["restantes"] += quemadas
112
- estado["quemas"] += quemadas
113
- estado["registro"].append({"fecha": str(datetime.datetime.now()), "tipo": "actividad", "nombre": tipo, "calorias": quemadas})
114
- estado["puntos"] += 15
115
- guardar_registro(estado)
116
- return f"🏃‍♂️ {tipo} durante {duracion} min ≈ {quemadas} cal quemadas. Restantes: {estado['restantes']}."
117
-
118
- def coach_emocional(emocion):
119
- estado["emocion"] = emocion
120
- sugerencias = {
121
- "ansiedad": "🍌 Come un plátano o un puñado de nueces. Haz 3 respiraciones profundas.",
122
- "tristeza": "🍫 Un cuadrito de chocolate oscuro puede ayudar. Escucha tu música favorita.",
123
- "estrés": "🍵 Toma té verde y haz una pausa de 5 minutos.",
124
- "feliz": "😄 ¡Genial! Mantén esa energía con frutas frescas o un smoothie."
125
- }
126
- guardar_registro(estado)
127
- return sugerencias.get(emocion.lower(), "💬 Cuéntame más sobre cómo te sientes.")
128
-
129
- misiones = ["🥤 Bebe 8 vasos de agua.","🍎 Come 3 frutas distintas.","🚶 Camina 20 minutos.","🌈 Come 4 colores de comida diferentes.","🧘 Haz 10 minutos de respiración o yoga."]
130
- def generar_mision():
131
- mision = random.choice(misiones)
132
- estado["mision_actual"] = mision
133
- guardar_registro(estado)
134
- return f"🎯 Tu misión de hoy: {mision}"
135
-
136
- def chatbot_nuti(pregunta):
137
- respuesta = buscar_respuesta(pregunta)
138
- return f"🤖 Nuti dice: {respuesta}"
139
-
140
- def buscar_nutriologo(pais, estado_, ciudad):
141
- resultados = [n for n in nutriologos if n["pais"].lower()==pais.lower() and n["estado"].lower()==estado_.lower() and n["ciudad"].lower()==ciudad.lower()]
142
- if not resultados: return "😔 No se encontraron nutriólogos en esa zona aún."
143
- salida = "👩‍⚕️ Nutriólogos disponibles:\n"
144
- for n in resultados:
145
- salida += f"\n• {n['nombre']} — {n['especialidad']}\n 📍 {n['direccion']}\n 📞 {n['contacto']}\n"
146
- return salida
147
-
148
- # -------------------- INTERFAZ --------------------
149
  with gr.Blocks() as demo:
150
- user_name = gr.State(value="") # Guarda el nombre del usuario
151
-
152
- # ----- LOGIN/REGISTRO -----
153
- with gr.Tab("🔑 Iniciar sesión / Registrarse"):
154
- gr.Markdown("### Bienvenido a NutriBot Ultra 🥦\nPrimero inicia sesión o crea una cuenta para continuar.")
155
- # Registro
 
156
  nombre_reg = gr.Textbox(label="Nombre completo")
157
  email_reg = gr.Textbox(label="Correo electrónico")
158
  pass_reg = gr.Textbox(label="Contraseña", type="password")
159
- salida_reg = gr.Textbox(label="Resultado del registro")
160
  btn_reg = gr.Button("Crear cuenta")
161
  btn_reg.click(registrar_usuario, inputs=[nombre_reg,email_reg,pass_reg], outputs=salida_reg)
162
- # Login
 
163
  email_login = gr.Textbox(label="Correo electrónico")
164
  pass_login = gr.Textbox(label="Contraseña", type="password")
165
  salida_login = gr.Textbox(label="Mensaje")
166
  btn_login = gr.Button("Entrar")
167
- def login_click(email, password, state_user):
168
- mensaje, exito, nombre = iniciar_sesion(email,password)
169
- if exito: state_user.value = nombre
170
- return mensaje, gr.Tabs.update(visible=exito)
171
- btn_login.click(login_click, inputs=[email_login, pass_login, user_name], outputs=[salida_login])
172
-
173
- # ----- TABS NUTRIBOT (ocultas hasta login) -----
174
- with gr.Tabs(visible=False) as tabs_nuti:
175
- gr.Markdown(lambda name: f"## 👋 Hola, **{name}**", user_name)
176
-
177
  with gr.Tab("🧍 Tu perfil"):
178
  edad = gr.Number(label="Edad (años)")
179
  peso = gr.Number(label="Peso (kg)")
@@ -183,24 +96,15 @@ with gr.Blocks() as demo:
183
  btn_meta = gr.Button("Calcular meta calórica")
184
  salida_meta = gr.Textbox(label="Resultado")
185
  btn_meta.click(calcular_calorias, inputs=[edad,peso,altura,sexo,actividad], outputs=salida_meta)
186
-
187
- with gr.Tab("📸 Tu comida"):
188
- img = gr.Image(type="pil", label="Sube una foto de tu comida")
189
- btn_foto = gr.Button("Analizar comida")
190
- salida_foto = gr.Textbox(label="Resultado")
191
- btn_foto.click(analizar_foto, inputs=img, outputs=salida_foto)
192
-
193
- with gr.Tab("🏃 Actividad física"):
194
- tipo = gr.Dropdown(list(actividades.keys()), label="Tipo de actividad")
195
- duracion = gr.Number(label="Duración (minutos)")
196
- btn_act = gr.Button("Registrar actividad")
197
- salida_act = gr.Textbox(label="Resultado")
198
- btn_act.click(registrar_actividad, inputs=[tipo,duracion], outputs=salida_act)
199
-
200
- with gr.Tab("🧠 Coach emocional"):
201
- emocion = gr.Textbox(label="¿Cómo te sientes hoy?")
202
- btn_emocion = gr.Button("Enviar emoción")
203
- salida_emocion = gr.Textbox(label="Consejo")
204
- btn_emocion.click(coach_emocional, inputs=emocion, outputs=salida_emocion)
205
-
206
-
 
7
  from chatbot_nuti import buscar_respuesta
8
  from optimizacion import resize_imagen, cargar_modelo_ligero, cache_resultado
9
 
10
+ # ---- Archivos ----
11
  USUARIOS_FILE = "usuarios.json"
12
  SESION_FILE = "sesion.json"
13
 
14
  def cargar_usuarios():
15
  if os.path.exists(USUARIOS_FILE):
16
+ with open(USUARIOS_FILE,"r") as f:
17
  return json.load(f)
18
  return {}
19
 
20
  def guardar_usuarios(data):
21
+ with open(USUARIOS_FILE,"w") as f:
22
+ json.dump(data,f,indent=4)
23
 
24
+ def registrar_usuario(nombre,email,password):
25
  usuarios = cargar_usuarios()
26
  if email in usuarios:
27
  return "⚠️ Ya existe una cuenta con ese correo."
28
+ usuarios[email] = {"nombre": nombre,"password": password}
29
  guardar_usuarios(usuarios)
30
  return "✅ Registro exitoso. ¡Ahora puedes iniciar sesión!"
31
 
32
+ def iniciar_sesion(email,password):
33
  usuarios = cargar_usuarios()
34
  if email not in usuarios:
35
  return "❌ Usuario no encontrado.", False, ""
36
  if usuarios[email]["password"] != password:
37
  return "🔐 Contraseña incorrecta.", False, ""
38
  # Guardar sesión
39
+ with open(SESION_FILE,"w") as f:
40
+ json.dump({"usuario": email,"nombre": usuarios[email]["nombre"]}, f)
41
  return f"✅ Bienvenido de nuevo, {usuarios[email]['nombre']}!", True, usuarios[email]['nombre']
42
 
43
+ # ---- Estado ----
44
  estado = cargar_registro()
45
+ for k,v in {"meta_diaria":0,"restantes":0,"quemas":0,"puntos":0,"registro":[],"badges":[],"emocion":"","nivel":1}.items():
46
+ estado.setdefault(k,v)
 
 
 
47
 
 
48
  modelo = cargar_modelo_ligero()
49
 
50
+ # ---- Funciones ejemplo (tu código original aquí) ----
51
+ # Solo pongo la de calcular_calorias para acortar
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  def calcular_calorias(edad, peso, altura, sexo, actividad):
53
+ if sexo.lower()=="hombre":
54
+ bmr = 88.36 + (13.4*peso) + (4.8*altura) - (5.7*edad)
55
  else:
56
+ bmr = 447.6 + (9.2*peso) + (3.1*altura) - (4.3*edad)
57
+ niveles = {"Sedentario":1.2,"Ligero":1.375,"Moderado":1.55,"Activo":1.725,"Muy activo":1.9}
58
+ tdee = bmr * niveles.get(actividad,1.2)
59
  estado["meta_diaria"] = round(tdee)
60
  estado["restantes"] = round(tdee)
61
  guardar_registro(estado)
62
  return f"🔥 Tu meta calórica diaria es de {round(tdee)} cal."
63
 
64
+ # ---- Interfaz ----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  with gr.Blocks() as demo:
66
+ user_name = gr.State("")
67
+
68
+ # --- Login / Registro ---
69
+ with gr.Column():
70
+ gr.Markdown("### Bienvenido a NutriBot Ultra 🥦\nPrimero inicia sesión o crea una cuenta.")
71
+
72
+ gr.Markdown("**Registro:**")
73
  nombre_reg = gr.Textbox(label="Nombre completo")
74
  email_reg = gr.Textbox(label="Correo electrónico")
75
  pass_reg = gr.Textbox(label="Contraseña", type="password")
76
+ salida_reg = gr.Textbox(label="Resultado")
77
  btn_reg = gr.Button("Crear cuenta")
78
  btn_reg.click(registrar_usuario, inputs=[nombre_reg,email_reg,pass_reg], outputs=salida_reg)
79
+
80
+ gr.Markdown("**Iniciar sesión:**")
81
  email_login = gr.Textbox(label="Correo electrónico")
82
  pass_login = gr.Textbox(label="Contraseña", type="password")
83
  salida_login = gr.Textbox(label="Mensaje")
84
  btn_login = gr.Button("Entrar")
85
+
86
+ # --- Tabs de NutriBot, ocultos hasta login ---
87
+ tabs_nuti = gr.Tabs(visible=False)
88
+ with tabs_nuti:
89
+ saludo = gr.Markdown("## 👋 Hola")
 
 
 
 
 
90
  with gr.Tab("🧍 Tu perfil"):
91
  edad = gr.Number(label="Edad (años)")
92
  peso = gr.Number(label="Peso (kg)")
 
96
  btn_meta = gr.Button("Calcular meta calórica")
97
  salida_meta = gr.Textbox(label="Resultado")
98
  btn_meta.click(calcular_calorias, inputs=[edad,peso,altura,sexo,actividad], outputs=salida_meta)
99
+
100
+ # --- Función del login ---
101
+ def login_click(email,password):
102
+ mensaje, exito, nombre = iniciar_sesion(email,password)
103
+ if exito:
104
+ user_name.value = nombre
105
+ saludo.update(f"## 👋 Hola, **{nombre}**")
106
+ tabs_nuti.update(visible=True)
107
+ return mensaje
108
+ btn_login.click(login_click, inputs=[email_login, pass_login], outputs=salida_login)
109
+
110
+ demo.launch()