server now saves the game scores to the DB

This commit is contained in:
2024-09-28 03:49:20 +02:00
parent afb5742e65
commit 322a96eaea
4 changed files with 46 additions and 18 deletions

View File

@ -6,11 +6,12 @@
# By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/09/13 16:20:58 by tomoron #+# #+# #
# Updated: 2024/09/28 02:31:10 by edbernar ### ########.fr #
# Updated: 2024/09/28 03:48:09 by tomoron ### ########.fr #
# #
# **************************************************************************** #
from asgiref.sync import sync_to_async
from .models import GameResults, User
import time
import json
import asyncio
@ -71,6 +72,7 @@ class Game:
self.started = False
self.end = False
self.left = None
self.winner = None
self.p1Pos = {"pos":0, "up": False}
self.p2Pos = {"pos":0, "up": False}
@ -174,25 +176,28 @@ class Game:
asyncio.create_task(self.gameLoop())
return(1)
def endGame(self, winner):
self.p1.sync_send({"action":"game","content":{"action":10,"won":winner==1}})
self.p2.sync_send({"action":"game","content":{"action":10,"won":winner==2}})
self.winner = winner
self.end = True
def leave(self, socket):
socket.game = None
if (socket == self.p1):
self.p1 = None
self.left = 1
else:
self.p2 = None
if(self.p1 != None):
self.p1.sync_send({"type":"game","content":{"action":4}})
self.leave(self.p1)
if(self.p2 != None):
self.p2.sync_send({"type":"game","content":{"action":4}})
self.leave(self.p2)
else:
self.left = 2
self.p1.sync_send({"type":"game","content":{"action":4}})
while(Game.waitingForPlayerLock):
time.sleeep(0.05)
Game.waitingForPlayerLock = True
if(Game.waitingForPlayerLock == socket):
Game.waitingForPlayerLock = False;
Game.waitingForPlayerLock = False
if(self.started):
self.endGame(1 if self.left == 2 else 2)
self.end=True
def sendPlayers(self, data):
@ -330,10 +335,10 @@ class Game:
def checkGameEndGoal(self):
if(self.score[0] < Game.maxScore and self.score[1] < Game.maxScore):
return(False)
print("someone won the game")
winner = 1 if self.score[0] == Game.maxScore else 2
self.p1.sync_send({"action":"game","content":{"action":10,"won":winner==1}})
self.p2.sync_send({"action":"game","content":{"action":10,"won":winner==2}})
self.end = True
print("player", winner,"won the game")
self.endGame(winner)
return(True)
async def scoreGoal(self, player):
@ -437,13 +442,31 @@ class Game:
while(not self.end):
await self.updateBall()
if(self.end):
return;
break;
sleep_time = self.getSleepTime()
print("sleep time : " , sleep_time)
await asyncio.sleep(sleep_time)
print("game end")
await self.saveResults()
@sync_to_async
def saveGame(self, winner):
print("nope")
def saveResults(self):
try:
if(self.winner == None):
print("unkown winner, settings to 1")
self.winner = 1
print("saving results")
p1DbUser = User.objects.get(id=self.p1.id)
p2DbUser = User.objects.get(id=self.p2.id)
results = GameResults.objects.create(
player1 = p1DbUser,
player2 = p2DbUser,
p1Score = self.score[0],
p2Score = self.score[1],
winner = p1DbUser if self.winner == 1 else p2DbUser
)
results.save()
print("results saved")
except Exception as e:
self.p1.sendError("Couldn't save last game results", 9104, e)
self.p2.sendError("Couldn't save last game results", 9104, e)

View File

@ -20,7 +20,7 @@ class Message(models.Model):
to = models.ForeignKey("User", on_delete=models.CASCADE, related_name="to")
content = models.TextField()
class Game(models.Model):
class GameResults(models.Model):
id = models.AutoField(primary_key=True)
end_date = models.DateTimeField(auto_now_add=True)
player1 = models.ForeignKey("User", on_delete=models.SET_NULL, null=True, related_name="p1")

View File

@ -6,7 +6,7 @@
# By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/09/09 14:31:30 by tomoron #+# #+# #
# Updated: 2024/09/26 00:17:17 by edbernar ### ########.fr #
# Updated: 2024/09/28 03:19:46 by tomoron ### ########.fr #
# #
# **************************************************************************** #
@ -94,6 +94,7 @@ class WebsocketHandler(AsyncWebsocketConsumer):
self.game = None
self.id = 0
self.username = None
self.online = True
await self.accept()
if(await self.session_get("logged_in", False)):
if(not self.add_to_online(await self.session_get("id", 0))):
@ -113,6 +114,7 @@ class WebsocketHandler(AsyncWebsocketConsumer):
async def disconnect(self, close_code):
print("you can go, i am not mad, we never wanted you anyway")
self.online = False
if(not self.logged_in):
return ;
uid = await self.session_get("id", 0)
@ -142,6 +144,8 @@ class WebsocketHandler(AsyncWebsocketConsumer):
self.sendError("Invalid request", 9005, e)
def sync_send(self, data: Union[dict,str]):
if(not self.online):
return
txt_data = None
if(type(data) is dict):
txt_data = json.dumps(data)

View File

@ -40,3 +40,4 @@
- 9101 : No game started
- 9102 : Game already started
- 9103 : You are not invited to this game
- 9104 : Couldn't save last game results