Skip to content

Commit 434db99

Browse files
Merge pull request #51 from sagnik-create/Sql_Database
[Feature]: Pull request for Adding database capabilities to the chat-interface.py to make it more personalized #41
2 parents 0de15c0 + 38d2a1f commit 434db99

File tree

5 files changed

+194
-210
lines changed

5 files changed

+194
-210
lines changed

TalkHeal.py

Lines changed: 70 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,25 @@
99
)
1010

1111
import google.generativeai as genai
12+
from core.db import init_db, create_user, get_user_by_username, create_chat, add_message, get_messages
13+
14+
# --- ENSURE TABLES EXIST BEFORE ANY DB USAGE ---
15+
init_db()
16+
1217
from core.utils import save_conversations, load_conversations
1318
from core.config import configure_gemini, PAGE_CONFIG
14-
from core.utils import get_current_time, create_new_conversation
19+
from core.utils import get_current_time,get_ai_response
1520
from css.styles import apply_custom_css
1621
from components.header import render_header
1722
from components.sidebar import render_sidebar
18-
from components.chat_interface import render_chat_interface, handle_chat_input
23+
from components.chat_interface import render_chat_interface
1924
from components.emergency_page import render_emergency_page
20-
25+
from core.db import init_db, get_messages, add_message, create_chat
26+
from core.db import get_user_by_username, create_user # <-- Add this line, adjust module if needed
27+
# --- ENSURE TABLES EXIST BEFORE ANY DB USAGE ---
28+
init_db()
2129

2230
# --- 1. INITIALIZE SESSION STATE ---
23-
if "chat_history" not in st.session_state:
24-
st.session_state.chat_history = []
25-
if "conversations" not in st.session_state:
26-
st.session_state.conversations = load_conversations()
27-
if "active_conversation" not in st.session_state:
28-
st.session_state.active_conversation = -1
2931
if "show_emergency_page" not in st.session_state:
3032
st.session_state.show_emergency_page = False
3133
if "sidebar_state" not in st.session_state:
@@ -37,8 +39,10 @@
3739
"Substance Use Disorders", "ADHD & Neurodevelopmental", "Personality Disorders",
3840
"Sleep Disorders"
3941
]
40-
if "selected_tone" not in st.session_state:
41-
st.session_state.selected_tone = "Compassionate Listener"
42+
if "user_id" not in st.session_state:
43+
st.session_state.user_id = None
44+
if "active_chat_id" not in st.session_state:
45+
st.session_state.active_chat_id = None
4246

4347
# --- 2. SET PAGE CONFIG ---
4448

@@ -70,34 +74,72 @@ def get_tone_prompt():
7074
return TONE_OPTIONS.get(st.session_state.get("selected_tone", "Compassionate Listener"), TONE_OPTIONS["Compassionate Listener"])
7175

7276
# --- 6. RENDER SIDEBAR ---
73-
render_sidebar()
77+
def render_sidebar():
78+
from core.db import get_chats_for_user, create_chat
79+
if "user_id" in st.session_state and st.session_state.user_id:
80+
chats = get_chats_for_user(st.session_state.user_id)
81+
for chat in chats:
82+
if st.button(chat["title"], key=f"chat_{chat['id']}"):
83+
st.session_state.active_chat_id = chat["id"]
84+
st.rerun()
85+
if st.button("➕ New Chat"):
86+
chat_id = create_chat(st.session_state.user_id, "Untitled Chat")
87+
st.session_state.active_chat_id = chat_id
88+
st.rerun()
7489

7590
# --- 7. PAGE ROUTING ---
7691
main_area = st.container()
7792

