Player register ok

This commit is contained in:
Theouche 2024-09-14 13:34:39 +02:00
parent ea24accbc4
commit e8f46e211c
8 changed files with 111 additions and 84 deletions

View File

@ -9,7 +9,7 @@ ELK_COMPOSE=docker compose -f $(ELK_COMPOSE_FILE) -p $(ELK_PROJECT_NAME)
CONTAINER=$(c)
up:
up: down
$(COMPOSE) build
$(COMPOSE) up -d $(CONTAINER) || true
@ -22,6 +22,8 @@ down:
destroy:
$(COMPOSE) down -v --rmi all
re : down destroy up
# Manage ELK stack
elk-up:

View File

@ -4,10 +4,13 @@ import json
import asyncio
import random
from datetime import datetime
from .utils import handle_game_data, getlen
from .utils import handle_game_data, getlen, create_player, create_match
from asgiref.sync import sync_to_async
from .models import Tournoi
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=5)
lock = asyncio.Lock()
class Game:
# Global variable to handle the using of the database
USING_DB = False
@ -58,6 +61,7 @@ class Game:
print(f"- Game #{self.game_id} STARTED ({self.game_state['player1_name']} vs {self.game_state['player2_name']}) --- ({self})")
self.game_loop_task = asyncio.create_task(self.game_loop())
print(f" Begin MATCH at: {self.start_time}")
await sync_to_async(create_player)(self.game_state['player1_name'], self.game_state['player2_name'])
async def game_loop(self):
print(" In the game loop..")
@ -250,52 +254,22 @@ class Game:
if not self.localgame:
await self.player2.send(end_message)
attempt = 0
max_attempts = 10 # Limite le nombre de tentatives
success = False
print(f"Try to save game #{self.game_id} ({self})")
#while attempt < max_attempts and not success:
try:
if hasattr(self, 'tournament'):
print(f"*** Game #{self.game_id} from tournament: {self.tournament.tournoi_reg.name} ENDED ***")
# Essaye d'appeler handle_game_data
result = await sync_to_async(handle_game_data)(
self.game_state['player1_name'], self.game_state['player2_name'],
self.game_state['player1_score'], self.game_state['player2_score'],
self.bt1, self.bt2, duration, True, self.tournament.tournoi_reg
)
# Vérification explicite de la réussite
if result is not None: # Si handle_game_data peut retourner un résultat indicatif
success = True
print(f"*** Game #{self.game_id} from tournament: {self.tournament.tournoi_reg.name} is REGISTERED ***")
else:
raise ValueError("handle_game_data returned an unexpected result")
else:
print(f"*** Game #{self.game_id} simple game ENDED ***")
result = await sync_to_async(handle_game_data)(
self.game_state['player1_name'], self.game_state['player2_name'],
self.game_state['player1_score'], self.game_state['player2_score'],
self.bt1, self.bt2, duration, False, None
)
print("result done !!!")
avd, d = (True, self.tournament.tournoi_reg) if hasattr(self, 'tournament') else (False, None)
if result is not None:
success = True
print(f"Non-tournament game {self.game_id} data registered")
else:
raise ValueError("handle_game_data returned an unexpected result")
# Essaye d'appeler handle_game_data
print("TRY CREATE MATCH")
except Exception as e:
attempt += 1
print(f"Attempt {attempt}: Failed to register game data - {e}")
await asyncio.sleep(1) # Délai avant de réessayer
await sync_to_async(create_match)(
self.game_state['player1_name'], self.game_state['player2_name'],
self.game_state['player1_score'], self.game_state['player2_score'],
self.bt1, self.bt2, duration, avd, d
)
if attempt >= max_attempts:
print("Max attempts reached. Could not register game data.")
#break
print("MATCH OK")

View File

@ -0,0 +1,28 @@
# Generated by Django 5.1.1 on 2024-09-14 09:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('game', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='match',
name='player1',
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name='match',
name='player2',
field=models.CharField(max_length=100),
),
migrations.AlterField(
model_name='match',
name='winner',
field=models.CharField(max_length=100),
),
]

View File

@ -26,11 +26,11 @@ class Tournoi(models.Model):
return self.name
class Match(models.Model):
player1 = models.ForeignKey('Player', related_name='match_as_player1', on_delete=models.CASCADE)
player2 = models.ForeignKey('Player', related_name='match_as_player2', on_delete=models.CASCADE)
player1 = models.CharField(max_length=100)
player2 = models.CharField(max_length=100)
score_player1 = models.PositiveSmallIntegerField()
score_player2 = models.PositiveSmallIntegerField()
winner = models.ForeignKey('Player', related_name='won_matches',on_delete=models.CASCADE, null=True)
winner = models.CharField(max_length=100)
nbr_ball_touch_p1 = models.PositiveIntegerField()
nbr_ball_touch_p2 = models.PositiveIntegerField()
duration = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)

View File

