From 86e5caee1b619752789ba93e22af5314784da785 Mon Sep 17 00:00:00 2001 From: tilakjain619 Date: Wed, 23 Jul 2025 19:08:36 +0530 Subject: [PATCH 1/2] Enhance Crisis Support with GeoIP-based helpline detection and IASP fallback --- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 145 bytes .../chat_interface.cpython-312.pyc | Bin 0 -> 6174 bytes components/__pycache__/header.cpython-312.pyc | Bin 0 -> 1718 bytes .../__pycache__/sidebar.cpython-312.pyc | Bin 0 -> 16930 bytes components/sidebar.py | 53 +++++++++++++----- core/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 139 bytes core/__pycache__/config.cpython-312.pyc | Bin 0 -> 1393 bytes core/__pycache__/utils.cpython-312.pyc | Bin 0 -> 4232 bytes css/__pycache__/styles.cpython-312.pyc | Bin 0 -> 16574 bytes requirements.txt | 3 +- 10 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 components/__pycache__/__init__.cpython-312.pyc create mode 100644 components/__pycache__/chat_interface.cpython-312.pyc create mode 100644 components/__pycache__/header.cpython-312.pyc create mode 100644 components/__pycache__/sidebar.cpython-312.pyc create mode 100644 core/__pycache__/__init__.cpython-312.pyc create mode 100644 core/__pycache__/config.cpython-312.pyc create mode 100644 core/__pycache__/utils.cpython-312.pyc create mode 100644 css/__pycache__/styles.cpython-312.pyc diff --git a/components/__pycache__/__init__.cpython-312.pyc b/components/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcd4eed1fea040415bedca772d2af12f0d07c176 GIT binary patch literal 145 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 G!~X!7YO8+$ literal 0 HcmV?d00001 diff --git a/components/__pycache__/sidebar.cpython-312.pyc b/components/__pycache__/sidebar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e428d2aa73f6620fdf294f1ec31e2cc950986f08 GIT binary patch literal 16930 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 SVP=L`ABmPEA`QI)6#IVxhmAe} literal 0 HcmV?d00001 diff --git a/components/sidebar.py b/components/sidebar.py index 6d9aeee..8d911bd 100644 --- a/components/sidebar.py +++ b/components/sidebar.py @@ -2,20 +2,38 @@ import webbrowser from datetime import datetime from core.utils import create_new_conversation, get_current_time - -# Emergency contacts and resources -emergency_resources = { - "Crisis Hotlines": [ +import requests + +# Get the user's country based on their IP address +# This is used to provide localized resources and emergency contacts. +def get_user_country(): + try: + resp = requests.get("https://ipinfo.io/json", timeout=2) + if resp.status_code == 200: + data = resp.json() + return data.get("country", None) + except Exception: + pass + return None + +country_helplines = { + "US": [ "National Suicide Prevention Lifeline: 988", "Crisis Text Line: Text HOME to 741741", "SAMHSA National Helpline: 1-800-662-4357" ], - "International": [ - "India: 9152987821 (AASRA)", - "UK: 116 123 (Samaritans)", - "Australia: 13 11 14 (Lifeline)" + "IN": [ + "AASRA: 9152987821", + "Sneha Foundation: 044-24640050" + ], + "GB": [ + "Samaritans: 116 123" + ], + "AU": [ + "Lifeline: 13 11 14" ] } +IASP_LINK = "https://findahelpline.com/" mental_health_resources_full = { "Depression & Mood Disorders": { @@ -282,11 +300,20 @@ def render_sidebar(): st.markdown("---") with st.expander("☎️ Crisis Support"): - st.markdown("**24/7 Crisis Hotlines:**") - for category, numbers in emergency_resources.items(): - st.markdown(f"**{category}:**") - for number in numbers: - st.markdown(f"• {number}") + # Provide localized helplines based on user's country + user_country = get_user_country() + country_label = user_country if user_country else "your country" + st.markdown("### 🚨 Emergency Help") + if user_country and user_country in country_helplines: + st.markdown(f"**Helplines for {country_label}:**") + for line in country_helplines[user_country]: + st.markdown(f"• {line}") + else: + st.markdown( + f"Couldn't detect a local helpline for {country_label}. [Find help worldwide via IASP]({IASP_LINK})" + ) + + st.markdown("---") with st.expander("ℹ️ About TalkHeal"): st.markdown(""" diff --git a/core/__pycache__/__init__.cpython-312.pyc b/core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71f37cdfc85fc2b3f2fdb2c352ac7a8fdd6737f8 GIT binary patch literal 139 zcmX@j%ge<81fGu?GC=fW5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!(sH$m2}w=Ph;a`N z&UaQYGK~pI%*pmhP0Wc&&M!)hiI30B%PfhH*DI*}#bJ}1pHiBWYFESx)XE6N#URE< MW=2NFB4!{90KBpu;s5{u literal 0 HcmV?d00001 diff --git a/core/__pycache__/config.cpython-312.pyc b/core/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cbdb0670bd6518363608088a5f727f8e24b2bb4 GIT binary patch literal 1393 zcmah|&u<$=6rS1juGhcfO`KE#Db=VYp^g-{v}#Ez1aczRSZP8e=RmATtF3opue;v0 zX2(rzHON97(o?B8Uo zNyq|QIxRQVZQZ*6G1jfSPRU8t>{1i?9<+ouuuXLfd2w1s`FgG95Xu7krh%D)4{Ew? zU?VB9a7`~^jhfWLEHtpqqGL1J(i={lvKiAhsi|9<%YpZFqPbM3n1!p@u4^X6Rkt|) zn-V{8mciLY&d@Ok0Xm9SgpoNi4EPqe4*~UXgH`c+;ybuD;17b&4;;@`#*&7nA^Mqz z@FC2D%YY90?}gt1WR~NHy#t^U{TF<|$3w6K8h}ptIUIfIQ1~CT^icR3d^>jA9X>&a z!e>HbsQ2MMI1qQhK1|A+Y$BW4$Zh7d^j1z=&+PEl2KAb$-N%ilTEbP%{nGW+wWU2v zcgxLGcHlug8SxBcI~46Xb=yFujq;RWy=s{hxwuF$byH1rM>j2OAnG9A(LJ+NCm8)x z<2FhvOmHa+4iQW$VOuv@Xq3(3S!`pXQ}Y4da13lQWgRy%ggAsrc%VX=gCed`)3K8x ziE*x&R2^hO?0SQM5IVn-xxKrMi{;&HKJTod>o<4(Io&Nf1asltE>&wVb@XZN&F>R$ zKH_}4EiPK%R8XXq{?zpG;*-Vp+)`&MbrkF?vB&X8@iw~lLV2&R&UDrJjym67SUyo# zj-+0E`Y8HmKa%(zKxqy3mGEQbkWkU(_C3$FOF#Eoa^XE)lD?{}5u zwzAxd#Q!>#c>LU*ey}V$JKWfXoM?Bh?$g40#)Ao1^HH`%cb{*>hW^zp@{AII{#UH)q zL0Dufoy}-#pKRXAWe0qH56*ZAKI~kaDQ)+_T6nRPDKde&)~vKaQP*e z{UsWI68Q4duO_s~z=fSH0CyZ?#v}JL>vL^lmG}8B5&kO}^cmnC{KJ W+nc)ZIwHq~R^&_#LzT?)!hZu65LSKw literal 0 HcmV?d00001 diff --git a/core/__pycache__/utils.cpython-312.pyc b/core/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8f04da0c904d78782856403cfe411b4fb89ad0b GIT binary patch literal 4232 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 Sk7uTH-@Je9_FV31Uhm%vax`TC literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index 067175a..be2430e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ streamlit streamlit_modal google-generativeai -Pillow \ No newline at end of file +Pillow +requests \ No newline at end of file From 07658c17518fb314a54cfb0793a8738b6d75e1f1 Mon Sep 17 00:00:00 2001 From: tilakjain619 Date: Thu, 31 Jul 2025 18:28:58 +0530 Subject: [PATCH 2/2] fix: Retry GeoIP helpline detection patch after incomplete commit --- components/sidebar.py | 63 +++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/components/sidebar.py b/components/sidebar.py index 77d7307..462617e 100644 --- a/components/sidebar.py +++ b/components/sidebar.py @@ -4,8 +4,8 @@ from core.utils import create_new_conversation, get_current_time from core.theme import get_current_theme, toggle_theme, set_palette, PALETTES from components.profile import initialize_profile_state, render_profile_section +from streamlit_js_eval import streamlit_js_eval import requests -import streamlit_js_eval as st_js # --- Structured Emergency Resources --- GLOBAL_RESOURCES = [ @@ -21,44 +21,49 @@ "url": "https://www.childhelplineinternational.org/"} ] -# Get the user's country for showing localized resources. -def get_user_country(): - # First we try Streamlit's experimental user info API (client-side, most accurate) + +def get_country_from_coords(lat, lon): try: - user_info = st.experimental_user_info() if hasattr(st, "experimental_user_info") else None - if user_info and "country" in user_info and user_info["country"]: - return user_info["country"] - except Exception: + url = f"https://geocode.maps.co/reverse?lat={lat}&lon={lon}" + resp = requests.get(url, timeout=5) + if resp.status_code == 200: + data = resp.json() + return data.get("address", {}).get("country_code", "").upper() + except: pass + return None - # Second we try browser geolocation via JavaScript (requires Streamlit component, not always available) - try: - js_code = """ - navigator.geolocation.getCurrentPosition( - pos => { - fetch(`https://geocode.xyz/${pos.coords.latitude},${pos.coords.longitude}?geoit=json`) - .then(resp => resp.json()) - .then(data => window.streamlitSendToPython(data.country)); - }, - err => window.streamlitSendToPython(null) - ); - """ - country = st_js.run(js_code, key="geo_country") +def get_user_country(): + # 1. Try to get user's actual browser location (via JS) + coords = streamlit_js_eval( + js_expressions=""" + new Promise((resolve, reject) => { + navigator.geolocation.getCurrentPosition( + position => resolve({ + latitude: position.coords.latitude, + longitude: position.coords.longitude + }), + error => resolve(null) + ); + }); + """, + key="get_coords" + ) + + if coords and "latitude" in coords and "longitude" in coords: + country = get_country_from_coords(coords["latitude"], coords["longitude"]) if country: return country - except Exception: - pass - # (Fallback option): Third we try IP-based lookup (may return server location) + # 2. Fallback to IP-based location using ipapi.co (no key required) try: - resp = requests.get("https://ipinfo.io/json", timeout=2) + resp = requests.get("https://ipapi.co/json/", timeout=3) if resp.status_code == 200: - data = resp.json() - return data.get("country", None) - except Exception: + return resp.json().get("country_code", "").upper() + except: pass - return None + return None # final fallback if everything fails country_helplines = { "US": [