- Implement WebSocket-based lobby system for quiz participants - Add lobby page with real-time participant updates - Create LobbyConsumer for WebSocket communication - Add routing configuration for WebSocket connections - Update requirements with WebSocket dependencies - Add development and production server documentation This change enables real-time quiz lobbies where participants can join and wait for the quiz to start, with instant updates for all connected users.
120 lines
4.5 KiB
Python
120 lines
4.5 KiB
Python
from django.shortcuts import render
|
|
from django.shortcuts import render, redirect, get_object_or_404, reverse
|
|
from play.models import QuizGame, QuizGameParticipant
|
|
from library.models import QivipQuiz, QivipQuestion
|
|
from django.http import HttpResponseRedirect, HttpResponseNotFound
|
|
|
|
import json
|
|
|
|
# Create your views here.
|
|
def lobby(request, join_code):
|
|
quiz_game = get_object_or_404(QuizGame, join_code=join_code)
|
|
quiz = get_object_or_404(QivipQuiz, pk=quiz_game.quiz_id.id)
|
|
context = {
|
|
'quiz': quiz,
|
|
'quiz_game': quiz_game,
|
|
}
|
|
|
|
if "host_id" in request.COOKIES:
|
|
host_id = request.COOKIES['host_id']
|
|
if host_id == quiz_game.host_id:
|
|
context['host_id'] = host_id
|
|
return render(request, 'play/lobby.html', context=context)
|
|
|
|
if not "participant_id" in request.COOKIES:
|
|
return redirect('play:create_participant', join_code=join_code)
|
|
|
|
participant_id = request.COOKIES['participant_id']
|
|
try:
|
|
participant = QuizGameParticipant.objects.get(participant_id=participant_id)
|
|
if not participant.quiz_game.join_code == join_code: # Teilnehmer dem richtigen Spiel hinzufügen
|
|
participant.quiz_game = quiz_game
|
|
participant.save()
|
|
except QuizGameParticipant.DoesNotExist:
|
|
return redirect('play:create_participant', join_code=join_code)
|
|
|
|
context['participant'] = participant
|
|
return render(request, 'play/lobby.html', context=context)
|
|
|
|
def create_participant(request, join_code):
|
|
if "participant_id" in request.COOKIES:
|
|
# Prüfe ob der Teilnehmer noch existiert
|
|
participant_id = request.COOKIES['participant_id']
|
|
try:
|
|
participant = QuizGameParticipant.objects.get(participant_id=participant_id)
|
|
return redirect('play:lobby', join_code=join_code)
|
|
except QuizGameParticipant.DoesNotExist:
|
|
# Cookie löschen wenn Teilnehmer nicht mehr existiert
|
|
response = HttpResponseRedirect(request.path)
|
|
response.delete_cookie('participant_id')
|
|
return response
|
|
if request.method == 'POST':
|
|
display_name = request.POST.get('display_name')
|
|
join_code = request.POST.get('join_code')
|
|
try:
|
|
quiz = QuizGame.objects.get(join_code=join_code)
|
|
participant = QuizGameParticipant()
|
|
participant.display_name = display_name
|
|
participant.quiz_game = quiz
|
|
participant.save()
|
|
|
|
response = HttpResponseRedirect(reverse('play:lobby', kwargs={'join_code': join_code}))
|
|
response.set_cookie('participant_id', participant.participant_id, max_age=3600)
|
|
|
|
return response
|
|
except QuizGame.DoesNotExist:
|
|
# TODO: Fehlermeldung fuer nicht-existierendes Quiz
|
|
pass
|
|
|
|
return render(request, 'play/initialize_participant.html', {'join_code': join_code})
|
|
|
|
def create_game(request, quiz_id):
|
|
try:
|
|
quiz = QivipQuiz.objects.get(id=quiz_id)
|
|
game = QuizGame()
|
|
game.quiz_id = quiz
|
|
game.host_id = game.generate_unique_id()
|
|
game.save()
|
|
|
|
response = HttpResponseRedirect(reverse('play:lobby', kwargs={'join_code': game.join_code}))
|
|
response.set_cookie('host_id', game.host_id, max_age=3600)
|
|
|
|
return response
|
|
except QivipQuiz.DoesNotExist:
|
|
return HttpResponseNotFound("Quiz nicht gefunden")
|
|
|
|
|
|
def join_game(request):
|
|
if request.method == 'POST':
|
|
join_code = request.POST.get('game_code')
|
|
try:
|
|
quiz = QuizGame.objects.get(join_code=join_code)
|
|
return redirect('play:lobby', join_code=join_code)
|
|
except QuizGame.DoesNotExist:
|
|
# TODO: Mit message eine Fehlermeldung weitergeben (und im entsprechenden Template Designen)
|
|
pass
|
|
return render(request, 'play/join_game.html')
|
|
|
|
def question(request, join_code, question_id):
|
|
question = get_object_or_404(QivipQuestion, pk=question_id)
|
|
|
|
if question.data:
|
|
question.data = json.loads(question.data)
|
|
|
|
context = {
|
|
'question': question,
|
|
}
|
|
|
|
return render(request, 'play/game/question_host.html', {'question': question, 'debug': "debug"})
|
|
|
|
def question_participant(request, join_code, question_id):
|
|
question = get_object_or_404(QivipQuestion, pk=question_id)
|
|
|
|
if question.data:
|
|
question.data = json.loads(question.data)
|
|
|
|
context = {
|
|
'question': question,
|
|
}
|
|
|
|
return render(request, 'play/game/question_participant.html', {'question': question, 'debug': "debug"}) |