from django.utils import timezone 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 from django.contrib import messages 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, } mode = request.GET.get('mode','default') request.session['mode'] = mode 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) elif mode=="learn": return redirect('play:create_participant', join_code=join_code) 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.score = 0 # Reset score when joining new 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 select_mode(request,join_code): return render(request, 'play/select_mode.html', {'join_code': join_code}) def create_participant(request, join_code): mode = request.GET.get('mode','default') request.session['mode'] = mode quiz_game = get_object_or_404(QuizGame, join_code=join_code) if mode!="learn": 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) if participant.quiz_game.join_code != join_code: participant.quiz_game = quiz_game participant.score = 0 # Reset score when joining new game participant.save() 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') if not display_name: return render(request, 'play/initialize_participant.html', { 'join_code': join_code, 'error': 'Bitte geben Sie einen Namen ein' }) participant = QuizGameParticipant() participant.display_name = display_name participant.quiz_game = quiz_game participant.score = 0 # Initialize score 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 return render(request, 'play/initialize_participant.html', {'join_code': join_code}) else: messages.error(request, "Beitritt nicht möglich.") return render(request, 'play/join_game.html') 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:select_mode', 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) # Redirect to create_participant if no participant cookie exists if not "participant_id" in request.COOKIES: return redirect('play:create_participant', join_code=join_code) return redirect('play:lobby', join_code=join_code) except QuizGame.DoesNotExist: messages.error(request, "Dieses Spiel existiert nicht.") return render(request, 'play/join_game.html') def finished(request, join_code): try: game = QuizGame.objects.get(join_code=join_code) participant = None participant_id = request.session.get('participant_id') if participant_id: participant = QuizGameParticipant.objects.filter( quiz_game=game, participant_id=participant_id ).first() context = { 'join_code': join_code, 'is_host': str(game.host_id) == str(request.session.get('host_id')), 'participant_id': participant_id if participant else None } return render(request, 'play/game/finished.html', context) except QuizGame.DoesNotExist: return redirect('home') def scores(request, join_code): quiz_game = get_object_or_404(QuizGame, join_code=join_code) # Verify game state if quiz_game.current_state != 'scores': return redirect('play:lobby', join_code=join_code) # Get participants sorted by score participants = QuizGameParticipant.objects.filter(quiz_game=quiz_game).order_by('-score') # Check if user is host is_host = False if 'host_id' in request.COOKIES and request.COOKIES['host_id'] == quiz_game.host_id: is_host = True # Get current question for context questions = quiz_game.quiz_id.questions.all() current_question = questions[quiz_game.current_question_index] question_data = json.loads(current_question.data) try: my_participant = request.session.get('my_participant-participant_id') participant = QuizGameParticipant.objects.get(participant_id=my_participant) my_participant=participant except: participant = QuizGameParticipant.objects.none() return render(request, 'play/game/score_overview.html', { 'quiz_game': quiz_game, 'participants': participants, 'participant': participant, 'my_participant':my_participant, 'is_host': is_host, 'host_id': quiz_game.host_id if is_host else None, 'is_last_question': quiz_game.current_question_index + 1 >= len(questions), 'question_data': question_data, 'question_index': quiz_game.current_question_index, 'total_questions': len(questions) }) def finished(request, join_code): quiz_game = get_object_or_404(QuizGame, join_code=join_code) # Verify game state if quiz_game.current_state != 'finished': return redirect('play:lobby', join_code=join_code) # Get participants sorted by score participants = QuizGameParticipant.objects.filter(quiz_game=quiz_game).order_by('-score') # Check if user is host is_host = False if 'host_id' in request.COOKIES and request.COOKIES['host_id'] == quiz_game.host_id: is_host = True # Get participant if exists participant_id = request.COOKIES.get('participant_id') participant = None if participant_id: participant = QuizGameParticipant.objects.filter( quiz_game=quiz_game, participant_id=participant_id ).first() return render(request, 'play/game/finished.html', { 'quiz_game': quiz_game, 'participants': participants, 'winner': participants.first() if participants.exists() else None, 'join_code': join_code, 'is_host': is_host, 'participant_id': participant_id if participant else None }) def question(request, join_code): quiz_game = get_object_or_404(QuizGame, join_code=join_code) # Verify game state if quiz_game.current_state != 'question': return redirect('play:lobby', join_code=join_code) # Get current question questions = quiz_game.quiz_id.questions.all() if quiz_game.current_question_index >= len(questions): return redirect('play:lobby', join_code=join_code) current_question = questions[quiz_game.current_question_index] question_data = json.loads(current_question.data) # Check if user is host if 'host_id' in request.COOKIES and request.COOKIES['host_id'] == quiz_game.host_id: return render(request, 'play/game/question_host.html', { 'quiz_game': quiz_game, 'question_data': question_data, 'current_question':current_question, 'host_id': quiz_game.host_id, 'start_time': int(quiz_game.question_start_time.timestamp() * 1000), 'question_index': quiz_game.current_question_index, 'total_questions': len(questions) }) # Handle participant view 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) except QuizGameParticipant.DoesNotExist: return redirect('play:create_participant', join_code=join_code) request.session['my_participant-participant_id'] = participant.participant_id return render(request, 'play/game/question_participant.html', { 'quiz_game': quiz_game, 'question_data': question_data, 'current_question':current_question, 'participant': participant, 'start_time': int(quiz_game.question_start_time.timestamp() * 1000), 'question_index': quiz_game.current_question_index, 'total_questions': len(questions) }) def waiting_room(request, join_code): quiz_game = get_object_or_404(QuizGame, join_code=join_code) # Check if user is host if 'host_id' in request.COOKIES and request.COOKIES['host_id'] == quiz_game.host_id: return redirect('play:question', join_code=join_code) # Handle participant view 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) except QuizGameParticipant.DoesNotExist: return redirect('play:create_participant', join_code=join_code) return render(request, 'play/game/wait_for_other_players.html', { 'quiz_game': quiz_game, 'participant': participant }) def selected_mode(request, join_code): mode = request.GET.get('mode','default') request.session['mode'] = mode quiz_game = get_object_or_404(QuizGame, join_code=join_code) quiz = get_object_or_404(QivipQuiz, pk=quiz_game.quiz_id.id) QuizGameParticipant.objects.filter(quiz_game=quiz_game).delete() 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 if mode=="learn": participant = QuizGameParticipant() if request.user.is_authenticated: participant.display_name = request.user.username else: participant.display_name = "SIE" participant.participant_id=host_id participant.quiz_game = quiz_game participant.score = 0 # Initialize score participant.save() quiz_game.current_state = "question" quiz_game.question_start_time = timezone.now() quiz_game.save() return redirect('play:question',join_code) return render(request, 'play/lobby.html', context=context)