Lernfunktion
This commit is contained in:
@@ -13,4 +13,5 @@ urlpatterns = [
|
|||||||
path('game/<str:join_code>/scores', views.scores, name='scores'),
|
path('game/<str:join_code>/scores', views.scores, name='scores'),
|
||||||
path('game/<str:join_code>/finished', views.finished, name='finished'),
|
path('game/<str:join_code>/finished', views.finished, name='finished'),
|
||||||
path('select_mode/<str:join_code>', views.select_mode, name='select_mode'),
|
path('select_mode/<str:join_code>', views.select_mode, name='select_mode'),
|
||||||
|
path('selected_mode/<str:join_code>', views.selected_mode, name='selected_mode'),
|
||||||
]
|
]
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
from django.utils import timezone
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.shortcuts import render, redirect, get_object_or_404, reverse
|
from django.shortcuts import render, redirect, get_object_or_404, reverse
|
||||||
from play.models import QuizGame, QuizGameParticipant
|
from play.models import QuizGame, QuizGameParticipant
|
||||||
@@ -7,8 +8,12 @@ from django.contrib import messages
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
def lobby(request, join_code):
|
def lobby(request, join_code):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
quiz_game = get_object_or_404(QuizGame, join_code=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)
|
quiz = get_object_or_404(QivipQuiz, pk=quiz_game.quiz_id.id)
|
||||||
context = {
|
context = {
|
||||||
@@ -16,11 +21,18 @@ def lobby(request, join_code):
|
|||||||
'quiz_game': quiz_game,
|
'quiz_game': quiz_game,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if "host_id" in request.COOKIES:
|
if "host_id" in request.COOKIES:
|
||||||
host_id = request.COOKIES['host_id']
|
host_id = request.COOKIES['host_id']
|
||||||
if host_id == quiz_game.host_id:
|
if host_id == quiz_game.host_id:
|
||||||
context['host_id'] = host_id
|
context['host_id'] = host_id
|
||||||
return render(request, 'play/lobby.html', context=context)
|
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:
|
if not "participant_id" in request.COOKIES:
|
||||||
return redirect('play:create_participant', join_code=join_code)
|
return redirect('play:create_participant', join_code=join_code)
|
||||||
@@ -45,8 +57,8 @@ def select_mode(request,join_code):
|
|||||||
|
|
||||||
def create_participant(request, join_code):
|
def create_participant(request, join_code):
|
||||||
quiz_game = get_object_or_404(QuizGame, join_code=join_code)
|
quiz_game = get_object_or_404(QuizGame, join_code=join_code)
|
||||||
|
if mode!="learn":
|
||||||
if "participant_id" in request.COOKIES:
|
if "participant_id" in request.COOKIES:
|
||||||
# Prüfe ob der Teilnehmer noch existiert
|
# Prüfe ob der Teilnehmer noch existiert
|
||||||
participant_id = request.COOKIES['participant_id']
|
participant_id = request.COOKIES['participant_id']
|
||||||
try:
|
try:
|
||||||
@@ -62,7 +74,7 @@ def create_participant(request, join_code):
|
|||||||
response.delete_cookie('participant_id')
|
response.delete_cookie('participant_id')
|
||||||
return response
|
return response
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
display_name = request.POST.get('display_name')
|
display_name = request.POST.get('display_name')
|
||||||
if not display_name:
|
if not display_name:
|
||||||
return render(request, 'play/initialize_participant.html', {
|
return render(request, 'play/initialize_participant.html', {
|
||||||
@@ -80,22 +92,19 @@ def create_participant(request, join_code):
|
|||||||
response.set_cookie('participant_id', participant.participant_id, max_age=3600)
|
response.set_cookie('participant_id', participant.participant_id, max_age=3600)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
return render(request, 'play/initialize_participant.html', {'join_code': join_code})
|
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):
|
def create_game(request, quiz_id):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
quiz = QivipQuiz.objects.get(id=quiz_id)
|
quiz = QivipQuiz.objects.get(id=quiz_id)
|
||||||
game = QuizGame()
|
game = QuizGame()
|
||||||
game.quiz_id = quiz
|
game.quiz_id = quiz
|
||||||
game.host_id = game.generate_unique_id()
|
game.host_id = game.generate_unique_id()
|
||||||
game.save()
|
game.save()
|
||||||
|
|
||||||
participant = QuizGameParticipant()
|
|
||||||
participant.display_name = "DU"
|
|
||||||
participant.participant_id=game.host_id
|
|
||||||
participant.quiz_game = game
|
|
||||||
participant.score = 0 # Initialize score
|
|
||||||
participant.save()
|
|
||||||
|
|
||||||
response = HttpResponseRedirect(reverse('play:select_mode', kwargs={'join_code': game.join_code}))
|
response = HttpResponseRedirect(reverse('play:select_mode', kwargs={'join_code': game.join_code}))
|
||||||
response.set_cookie('host_id', game.host_id, max_age=3600)
|
response.set_cookie('host_id', game.host_id, max_age=3600)
|
||||||
@@ -267,4 +276,43 @@ def waiting_room(request, join_code):
|
|||||||
return render(request, 'play/game/wait_for_other_players.html', {
|
return render(request, 'play/game/wait_for_other_players.html', {
|
||||||
'quiz_game': quiz_game,
|
'quiz_game': quiz_game,
|
||||||
'participant': participant
|
'participant': participant
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
def selected_mode(request, join_code):
|
||||||
|
|
||||||
|
global mode
|
||||||
|
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)
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
|
{% if request.session.mode == "learn" %}
|
||||||
|
|
||||||
<div class="container mx-auto px-4">
|
<div class="container mx-auto px-4">
|
||||||
|
<div class="flex justify-end mb-4">
|
||||||
|
<button onclick="leaveGame()" class="bg-red-500 hover:bg-red-600 text-white font-bold py-2 px-4 rounded">
|
||||||
|
Spiel verlassen
|
||||||
|
</button>
|
||||||
|
</div>{% endif %}
|
||||||
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
|
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
|
||||||
<p class="text-gray-700 font-bold text-xl mb-4">Frage {{ question_index|add:1 }} von {{ total_questions }}</p>
|
<p class="text-gray-700 font-bold text-xl mb-4">Frage {{ question_index|add:1 }} von {{ total_questions }}</p>
|
||||||
<h1 class="text-3xl font-bold mb-6">{{ question_data.question }}</h1>
|
<h1 class="text-3xl font-bold mb-6">{{ question_data.question }}</h1>
|
||||||
@@ -22,7 +30,8 @@
|
|||||||
<button
|
<button
|
||||||
class="p-4 bg-gray-100 hover:bg-blue-100 rounded-lg transition-colors duration-200 answer-option"
|
class="p-4 bg-gray-100 hover:bg-blue-100 rounded-lg transition-colors duration-200 answer-option"
|
||||||
data-index="{{ forloop.counter0 }}"
|
data-index="{{ forloop.counter0 }}"
|
||||||
onclick="submitAnswer({{ forloop.counter0 }});">
|
{% if request.session.mode == "learn" %}
|
||||||
|
onclick="submitAnswer({{ forloop.counter0 }});" {% endif %}>
|
||||||
<p class="text-lg">{{ option.value }}</p>
|
<p class="text-lg">{{ option.value }}</p>
|
||||||
</button>
|
</button>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -133,8 +142,20 @@
|
|||||||
|
|
||||||
|
|
||||||
let hasAnswered = false;
|
let hasAnswered = false;
|
||||||
const participantId = '{{ host_id }}';
|
const participantId = '{{ host_id }}'; // HIER IST DER HOST DER SPIELER
|
||||||
|
|
||||||
|
function leaveGame() {
|
||||||
|
if (confirm('Möchtest du das Spiel wirklich verlassen?')) {
|
||||||
|
gameSocket.send(JSON.stringify({
|
||||||
|
type: 'leave_game',
|
||||||
|
participant_id: participantId
|
||||||
|
}));
|
||||||
|
window.location.href = '/';
|
||||||
|
gameSocket.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function submitAnswer(optionIndex) {
|
function submitAnswer(optionIndex) {
|
||||||
if (hasAnswered) return;
|
if (hasAnswered) return;
|
||||||
|
|||||||
@@ -7,11 +7,13 @@
|
|||||||
<!-- Quiz Info -->
|
<!-- Quiz Info -->
|
||||||
<div class="text-center mb-8">
|
<div class="text-center mb-8">
|
||||||
<h3 class="text-xl text-gray-600 mb-2">{{ quiz.name }}</h3>
|
<h3 class="text-xl text-gray-600 mb-2">{{ quiz.name }}</h3>
|
||||||
|
{% if request.session.mode != "learn" %}
|
||||||
<div class="bg-blue-100 rounded-lg p-4 mb-4">
|
<div class="bg-blue-100 rounded-lg p-4 mb-4">
|
||||||
<h1 class="text-4xl font-bold text-blue-800">{{ quiz_game.join_code }}</h1>
|
<h1 class="text-4xl font-bold text-blue-800">{{ quiz_game.join_code }}</h1>
|
||||||
<p class="text-sm text-blue-600 mt-1">Spiel-Code</p>
|
<p class="text-sm text-blue-600 mt-1">Spiel-Code</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<!-- Participant Info -->
|
<!-- Participant Info -->
|
||||||
{% if participant %}
|
{% if participant %}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<div class="grid sm:grid-cols-3 place-items-stretch text-center gap-4 p-4">
|
<div class="grid sm:grid-cols-3 place-items-stretch text-center gap-4 p-4">
|
||||||
|
|
||||||
<!-- Moderieren -->
|
<!-- Moderieren -->
|
||||||
<a class="qp-a-button bg-green-500 text-white flex justify-center items-center relative group h-20 gap-2" href="{% url 'play:lobby' join_code %}">
|
<a class="qp-a-button bg-green-500 text-white flex justify-center items-center relative group h-20 gap-2" href="{% url 'play:selected_mode' join_code %}?mode=classic">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-6">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-6">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z" />
|
<path stroke-linecap="round" stroke-linejoin="round" d="M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z" />
|
||||||
</svg>
|
</svg>
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- Lernmodus -->
|
<!-- Lernmodus -->
|
||||||
<a class="qp-a-button bg-indigo-500 text-white flex justify-center items-center relative group h-20 gap-2" href="#">
|
<a class="qp-a-button bg-indigo-500 text-white flex justify-center items-center relative group h-20 gap-2" href="{% url 'play:selected_mode' join_code %}?mode=learn">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-6">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-6">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z" />
|
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z" />
|
||||||
</svg>
|
</svg>
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- Testmodus -->
|
<!-- Testmodus -->
|
||||||
<a class="qp-a-button bg-purple-500 text-white flex justify-center items-center relative group h-20 gap-2" href="#">
|
<a class="qp-a-button bg-purple-500 text-white flex justify-center items-center relative group h-20 gap-2" href="{% url 'play:selected_mode' join_code %}?mode=test">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-6">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-6">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M10.125 2.25h-4.5c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125v-9M10.125 2.25h.375a9 9 0 0 1 9 9v.375M10.125 2.25A3.375 3.375 0 0 1 13.5 5.625v1.5c0 .621.504 1.125 1.125 1.125h1.5a3.375 3.375 0 0 1 3.375 3.375M9 15l2.25 2.25L15 12" />
|
<path stroke-linecap="round" stroke-linejoin="round" d="M10.125 2.25h-4.5c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125v-9M10.125 2.25h.375a9 9 0 0 1 9 9v.375M10.125 2.25A3.375 3.375 0 0 1 13.5 5.625v1.5c0 .621.504 1.125 1.125 1.125h1.5a3.375 3.375 0 0 1 3.375 3.375M9 15l2.25 2.25L15 12" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
Reference in New Issue
Block a user