78-
if not st.session_state.conversations:
79-
saved_conversations = load_conversations()
80-
if saved_conversations:
81-
st.session_state.conversations = saved_conversations
82-
if st.session_state.active_conversation == -1:
83-
st.session_state.active_conversation = 0
84-
else:
85-
create_new_conversation()
86-
st.session_state.active_conversation = 0
87-
st.rerun()
88-
8993
# --- 8. RENDER PAGE ---
9094
if st.session_state.get("show_emergency_page"):
9195
with main_area:
9296
render_emergency_page()
9397
else:
9498
with main_area:
9599
render_header()
96-
st.subheader(f"🗣️ Current Chatbot Tone: **{st.session_state['selected_tone']}**")
97-
render_chat_interface()
98-
handle_chat_input(model, system_prompt=get_tone_prompt())
100+
render_chat_interface(model)
101+
102+
# User login/register
103+
from core.db import create_user, get_user_by_username
104+
105+
if "user_id" not in st.session_state or st.session_state.user_id is None:
106+
st.title("Login / Register")
107+
username = st.text_input("Username")
108+
email = st.text_input("Email")
109+
if st.button("Register/Login"):
110+
user = get_user_by_username(username)
111+
# Add this block to check for existing email
112+
from core.db import get_user_by_email
113+
existing_email_user = get_user_by_email(email)
114+
if existing_email_user and (not user or existing_email_user["id"] != (user["id"] if user else None)):
115+
st.error("This email is already registered. Please use another email or log in with the existing username.")
116+
else:
117+
if not user:
118+
create_user(username, email)
119+
user = get_user_by_username(username)
120+
st.session_state.user_id = user["id"]
121+
st.success(f"Logged in as {username}")
122+
st.rerun()
123+
st.stop()
124+
125+
# Start new chat
126+
if st.button("➕ New Chat"):
127+
chat_id = create_chat(st.session_state.user_id, "Untitled Chat")
128+
st.session_state.active_chat_id = chat_id
129+
st.experimental_rerun()
130+
131+
# Send message
132+
user_input = st.text_input("Message", key="message_input")
133+
if st.button("Send") and user_input.strip() and st.session_state.get("active_chat_id"):
134+
add_message(st.session_state.active_chat_id, "user", user_input.strip())
135+
st.experimental_rerun()
136+
137+
# Display chat history
138+
if st.session_state.get("active_chat_id"):
139+
messages = get_messages(st.session_state.active_chat_id)
140+
for msg in messages:
141+
st.write(f"{msg['sender']}: {msg['message']}")
99142

