ArumugaSelvi commited on
Commit
e81b8a6
·
verified ·
1 Parent(s): d418199

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +153 -146
app.py CHANGED
@@ -1,222 +1,230 @@
1
  import streamlit as st
2
- import random
3
  import smtplib
4
- import datetime
5
- from email.mime.text import MIMEText
 
 
6
  from model_api import query_model
7
  from prompt_builder import build_prompt
8
 
9
- # ---------------- EMAIL CONFIG ----------------
10
- # CHANGE THESE 3 VALUES
 
11
 
12
- SENDER_EMAIL = "arumugaselvis61@gmail.com"
13
- SENDER_PASSWORD = "luassmflirakjctw"
14
  SECRET_KEY = "646d316733839e58469287c95a003062d6d01ca042d457b59517400d26068549"
15
 
16
- # ---------------- PAGE CONFIG ----------------
17
-
18
- st.set_page_config(page_title="FitPlan AI", page_icon="💪", layout="centered")
19
-
20
- # ---------------- SESSION STATE ----------------
21
-
22
- if "users" not in st.session_state:
23
- st.session_state.users = {}
24
-
25
- if "otp_store" not in st.session_state:
26
- st.session_state.otp_store = {}
27
 
28
- if "authenticated" not in st.session_state:
29
- st.session_state.authenticated = False
 
30
 
31
  if "page" not in st.session_state:
32
- st.session_state.page = "login"
33
 
34
- # ---------------- OTP GENERATION ----------------
 
35
 
36
- def generate_otp():
37
- return str(random.randint(100000, 999999))
38
 
 
 
39
 
40
- # ---------------- SEND EMAIL ----------------
 
 
 
 
 
41
 
42
- def send_otp_email(receiver_email, otp):
43
 
44
- try:
 
 
45
 
46
- msg = MIMEText(f"""
47
- Hello,
48
 
49
- Your FitPlan AI verification OTP is: {otp}
50
 
51
- This OTP will expire in 10 minutes.
52
- """)
53
 
54
- msg["Subject"] = "FitPlan AI OTP"
55
- msg["From"] = SENDER_EMAIL
56
- msg["To"] = receiver_email
57
 
 
58
  server = smtplib.SMTP("smtp.gmail.com", 587)
59
  server.starttls()
60
  server.login(SENDER_EMAIL, SENDER_PASSWORD)
61
-
62
- server.sendmail(SENDER_EMAIL, receiver_email, msg.as_string())
63
  server.quit()
64
 
65
  return True
66
 
67
  except Exception as e:
68
- st.error(f"Email sending failed: {e}")
69
  return False
70
 
71
 
72
- # =========================================================
73
- # LOGIN PAGE
74
- # =========================================================
75
 
76
- if st.session_state.page == "login":
77
 
78
- st.title("🔐 FitPlan AI Login")
 
 
 
79
 
80
- email = st.text_input("Email")
81
 
82
- if st.button("Login"):
83
 
84
- user = st.session_state.users.get(email)
85
 
86
- if not user:
87
- st.error("User not found. Please Sign Up.")
88
- else:
89
- st.session_state.authenticated = True
90
- st.session_state.page = "landing"
91
- st.rerun()
 
 
 
92
 
