import asyncio import json from fastapi import FastAPI, WebSocket, Request, Depends from fastapi.responses import HTMLResponse, RedirectResponse from starlette.websockets import WebSocketDisconnect from starlette.middleware.base import BaseHTTPMiddleware from sqlalchemy.orm import Session from chat_listeners import listen_youtube_chat, listen_twitch_chat from auth import router as auth_router, serializer from database import get_db, User, create_tables app = FastAPI() @app.on_event("startup") async def startup_event(): create_tables() # The chat listeners will be started dynamically based on user activity # and not on application startup. class SessionMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): response = await call_next(request) session_cookie = request.cookies.get("session") if session_cookie: try: data = serializer.loads(session_cookie, max_age=3600 * 24 * 7) # 1 week db = next(get_db()) user = db.query(User).filter(User.id == data["user_id"]).first() request.state.user = user except Exception: request.state.user = None else: request.state.user = None return response @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/login", response_class=HTMLResponse) async def get_login_page(): with open("login.html", "r") as f: return f.read() @app.get("/dashboard", response_class=HTMLResponse) async def get_dashboard(user: User = Depends(get_current_user)): if not user: return RedirectResponse(url="/login") with open("dashboard.html", "r") as f: return f.read() @app.get("/overlay", response_class=HTMLResponse) async def get_overlay(): with open("index.html", "r") as f: return f.read() @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() connected_clients.append(websocket) try: while True: # Keep the connection alive, or handle incoming messages if needed await websocket.receive_text() except WebSocketDisconnect: connected_clients.remove(websocket)