80 lines
2.5 KiB
Python
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,
|
|
})
|