@@ -204,11 +204,63 @@ def create_app(
204204 )
205205 )
206206
207- # Root redirect handler
207+ # Dashboard at root
208+ from scribbl_py .auth .db_service import DatabaseAuthService # noqa: E402, PLC0415
209+ from scribbl_py .services .game import GameService # noqa: E402, PLC0415
210+
208211 @get ("/" , include_in_schema = False )
209- async def root_redirect () -> Redirect :
210- """Redirect root to Canvas Clash game."""
211- return Redirect (path = "/canvas-clash/" )
212+ async def dashboard (
213+ game_service : GameService ,
214+ auth_service : DatabaseAuthService ,
215+ request : Request ,
216+ ) -> Template :
217+ """Render the main dashboard/home page."""
218+ from litestar .response import Template # noqa: PLC0415
219+
220+ # Get available lobby rooms
221+ lobby_rooms = game_service .get_lobby_rooms ()
222+ active_games = game_service .get_active_games ()
223+ is_debug = getattr (request .app , "debug" , False )
224+
225+ # Get logged-in user info
226+ username = None
227+ session_id = request .cookies .get (auth_service ._config .session_cookie_name )
228+ if session_id :
229+ session = await auth_service .get_session (session_id )
230+ if session and session .user_id :
231+ user = await auth_service .get_user (session .user_id )
232+ if user :
233+ username = user .username
234+
235+ return Template (
236+ template_name = "canvas_clash_home.html" ,
237+ context = {
238+ "rooms" : [
239+ {
240+ "id" : str (r .id ),
241+ "code" : r .room_code ,
242+ "name" : r .name ,
243+ "player_count" : len (r .active_guessers ()),
244+ "max_players" : r .settings .max_players ,
245+ }
246+ for r in lobby_rooms
247+ ],
248+ "active_games" : [
249+ {
250+ "id" : str (r .id ),
251+ "code" : r .room_code ,
252+ "name" : r .name ,
253+ "player_count" : len (r .active_guessers ()),
254+ "spectator_count" : len (r .spectators ()),
255+ "current_round" : r .current_round_number ,
256+ "total_rounds" : r .settings .rounds_per_game ,
257+ }
258+ for r in active_games
259+ ],
260+ "debug_mode" : is_debug ,
261+ "username" : username ,
262+ },
263+ )
212264
213265 # Favicon redirect
214266 @get ("/favicon.ico" , include_in_schema = False )
@@ -222,7 +274,7 @@ async def profile_redirect() -> Redirect:
222274 """Redirect /profile to auth profile page."""
223275 return Redirect (path = "/auth/profile" )
224276
225- route_handlers = [root_redirect , favicon_redirect , profile_redirect , HealthController ] if enable_ui else [HealthController ]
277+ route_handlers = [dashboard , favicon_redirect , profile_redirect , HealthController ] if enable_ui else [HealthController ]
226278
227279 # Configure templates if UI is enabled (must be before Litestar init for VitePlugin)
228280 template_config = None
0 commit comments