Files
weirsoe-party-protocol/lobby/views.py
T

80 lines
2.5 KiB
Python

import random
import string
import json
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,
})