93
- if st.button("New User? Sign Up"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  st.session_state.page = "signup"
95
  st.rerun()
96
 
 
 
 
 
97
 
98
- # =========================================================
99
  # SIGNUP PAGE
100
- # =========================================================
101
 
102
  elif st.session_state.page == "signup":
103
 
104
- st.title("📝 Sign Up")
105
 
106
  email = st.text_input("Enter Email")
107
 
108
  if st.button("Send OTP"):
109
 
110
- if not email:
111
- st.error("Enter email first")
112
 
113
- else:
114
 
115
- otp = generate_otp()
116
 
117
- st.session_state.otp_store[email] = {
118
- "otp": otp,
119
- "expiry": datetime.datetime.utcnow() + datetime.timedelta(minutes=10)
120
- }
121
 
122
- if send_otp_email(email, otp):
123
 
124
- st.success("OTP sent to your email")
 
125
 
126
- st.session_state.current_email = email
127
- st.session_state.page = "verify"
128
- st.rerun()
129
 
130
- if st.button("Back to Login"):
131
- st.session_state.page = "login"
132
- st.rerun()
133
 
 
134
 
135
- # =========================================================
136
- # OTP VERIFY PAGE
137
- # =========================================================
138
 
139
- elif st.session_state.page == "verify":
 
140
 
141
- st.title("🔢 Verify OTP")
142
 
143
- otp_input = st.text_input("Enter OTP")
 
144
 
145
- if st.button("Verify OTP"):
 
 
 
 
 
 
 
146
 
147
- email = st.session_state.current_email
148
- data = st.session_state.otp_store.get(email)
149
 
150
- if not data:
151
- st.error("Session expired")
152
 
153
- elif datetime.datetime.utcnow() > data["expiry"]:
154
- st.error("OTP expired")
155
 
156
- elif otp_input == data["otp"]:
157
 
158
- st.session_state.users[email] = True
159
 
160
- st.success("Signup successful. Please login.")
161
 
162
- st.session_state.page = "login"
 
 
 
163
  st.rerun()
164
 
165
  else:
166
- st.error("Invalid OTP")
167
 
 
 
 
168
 
169
- # =========================================================
170
- # LANDING PAGE
171
- # =========================================================
172
 
173
- elif st.session_state.page == "landing" and st.session_state.authenticated:
 
 
174
 
175
- st.markdown("""
176
- <style>
177
- [data-testid="stAppViewContainer"] {
178
- background-image: url("https://images.unsplash.com/photo-1483721310020-03333e577078");
179
- background-size: cover;
180
- background-position: center;
181
- }
182
- .center-box {
183
- text-align:center;
184
- margin-top:200px;
185
- font-size:48px;
186
- font-weight:bold;
187
- color:black;
188
- }
189
- </style>
190
- """, unsafe_allow_html=True)
191
 
192
- st.markdown('<div class="center-box">💪 Welcome to FitPlan AI</div>', unsafe_allow_html=True)
193
 
194
- if st.button("🚀 Get Started"):
195
- st.session_state.page = "main"
196
- st.rerun()
197
-
198
- if st.button("Logout"):
199
- st.session_state.authenticated = False
200
  st.session_state.page = "login"
201
  st.rerun()
202
 
 
203
 
204
- # =========================================================
205
- # PROFILE PAGE
206
- # =========================================================
207
 
208
- elif st.session_state.page == "main":
209
-
210
- st.title("💪 FitPlan AI")
211
 
212
  name = st.text_input("Name")
213
- age = st.number_input("Age", min_value=10, max_value=100)
 
214
  gender = st.selectbox("Gender", ["Male", "Female", "Other"])
215
- height_cm = st.number_input("Height (cm)")
216
- weight_kg = st.number_input("Weight (kg)")
 
217
 
218
  goal = st.selectbox(
219
- "Fitness Goal",
220
  ["Build Muscle", "Weight Loss", "Strength Gain", "Abs Building"]
221
  )
222
 
@@ -230,34 +238,33 @@ elif st.session_state.page == "main":
230
  ["Beginner", "Intermediate", "Advanced"]
231
  )
232
 
233
- if st.button("Generate Plan"):
 
 
234
 
235
  prompt, bmi, bmi_status = build_prompt(
236
- name, age, gender, height_cm, weight_kg,
237
- goal, fitness_level, equipment
 
 
 
 
 
 
238
  )
239
 
240
- with st.spinner("Generating Workout Plan..."):
241
  result = query_model(prompt)
242
 
243
- st.session_state.workout_plan = result
244
- st.session_state.bmi = bmi
245
- st.session_state.bmi_status = bmi_status
246
- st.session_state.page = "result"
247
- st.rerun()
248
-
249
 
250
- # =========================================================
251
- # RESULT PAGE
252
- # =========================================================
253
 