100-
# --- 9. SCROLL SCRIPT ---
101143
st.markdown("""
102144
<script>
103145
function scrollToBottom() {
@@ -108,4 +150,4 @@ def get_tone_prompt():
108150
}
109151
setTimeout(scrollToBottom, 100);
110152
</script>
111-
""", unsafe_allow_html=True)
153+
""", unsafe_allow_html=True)

components/chat_interface.py

Lines changed: 31 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,144 +1,47 @@
11
import streamlit as st
2-
import streamlit.components.v1 as components
3-
from datetime import datetime
4-
from core.utils import get_current_time, get_ai_response, save_conversations
5-
import requests
2+
from core.db import get_messages, add_message
3+
from core.utils import get_current_time, get_ai_response
64

7-
# Inject JS to get user's local time zone
8-
def set_user_time_in_session():
9-
if "user_time_offset" not in st.session_state:
10-
components.html("""
11-
<script>
12-
const offset = new Date().getTimezoneOffset();
13-
const time = new Date().toLocaleString();
14-
const data = {offset: offset, time: time};
15-
window.parent.postMessage({type: 'USER_TIME', data: data}, '*');
16-
</script>
17-
""", height=0)
5+
def render_chat_interface(model):
6+
chat_id = st.session_state.get("active_chat_id")
7+
if not chat_id:
8+
st.info("Start a new chat to begin.")
9+
return
1810

11+
messages = get_messages(chat_id)
12+
if not messages:
1913
st.markdown("""
20-
<script>
21-
window.addEventListener("message", (event) => {
22-
if (event.data.type === "USER_TIME") {
23-
const payload = JSON.stringify(event.data.data);
24-
fetch("/", {
25-
method: "POST",
26-
headers: {"Content-Type": "application/json"},
27-
body: payload
28-
}).then(() => location.reload());
29-
}
30-
});
31-
</script>
14+
<div class="welcome-message">
15+
<strong>Hello! I'm TalkHeal, your mental health companion</strong><br>
16+
How are you feeling today? You can write it down below or for a fresh start click on "➕ New Chat" 😊
17+
</div>
3218
""", unsafe_allow_html=True)
3319

34-
set_user_time_in_session()
35-
36-
# Display chat messages
37-
def render_chat_interface():
38-
if st.session_state.active_conversation >= 0:
39-
active_convo = st.session_state.conversations[st.session_state.active_conversation]
40-
41-
if not active_convo["messages"]:
20+
for msg in messages:
21+
if msg["sender"] == "user":
4222
st.markdown(f"""
43-
<div class="welcome-message">
44-
<strong>Hello! I'm TalkHeal, your mental health companion 🤗</strong><br>
45-
How are you feeling today? You can write below or start a new topic.
46-
<div class="message-time">{get_current_time()}</div>
23+
<div class="user-message">
24+
{msg["message"]}
25+
<div class="message-time">{msg["timestamp"]}</div>
4726
</div>
4827
""", unsafe_allow_html=True)
49-
50-
for msg in active_convo["messages"]:
51-
css_class = "user-message" if msg["sender"] == "user" else "bot-message"
28+
else:
5229
st.markdown(f"""
53-
<div class="{css_class}">
30+
<div class="bot-message">
5431
{msg["message"]}
55-
<div class="message-time">{msg["time"]}</div>
32+
<div class="message-time">{msg["timestamp"]}</div>
5633
</div>
5734
""", unsafe_allow_html=True)
5835

59-
# Handle chat input and generate AI response
60-
def handle_chat_input(model, system_prompt):
61-
if "pre_filled_chat_input" not in st.session_state:
62-
st.session_state.pre_filled_chat_input = ""
63-
initial_value = st.session_state.pre_filled_chat_input
64-
st.session_state.pre_filled_chat_input = ""
65-
6636
with st.form(key="chat_form", clear_on_submit=True):
67-
col1, col2 = st.columns([5, 1])
68-
with col1:
69-
user_input = st.text_input(
70-
"Share your thoughts...",
71-
key="message_input",
72-
label_visibility="collapsed",
73-
placeholder="Type your message here...",
74-
value=initial_value
75-
)
76-
with col2:
77-
send_pressed = st.form_submit_button("Send", use_container_width=True)
78-
79-
if (send_pressed or st.session_state.get("send_chat_message", False)) and user_input.strip():
80-
if 'send_chat_message' in st.session_state:
81-
st.session_state.send_chat_message = False
82-
83-
if st.session_state.active_conversation >= 0:
84-
current_time = get_current_time()
85-
active_convo = st.session_state.conversations[st.session_state.active_conversation]
86-
87-
# Save user message
88-
active_convo["messages"].append({
89-
"sender": "user",
90-
"message": user_input.strip(),
91-
"time": current_time
92-
})
93-
94-
# Set title if it's the first message
95-
if len(active_convo["messages"]) == 1:
96-
title = user_input[:30] + "..." if len(user_input) > 30 else user_input
97-
active_convo["title"] = title
98-
99-
save_conversations(st.session_state.conversations)
100-
101-
# Format memory
102-
def format_memory(convo_history, max_turns=10):
103-
context = ""
104-
for msg in convo_history[-max_turns*2:]: # user + bot per turn
105-
sender = "User" if msg["sender"] == "user" else "Bot"
106-
context += f"{sender}: {msg['message']}\n"
107-
return context
108-
109-
try:
110-
with st.spinner("TalkHeal is thinking..."):
111-
memory = format_memory(active_convo["messages"])
112-
prompt = f"{system_prompt}\n\n{memory}\nUser: {user_input.strip()}\nBot:"
113-
ai_response = get_ai_response(prompt, model)
114-
115-
active_convo["messages"].append({
116-
"sender": "bot",
117-
"message": ai_response,
118-
"time": get_current_time()
119-
})
120-
121-
except ValueError as e:
122-
st.error("I'm having trouble understanding your message. Could you please rephrase it?")
123-
active_convo["messages"].append({
124-
"sender": "bot",
125-
"message": "I'm having trouble understanding your message. Could you please rephrase it?",
126-
"time": get_current_time()
127-
})
128-
except requests.RequestException as e:
129-
st.error("Network connection issue. Please check your internet connection.")
130-
active_convo["messages"].append({
131-
"sender": "bot",
132-
"message": "I'm having trouble connecting to my services. Please check your internet connection and try again.",
133-
"time": get_current_time()
134-
})
135-
except Exception as e:
136-
st.error(f"An unexpected error occurred. Please try again.")
137-
active_convo["messages"].append({
138-
"sender": "bot",
139-
"message": "I'm having trouble responding right now. Please try again in a moment.",
140-
"time": get_current_time()
141-
})
37+
user_input = st.text_input("Share your thoughts...", key="message_input", label_visibility="collapsed")
38+
send_pressed = st.form_submit_button("Send")
39+
if send_pressed and user_input.strip():
40+
add_message(chat_id, "user", user_input.strip())
41+
with st.spinner("TalkHeal is thinking..."):
42+
context = "\n".join([f"{m['sender'].capitalize()}: {m['message']}" for m in get_messages(chat_id)])
43+
prompt = context + f"\nUser: {user_input.strip()}\nBot:"
44+
ai_response = get_ai_response(prompt, model)
45+
add_message(chat_id, "bot", ai_response)
46+
st.rerun()
14247

143-
save_conversations(st.session_state.conversations)
144-
st.rerun()

0 commit comments

Comments
 (0)