From ddad1bc91437e6d3086741d703abb2e9bbc2b328 Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Fri, 27 Feb 2026 12:22:15 +0100 Subject: [PATCH] Add lobby MVP endpoints for create/join/session-state --- lobby/urls.py | 8 +++++ lobby/views.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 lobby/urls.py diff --git a/lobby/urls.py b/lobby/urls.py new file mode 100644 index 0000000..7df9970 --- /dev/null +++ b/lobby/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('create', views.create_session, name='lobby-create-session'), + path('join', views.join_session, name='lobby-join-session'), + path('state/', views.session_state, name='lobby-session-state'), +] diff --git a/lobby/views.py b/lobby/views.py index 91ea44a..8534a5d 100644 --- a/lobby/views.py +++ b/lobby/views.py @@ -1,3 +1,79 @@ -from django.shortcuts import render +import random +import string +import json -# Create your views here. +from django.contrib.auth.decorators import login_required +from django.http import JsonResponse +from django.views.decorators.http import require_GET, require_POST +from django.views.decorators.csrf import csrf_exempt + +from fupogfakta.models import GameSession, Player + + +def _session_code(length: int = 6) -> str: + alphabet = string.ascii_uppercase + string.digits + for _ in range(20): + code = ''.join(random.choice(alphabet) for _ in range(length)) + if not GameSession.objects.filter(code=code).exists(): + return code + raise RuntimeError('Kunne ikke generere unik session-kode') + + +@login_required +@require_POST +def create_session(request): + session = GameSession.objects.create(host=request.user, code=_session_code()) + return JsonResponse({'ok': True, 'session': {'code': session.code, 'status': session.status}}) + + +@csrf_exempt +@require_POST +def join_session(request): + try: + payload = json.loads(request.body.decode('utf-8')) + except Exception: + payload = {} + + code = (payload.get('code') or '').strip().upper() + nickname = (payload.get('nickname') or '').strip() + + if not code or not nickname: + return JsonResponse({'ok': False, 'error': 'Mangler code eller nickname'}, status=400) + + try: + session = GameSession.objects.get(code=code) + except GameSession.DoesNotExist: + return JsonResponse({'ok': False, 'error': 'Ugyldig session-kode'}, status=404) + + if session.status == GameSession.Status.FINISHED: + return JsonResponse({'ok': False, 'error': 'Spillet er afsluttet'}, status=409) + + player, _created = Player.objects.get_or_create(session=session, nickname=nickname) + player.is_connected = True + player.save(update_fields=['is_connected']) + + return JsonResponse({ + 'ok': True, + 'player': {'id': player.id, 'nickname': player.nickname}, + 'session': {'code': session.code, 'status': session.status}, + }) + + +@require_GET +def session_state(_request, code: str): + code = code.strip().upper() + try: + session = GameSession.objects.get(code=code) + except GameSession.DoesNotExist: + return JsonResponse({'ok': False, 'error': 'Ugyldig session-kode'}, status=404) + + players = list(session.players.values('id', 'nickname', 'score', 'is_connected')) + return JsonResponse({ + 'ok': True, + 'session': { + 'code': session.code, + 'status': session.status, + 'current_round': session.current_round, + }, + 'players': players, + })