@ -110,8 +110,7 @@ class TournamentMatchMaker:
await asyncio.sleep(1) # Wait for 1 second before checking again
# Get winners for the next round
players = self.get_round_winners()
print(f"Round {self.current_round} finished. {len(players)} players advancing.")
await asyncio.sleep(10)
print(f"Round {self.current_round} finished. {len(players)} players advancing.")
# Tournament has ended
await self.update_brackets()
await self.end_tournament(players[0] if players else None)

View File

@ -2,53 +2,71 @@ from .models import Player, Tournoi, Match
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
from channels.db import database_sync_to_async
from asgiref.sync import sync_to_async
from django.db.models import Q
import asyncio
players_name_list = []
def handle_game_data(p1, p2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_tournament):
try:
print("Here !!!!!!!!")
player_1 = get_or_create_player(p1)
print("FIRST PLAYER REGISTERD")
player_2 = get_or_create_player(p2)
print("SECOND PLAYER REGISTERD")
#get_or_create_player(p1, p2)
#print("FIRST PLAYER REGISTERD")
#await sync_to_async(get_or_create_player)(p2)
#print("SECOND PLAYER REGISTERD")
if (not player_1 or not player_2) :
print("AIIEJJDFKJBDBKJJKB PROBLEME ORIOL ")
print("CHAKU & THEOUCHE are the BEST")
create_match(player_1, player_2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_tournament)
create_match(p1, p2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_tournament)
print("and ADRIANO is the PEST")
update_player_statistics(p1)
#update_player_statistics(p1)
print("END UPDATE FISRT PLAYER")
update_player_statistics(p2)
#update_player_statistics(p2)
print("END UPDATE SECOND PLAYER")
except Exception as e:
print(f"Error in endfortheouche: {e}")
def get_or_create_player(name):
def create_player(name_p1, name_p2):
print("Get or create player")
global players_name_list
# Utilise get_or_create pour chercher un joueur existant ou en créer un nouveau avec les valeurs par défaut
player, created = Player.objects.get_or_create(
name=name,
defaults={
'total_match': 0,
'total_win': 0,
'p_win': None,
'num_participated_tournaments': 0,
'num_won_tournaments': 0
}
)
if created:
print("Player created")
else:
print("Player exists")
return player
print("Check player exist")
if name_p1 in players_name_list:
print(f"Player 1 {name_p1} exists")
else :
print(f"Player 1 {name_p1} does not exists")
player1 = Player(
name = name_p1,
total_match = 0,
total_win = 0,
p_win = 0,
num_participated_tournaments = 0,
num_won_tournaments = 0)
player1.save()
players_name_list.append(name_p1)
print(f"Player {name_p1} creation done")
if name_p2 in players_name_list:
print(f"Player 2 {name_p2} exists")
else :
print(f"Player 2 {name_p2} does not exists")
player2 = Player(
name = name_p2,
total_match = 0,
total_win = 0,
p_win = 0,
num_participated_tournaments = 0,
num_won_tournaments = 0)
player2.save()
players_name_list.append(name_p2)
print(f"Player {name_p2} creation done")
#return player
@ -58,6 +76,7 @@ def create_tournoi(name, nbr_player, date, winner):
return tournoi
def create_match(player1, player2, score_player1, score_player2, nbr_ball_touch_p1, nbr_ball_touch_p2, duration, is_tournoi, tournoi):
print("MATCH BEING REGISTERD")
match = Match(
player1=player1,
player2=player2,
@ -76,9 +95,14 @@ def create_match(player1, player2, score_player1, score_player2, nbr_ball_touch_
match.winner = match.player2
else:
match.winner = None
print("MATCH SAVE IN DB")
match.save()
return match
print("MATCH DONE")
#update_player_statistics(player1)
#update_player_statistics(player2)
#print("STAT DONE")
def update_player_statistics(player_name):
print("UPDATED DATA")

View File

@ -71,8 +71,8 @@ def match_list_json(request):
matches = Match.objects.all()
data = {
'matches': list(matches.values(
'id', 'player1__name', 'player2__name', 'score_player1', 'score_player2',
'winner__name', 'nbr_ball_touch_p1', 'nbr_ball_touch_p2', 'duration', 'date',
'id', 'player1', 'player2', 'score_player1', 'score_player2',
'winner', 'nbr_ball_touch_p1', 'nbr_ball_touch_p2', 'duration', 'date',
'is_tournoi', 'tournoi__name'
))
}

View File

@ -109,11 +109,11 @@ document.addEventListener('DOMContentLoaded', () => {
const row = document.createElement('tr');
row.innerHTML = `
<td>${match.id}</td>
<td>${match.player1__name}</td>
<td>${match.player2__name}</td>
<td>${match.player1}</td>
<td>${match.player2}</td>
<td>${match.score_player1}</td>
<td>${match.score_player2}</td>
<td>${match.winner__name}</td>
<td>${match.winner}</td>
<td>${match.nbr_ball_touch_p1}</td>
<td>${match.nbr_ball_touch_p2}</td>
<td>${match.duration}</td>