add stats on getUserInfo request

This commit is contained in:
2024-11-18 14:33:54 +01:00
parent b8e558c2d2
commit 9cbb11c329

View File

@ -6,11 +6,13 @@
# By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ # # By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ # # +#+#+#+#+#+ +#+ #
# Created: 2024/09/20 00:16:57 by edbernar #+# #+# # # Created: 2024/09/20 00:16:57 by edbernar #+# #+# #
# Updated: 2024/10/28 22:10:32 by tomoron ### ########.fr # # Updated: 2024/11/18 14:32:21 by tomoron ### ########.fr #
# # # #
# **************************************************************************** # # **************************************************************************** #
from django.db.models import Q from django.db.models import Q, Avg
from django.utils import timezone
from datetime import timedelta
from asgiref.sync import sync_to_async from asgiref.sync import sync_to_async
from ..models import User, GameResults from ..models import User, GameResults
import json import json
@ -35,6 +37,41 @@ def getHistory(user, games):
}) })
return(res) return(res)
def getStats(user):
games = GameResults.objects.filter(Q(player1=user) | Q(player2=user))
nbGames = games.count()
nbWin = games.filter(winner=user).count()
history = getHistory(user, games.order_by("-end_date")[:10])
nbForfeitOpponent = games.filter(Q(winner=user) & Q(forfeit=True))
if(nbGames):
forfeitRate = (100 / nbGames) * nbForfeitOpponent
else:
forfeitRate = 0
averageScorePlayer1 = GameResults.objects.filter(player1=user).aggregate(Avg('p1Score'))["p1Score__avg"]
averageScorePlayer2 = GameResults.objects.filter(player2=user).aggregate(Avg('p2Score'))["p2Score__avg"]
if(averageScorePlayer1 == None and averageScorePlayer2 == None):
avgGoals = 0
elif(averageScorePlayer1 == None):
avgGoals = averageScorePlayer2
elif(averageScorePlayer2 == None):
avgGoals = averageScorePlayer1
else:
avgGoals = (averageScorePlayer1 + averageScorePlayer2) / 2
limit = timezone.now() - timedelta(days=30)
nbGames30Days = games.filter(end_date__gt=limit).count()
res = {}
res["nbLoss"] = nbGames - nbWin
res["nbWin"] = nbWin
res["forfeitRate"] = forfeitRate
res["avgGoals"] = avgGoals
res["nbGames30Days"] = nbGames30Days
res["history"] = history
return(res)
@sync_to_async @sync_to_async
def getUserInfo(socket, content): def getUserInfo(socket, content):
try: try:
@ -48,10 +85,7 @@ def getUserInfo(socket, content):
socket.sync_send({"type":"user_info", "content": None}) socket.sync_send({"type":"user_info", "content": None})
return return
user = user[0] user = user[0]
games = GameResults.objects.filter(Q(player1=user) | Q(player2=user)) stats = getStats(user)
nbGames = games.count()
nbWin = games.filter(winner=user).count()
history = getHistory(user, games.order_by("-end_date")[:10])
online = True if user.id in socket.onlinePlayers else False online = True if user.id in socket.onlinePlayers else False
socket.sync_send({"type":"user_info", "content":{ socket.sync_send({"type":"user_info", "content":{
'username': user.username, 'username': user.username,
@ -62,9 +96,12 @@ def getUserInfo(socket, content):
'github': user.github_link, 'github': user.github_link,
'discord': user.discord_username, 'discord': user.discord_username,
'elo': int(user.elo), 'elo': int(user.elo),
'nbWin':nbWin, 'nbWin':stats["nbWin"],
'nbLoss':nbGames - nbWin, 'nbLoss':stats["nbLoss"],
'history':history 'forfeitRate': stats["forfeitRate"],
'avgGoals':stats["avgGoals"],
'nbGames30Days':stats["nbGames30Days"],
'history':stats["history"]
}}) }})
except Exception as e: except Exception as e:
socket.sendError("invalid request", 9005, e) socket.sendError("invalid request", 9005, e)