254
- elif st.session_state.page == "result":
255
 
256
- st.title("🏋️ Your Workout Plan")
257
 
258
- st.markdown(st.session_state.workout_plan)
259
- st.info(f"BMI: {st.session_state.bmi:.2f} ({st.session_state.bmi_status})")
260
 
261
- if st.button("Back"):
262
- st.session_state.page = "main"
263
  st.rerun()
 
1
  import streamlit as st
 
2
  import smtplib
3
+ import random
4
+ import jwt
5
+ from datetime import datetime, timedelta
6
+
7
  from model_api import query_model
8
  from prompt_builder import build_prompt
9
 
10
+ # ==============================
11
+ # CONFIG
12
+ # ==============================
13
 
 
 
14
  SECRET_KEY = "646d316733839e58469287c95a003062d6d01ca042d457b59517400d26068549"
15
 
16
+ SENDER_EMAIL = "arumugaselvis61@gmail.com"
17
+ SENDER_PASSWORD = "luas smfl irak jctw"
 
 
 
 
 
 
 
 
 
18
 
19
+ # ==============================
20
+ # SESSION STATE
21
+ # ==============================
22
 
23
  if "page" not in st.session_state:
24
+ st.session_state.page = "home"
25
 
26
+ if "otp" not in st.session_state:
27
+ st.session_state.otp = None
28
 
29
+ if "email" not in st.session_state:
30
+ st.session_state.email = None
31
 
32
+ if "verified" not in st.session_state:
33
+ st.session_state.verified = False
34
 
35
+ if "token" not in st.session_state:
36
+ st.session_state.token = None
37
+
38
+ # STORE USERS HERE (instead of dictionary)
39
+ if "users" not in st.session_state:
40
+ st.session_state.users = {}
41
 
 
42
 
43
+ # ==============================
44
+ # SEND OTP
45
+ # ==============================
46
 
47
+ def send_otp(email):
 
48
 
49
+ otp = str(random.randint(100000, 999999))
50
 
51
+ st.session_state.otp = otp
52
+ st.session_state.email = email
53
 
54
+ subject = "FitPlan AI OTP"
55
+ message = f"Subject:{subject}\n\nYour OTP is {otp}"
 
56
 
57
+ try:
58
  server = smtplib.SMTP("smtp.gmail.com", 587)
59
  server.starttls()
60
  server.login(SENDER_EMAIL, SENDER_PASSWORD)
61
+ server.sendmail(SENDER_EMAIL, email, message)
 
62
  server.quit()
63
 
64
  return True
65
 
66
  except Exception as e:
67
+ st.error(f"Email error: {e}")
68
  return False
69
 
70
 
71
+ # ==============================
72
+ # GENERATE JWT
73
+ # ==============================
74
 
75
+ def generate_token(email):
76
 
77
+ payload = {
78
+ "email": email,
79
+ "exp": datetime.utcnow() + timedelta(hours=2)
80
+ }
81
 
82
+ token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
83
 
84
+ return token
85
 
 
86
 
87
+ # ==============================
88
+ # VERIFY JWT
89
+ # ==============================
90
+
91
+ def verify_token(token):
92
+
93
+ try:
94
+ data = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
95
+ return data["email"]
96
 
97
+ except:
98
+ return None
99
+
100
+
101
+ # ==============================
102
+ # HOME PAGE
103
+ # ==============================
104
+
105
+ if st.session_state.page == "home":
106
+
107
+ st.title("💪 FitPlan AI")
108
+
109
+ col1, col2 = st.columns(2)
110
+
111
+ if col1.button("New User Sign Up"):
112
  st.session_state.page = "signup"
113
  st.rerun()
114
 
115
+ if col2.button("Login"):
116
+ st.session_state.page = "login"
117
+ st.rerun()
118
+
119
 
120
+ # ==============================
121
  # SIGNUP PAGE
122
+ # ==============================
123
 
124
  elif st.session_state.page == "signup":
125
 
126
+ st.header("Create Account")
127
 
128
  email = st.text_input("Enter Email")
