68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
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)
|