Add lobby MVP endpoints for create/join/session-state

This commit is contained in:
2026-02-27 12:22:15 +01:00
parent eed7bc73ee
commit ddad1bc914
2 changed files with 86 additions and 2 deletions

8
lobby/urls.py Normal file
View File

@@ -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/<str:code>', views.session_state, name='lobby-session-state'),
]

View File

@@ -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,
})