129
 
130
  if st.button("Send OTP"):
131
 
132
+ if send_otp(email):
133
+ st.success("OTP sent to your email")
134
 
135
+ otp_input = st.text_input("Enter OTP")
136
 
137
+ if st.session_state.otp:
138
 
139
+ if st.button("Verify OTP"):
 
 
 
140
 
141
+ if otp_input == st.session_state.otp:
142
 
143
+ st.session_state.verified = True
144
+ st.success("Email Verified")
145
 
146
+ else:
147
+ st.error("Invalid OTP")
 
148
 
149
+ if st.session_state.verified:
 
 
150
 
151
+ password = st.text_input("Create Password", type="password")
152
 
153
+ if st.button("Register"):
 
 
154
 
155
+ # SAVE USER
156
+ st.session_state.users[st.session_state.email] = password
157
 
158
+ st.success("Account created successfully!")
159
 
160
+ st.session_state.page = "login"
161
+ st.rerun()
162
 
163
+ if st.button("Back"):
164
+ st.session_state.page = "home"
165
+ st.rerun()
166
+
167
+
168
+ # ==============================
169
+ # LOGIN PAGE
170
+ # ==============================
171
 
172
+ elif st.session_state.page == "login":
 
173
 
174
+ st.header("Login")
 
175
 
176
+ email = st.text_input("Email")
177
+ password = st.text_input("Password", type="password")
178
 
179
+ if st.button("Login"):
180
 
181
+ if email in st.session_state.users and st.session_state.users[email] == password:
182
 
183
+ token = generate_token(email)
184
 
185
+ st.session_state.token = token
186
+ st.session_state.page = "dashboard"
187
+
188
+ st.success("Login successful")
189
  st.rerun()
190
 
191
  else:
192
+ st.error("Invalid email or password")
193
 
194
+ if st.button("Back"):
195
+ st.session_state.page = "home"
196
+ st.rerun()
197
 
 
 
 
198
 
199
+ # ==============================
200
+ # DASHBOARD
201
+ # ==============================
202
 
203
+ elif st.session_state.page == "dashboard":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
 
205
+ email = verify_token(st.session_state.token)
206
 
207
+ if not email:
208
+ st.error("Session expired. Login again.")
 
 
 
 
209
  st.session_state.page = "login"
210
  st.rerun()
211
 
212
+ st.title("🏋 Welcome to FitPlan AI")
213
 
214
+ st.write(f"Logged in as: {email}")
 
 
215
 
216
+ # ---------------- USER PROFILE ----------------
 
 
217
 
218
  name = st.text_input("Name")
219
+ age = st.number_input("Age", min_value=10, max_value=80)
220
+
221
  gender = st.selectbox("Gender", ["Male", "Female", "Other"])
222
+
223
+ height = st.number_input("Height (cm)")
224
+ weight = st.number_input("Weight (kg)")
225
 
226
  goal = st.selectbox(
227
+ "Goal",
228
  ["Build Muscle", "Weight Loss", "Strength Gain", "Abs Building"]
229
  )
230
 
 
238
  ["Beginner", "Intermediate", "Advanced"]
239
  )
240
 
241
+ # ---------------- GENERATE PLAN ----------------
242
+
243
+ if st.button("Generate FitPlan"):
244
 
245
  prompt, bmi, bmi_status = build_prompt(
246
+ name,
247
+ age,
248
+ gender,
249
+ height,
250
+ weight,
251
+ goal,
252
+ fitness_level,
253
+ equipment
254
  )
255
 
256
+ with st.spinner("Generating AI Workout Plan..."):
257
  result = query_model(prompt)
258
 
259
+ st.subheader("Your 5-Day Workout Plan")
 
 
 
 
 
260
 
261
+ st.write(result)
 
 
262
 
263
+ st.info(f"BMI: {bmi:.2f} ({bmi_status})")
264
 
265
+ if st.button("Logout"):
266
 
267
+ st.session_state.token = None
268
+ st.session_state.page = "home"
269
 
 
 
270
  st.rerun()