add stats on getUserInfo request
This commit is contained in:
@ -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)
|
||||||
|
Reference in New Issue
Block a user