Add lobby MVP endpoints for create/join/session-state
This commit is contained in:
8
lobby/urls.py
Normal file
8
lobby/urls.py
Normal 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'),
|
||||
]
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user