diff --git a/.env b/.env index baaf744..c092b44 100644 --- a/.env +++ b/.env @@ -12,4 +12,4 @@ DB_HOST=db DB_PORT=5432 PROJECT_PATH=/home/mchiboub/42cursus/transcendence/pong -POSTGRES_DATA_PATH=/home/mchiboub/42cursus/transcendence/data/db +POSTGRES_DATA_PATH=/home/mchiboub/42cursus/transcendence/data/db \ No newline at end of file diff --git a/makefile b/makefile index c4059e1..f84c03f 100644 --- a/makefile +++ b/makefile @@ -46,4 +46,3 @@ help: @echo " make logs [c=service] # Tail logs of containers" @echo " make ps # List containers" @echo " make help # Show this help" - diff --git a/pong/game/game.py b/pong/game/game.py index eb718ab..4214d77 100644 --- a/pong/game/game.py +++ b/pong/game/game.py @@ -182,4 +182,4 @@ class Game: # match type: 'tournament' # -> tournament id -#endfortheouche(p1, p2, s_p1, s_p2, bt_p1, bt_p2, dur, is_tournoi, name_tournament) \ No newline at end of file +#endfortheouche(p1, p2, s_p1, s_p2, bt_p1, bt_p2, dur, is_tournoi, name_tournament) diff --git a/pong/game/migrations/0002_player_best_score_player_m_duration_and_more.py b/pong/game/migrations/0002_player_best_score_player_m_duration_and_more.py new file mode 100644 index 0000000..df55fa5 --- /dev/null +++ b/pong/game/migrations/0002_player_best_score_player_m_duration_and_more.py @@ -0,0 +1,68 @@ +# Generated by Django 5.0.7 on 2024-07-24 16:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('game', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='player', + name='best_score', + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.AddField( + model_name='player', + name='m_duration', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True), + ), + migrations.AddField( + model_name='player', + name='m_nbr_ball_touch', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True), + ), + migrations.AddField( + model_name='player', + name='m_score_adv_match', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True), + ), + migrations.AddField( + model_name='player', + name='m_score_match', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True), + ), + migrations.AddField( + model_name='player', + name='num_participated_tournaments', + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.AddField( + model_name='player', + name='num_won_tournaments', + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.AddField( + model_name='player', + name='p_win', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True), + ), + migrations.AddField( + model_name='player', + name='total_duration', + field=models.DurationField(blank=True, null=True), + ), + migrations.AddField( + model_name='player', + name='total_match', + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.AddField( + model_name='player', + name='total_win', + field=models.PositiveSmallIntegerField(default=0), + ), + ] diff --git a/pong/game/templates/pong/match_list.html b/pong/game/templates/pong/match_list.html index d576f19..72c1315 100644 --- a/pong/game/templates/pong/match_list.html +++ b/pong/game/templates/pong/match_list.html @@ -48,4 +48,4 @@ - \ No newline at end of file + diff --git a/pong/game/templates/pong/player_list.html b/pong/game/templates/pong/player_list.html index f94fdc1..b9fbb42 100644 --- a/pong/game/templates/pong/player_list.html +++ b/pong/game/templates/pong/player_list.html @@ -50,4 +50,4 @@ - \ No newline at end of file + diff --git a/pong/game/templates/pong/tournoi_list.html b/pong/game/templates/pong/tournoi_list.html index fcad0d9..e5718f5 100644 --- a/pong/game/templates/pong/tournoi_list.html +++ b/pong/game/templates/pong/tournoi_list.html @@ -34,4 +34,4 @@ - \ No newline at end of file + diff --git a/pong/game/utils.py b/pong/game/utils.py index 07dc265..0febfff 100644 --- a/pong/game/utils.py +++ b/pong/game/utils.py @@ -3,6 +3,7 @@ from django.core.exceptions import ValidationError from django.shortcuts import get_object_or_404 from django.db.models import Max, Sum, F from datetime import timedelta +<<<<<<< HEAD from channels.db import database_sync_to_async async def endfortheouche(p1, p2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_tournament): @@ -26,6 +27,26 @@ async def endfortheouche(p1, p2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_ await uptdate_player_statistics(p2) @database_sync_to_async +======= + +def endfortheouche(p1, p2, s_p1, s_p2, winner, bt_p1, bt_p2, dur, is_tournoi, name_tournament) : + #If he doesn't exist, create player p1 + if not Player.objects.filter(name=p1).exist(): + create_player(p1) + + #If he doesn't exist, create player p2 + if not Player.objects.filter(name=p2).exist(): + create_player(p2) + + #create Match + create_match(p1, p2, s_p1, s_p2, bt_p1, bt_p2, dur, is_tournoi, name_tournamenttournoi) + + #Update data p1 et p2 + uptdate_player_statistics(p1) + uptdate_player_statistics(p2) + + +>>>>>>> f31331d344927dfd9bca940943bdba9a4d79a2b4 def create_player( name, total_match=0, @@ -60,13 +81,19 @@ def create_player( player.save() return player +<<<<<<< HEAD @database_sync_to_async +======= +>>>>>>> f31331d344927dfd9bca940943bdba9a4d79a2b4 def create_tournoi(name, nbr_player, date, winner): tournoi = Tournoi(name=name, nbr_player=nbr_player, date=date, winner=winner) tournoi.save() return tournoi +<<<<<<< HEAD @database_sync_to_async +======= +>>>>>>> f31331d344927dfd9bca940943bdba9a4d79a2b4 def create_match(player1, player2, score_player1, score_player2, nbr_ball_touch_p1, nbr_ball_touch_p2, duration, is_tournoi, tournoi): match = Match( player1=player1, diff --git a/pong/game/views.py b/pong/game/views.py index f9e10c3..8014847 100644 --- a/pong/game/views.py +++ b/pong/game/views.py @@ -2,9 +2,12 @@ from django.shortcuts import render +<<<<<<< HEAD def index(request): return render(request, 'index.html') +======= +>>>>>>> f31331d344927dfd9bca940943bdba9a4d79a2b4 from django.core.exceptions import ObjectDoesNotExist from .models import Player, Tournoi, Match from .utils import create_player, create_tournoi, create_match @@ -15,6 +18,11 @@ from django.views.decorators.csrf import csrf_exempt import json import uuid + +def index(request): + return render(request, 'index.html') + + @csrf_exempt def register_user(request): if request.method == 'POST': @@ -199,4 +207,4 @@ def tournoi_list(request): tournois = Tournoi.objects.select_related('winner').all() return render(request, 'pong/tournoi_list.html', {'tournois': tournois}) -####################### THEOUCHE PART ############################ \ No newline at end of file +####################### THEOUCHE PART ############################ diff --git a/pong/static/game.js b/pong/static/game.js index a7dbeed..cbfb198 100644 --- a/pong/static/game.js +++ b/pong/static/game.js @@ -10,6 +10,8 @@ document.addEventListener('DOMContentLoaded', () => { const loginPasswordInput = document.getElementById('login-password'); const loginForm = document.getElementById('login-form'); const registerForm = document.getElementById('register-form'); + const formBlock = document.getElementById('block-form'); + let socket; let token; @@ -17,7 +19,7 @@ document.addEventListener('DOMContentLoaded', () => { // Auto-focus and key handling for AUTH-FORM nicknameInput.focus(); - nicknameInput.addEventListener('keypress', function(event) { + nicknameInput.addEventListener('keypress', function (event) { if (event.key === 'Enter') { event.preventDefault(); checkNicknameButton.click(); @@ -28,6 +30,86 @@ document.addEventListener('DOMContentLoaded', () => { registerButton.addEventListener('click', handleRegister); loginButton.addEventListener('click', handleLogin); + + /// THEOUCHE NOT CERTAIN /// + async function createPlayer(name, totalMatch = 0, totalWin = 0, pWin = null, mScoreMatch = null, mScoreAdvMatch = null, bestScore = 0, mNbrBallTouch = null, totalDuration = null, mDuration = null, numParticipatedTournaments = 0, numWonTournaments = 0) { + try { + const response = await fetch('/api/create_player/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + name, + total_match: totalMatch, + total_win: totalWin, + p_win: pWin, + m_score_match: mScoreMatch, + m_score_adv_match: mScoreAdvMatch, + best_score: bestScore, + m_nbr_ball_touch: mNbrBallTouch, + total_duration: totalDuration, + m_duration: mDuration, + num_participated_tournaments: numParticipatedTournaments, + num_won_tournaments: numWonTournaments + }) + }); + + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.error || 'Network response was not ok'); + } + + const data = await response.json(); + return data; + + } catch (error) { + // Afficher l'erreur avec un message plus spécifique + console.error('Error creating player:', error.message); + alert(`Failed to create player: ${error.message}`); + } + } + + async function createTournoi(name, nbr_player, date, winner_id) { + try { + const response = await fetch('/api/create_tournoi/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ name, nbr_player, date, winner_id }) + }); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + const data = await response.json(); + return data; + } catch (error) { + console.error('Error creating tournoi:', error); + } + } + + async function createMatch(player1_id, player2_id, score_player1, score_player2, nbr_ball_touch_p1, nbr_ball_touch_p2, duration, is_tournoi, tournoi_id) { + try { + const response = await fetch('/api/create_match/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ player1_id, player2_id, score_player1, score_player2, nbr_ball_touch_p1, nbr_ball_touch_p2, duration, is_tournoi, tournoi_id }) + }); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + const data = await response.json(); + return data; + } catch (error) { + console.error('Error creating match:', error); + } + } + + /// THEOUCHE NOT CERTAIN /// + async function handleCheckNickname() { const nickname = nicknameInput.value.trim(); if (nickname) { @@ -38,28 +120,28 @@ document.addEventListener('DOMContentLoaded', () => { loginForm.style.display = 'block'; // Auto-focus and key handling for LOGIN-FORM loginPasswordInput.focus(); - loginPasswordInput.addEventListener('keypress', function(event) { + loginPasswordInput.addEventListener('keypress', function (event) { if (event.key === 'Enter') { event.preventDefault(); loginButton.click(); } - }); + }); } else { authForm.style.display = 'none'; registerForm.style.display = 'block'; // Auto-focus and key handling for REGISTER-FORM passwordInput.focus(); - passwordInput.addEventListener('keypress', function(event) { + passwordInput.addEventListener('keypress', function (event) { if (event.key === 'Enter') { confirmPasswordInput.focus(); - confirmPasswordInput.addEventListener('keypress', function(event) { + confirmPasswordInput.addEventListener('keypress', function (event) { if (event.key === 'Enter') { event.preventDefault(); registerButton.click(); } - }); + }); } - }); + }); } } catch (error) { console.error('Error checking user existence:', error); @@ -90,8 +172,10 @@ document.addEventListener('DOMContentLoaded', () => { try { const result = await registerUser(nickname, password); if (result) { + //await createPlayer(nickname); registerForm.style.display = 'none'; gameContainer.style.display = 'flex'; + formBlock.style.display = 'none'; startWebSocketConnection(token); } else { alert('Registration failed. Please try again.'); @@ -127,6 +211,7 @@ document.addEventListener('DOMContentLoaded', () => { if (result) { loginForm.style.display = 'none'; gameContainer.style.display = 'flex'; + formBlock.style.display = 'none'; startWebSocketConnection(token); } else { alert('Authentication failed. Please try again.'); @@ -195,6 +280,7 @@ document.addEventListener('DOMContentLoaded', () => { document.getElementById('player1-name').textContent = `${player1_name}`; document.getElementById('player2-name').textContent = `${player2_name}`; document.addEventListener('keydown', handleKeyDown); + } function handleKeyDown(event) { diff --git a/pong/static/index.html b/pong/static/index.html index 4f6c773..63fc79c 100644 --- a/pong/static/index.html +++ b/pong/static/index.html @@ -1,32 +1,53 @@ {% load static %} + Pong Game + + + -
- - - +
+
-