Spaces:
Sleeping
Sleeping
| import json | |
| import uuid | |
| from datetime import datetime | |
| from pathlib import Path | |
| from typing import Any, Dict, Optional | |
| import streamlit as st | |
| def init_analytics_state() -> None: | |
| """Initialize analytics-related session state variables""" | |
| if "logged_visit" not in st.session_state: | |
| st.session_state.logged_visit = False | |
| if "visitor_id" not in st.session_state: | |
| st.session_state.visitor_id = str(uuid.uuid4()) | |
| def log_visit(current_section: Optional[str] = None) -> None: | |
| """Log visitor analytics including timestamp, user agent, and page info""" | |
| if st.session_state.get("admin_authenticated", False): | |
| return | |
| log_file = Path("analytics.json") | |
| now = datetime.now() | |
| today = now.strftime("%Y-%m-%d") | |
| try: | |
| user_agent = st.context.headers.get("User-Agent", "Unknown") | |
| except Exception: | |
| user_agent = "Unknown" | |
| visit_type = ( | |
| "initial" if not st.session_state.get("logged_visit") else "section_change" | |
| ) | |
| visit_data = { | |
| "timestamp": now.isoformat(), | |
| "date": today, | |
| "user_agent": user_agent, | |
| "visitor_id": st.session_state.visitor_id, | |
| "page_section": current_section | |
| or st.session_state.get("current_section", "Overall Summary"), | |
| "visit_type": visit_type, | |
| "query_params": dict(st.query_params), | |
| } | |
| # Initialize default data structure | |
| data = { | |
| "visits": [], | |
| "daily_counts": {}, | |
| "section_counts": {}, | |
| "daily_visitors": {}, | |
| } | |
| # Try to load existing data, fallback to default if corrupted | |
| if log_file.exists(): | |
| try: | |
| with open(log_file, "r") as f: | |
| data = json.load(f) | |
| if "visits" not in data: | |
| data["visits"] = [] | |
| if "daily_counts" not in data: | |
| data["daily_counts"] = {} | |
| if "section_counts" not in data: | |
| data["section_counts"] = {} | |
| if "daily_visitors" not in data: | |
| data["daily_visitors"] = {} | |
| except json.JSONDecodeError: | |
| # If file is corrupted, backup the old file and start fresh | |
| if log_file.exists(): | |
| backup_file = log_file.with_suffix(".json.bak") | |
| log_file.rename(backup_file) | |
| if today not in data["daily_visitors"]: | |
| data["daily_visitors"][today] = [] | |
| if st.session_state.visitor_id not in data["daily_visitors"][today]: | |
| data["daily_visitors"][today].append(st.session_state.visitor_id) | |
| data["daily_counts"][today] = len(data["daily_visitors"][today]) | |
| data["visits"].append(visit_data) | |
| current_section = visit_data["page_section"] | |
| data["section_counts"][current_section] = ( | |
| data["section_counts"].get(current_section, 0) + 1 | |
| ) | |
| with open(log_file, "w") as f: | |
| json.dump(data, f, indent=2) | |
| def get_analytics_data() -> Dict[str, Any]: | |
| """Load and return analytics data from file""" | |
| log_file = Path("analytics.json") | |
| if not log_file.exists(): | |
| return {} | |
| with open(log_file, "r") as f: | |
| return json.load(f) | |