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. +#+ +:+ +#+ # # By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ # # +#+#+#+#+#+ +#+ #
# Created: 2024/09/13 16:20:58 by tomoron #+# #+# # # 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 asgiref.sync import sync_to_async
from .models import GameResults, User
import time import time
import json import json
import asyncio import asyncio
@ -71,6 +72,7 @@ class Game:
self.started = False self.started = False
self.end = False self.end = False
self.left = None self.left = None
self.winner = None
self.p1Pos = {"pos":0, "up": False} self.p1Pos = {"pos":0, "up": False}
self.p2Pos = {"pos":0, "up": False} self.p2Pos = {"pos":0, "up": False}
@ -174,25 +176,28 @@ class Game:
asyncio.create_task(self.gameLoop()) asyncio.create_task(self.gameLoop())
return(1) 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): def leave(self, socket):
socket.game = None socket.game = None
if (socket == self.p1): if (socket == self.p1):
self.p1 = None
self.left = 1 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.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): while(Game.waitingForPlayerLock):
time.sleeep(0.05) time.sleeep(0.05)
Game.waitingForPlayerLock = True Game.waitingForPlayerLock = True
if(Game.waitingForPlayerLock == socket): if(Game.waitingForPlayerLock == socket):
Game.waitingForPlayerLock = False; Game.waitingForPlayerLock = False;
Game.waitingForPlayerLock = False Game.waitingForPlayerLock = False
if(self.started):
self.endGame(1 if self.left == 2 else 2)
self.end=True self.end=True
def sendPlayers(self, data): def sendPlayers(self, data):
@ -330,10 +335,10 @@ class Game:
def checkGameEndGoal(self): def checkGameEndGoal(self):
if(self.score[0] < Game.maxScore and self.score[1] < Game.maxScore): if(self.score[0] < Game.maxScore and self.score[1] < Game.maxScore):
return(False) return(False)
print("someone won the game")
winner = 1 if self.score[0] == Game.maxScore else 2 winner = 1 if self.score[0] == Game.maxScore else 2
self.p1.sync_send({"action":"game","content":{"action":10,"won":winner==1}}) print("player", winner,"won the game")
self.p2.sync_send({"action":"game","content":{"action":10,"won":winner==2}}) self.endGame(winner)
self.end = True
return(True) return(True)
async def scoreGoal(self, player): async def scoreGoal(self, player):
@ -437,13 +442,31 @@ class Game:
while(not self.end): while(not self.end):
await self.updateBall() await self.updateBall()
if(self.end): if(self.end):
return; break;
sleep_time = self.getSleepTime() sleep_time = self.getSleepTime()
print("sleep time : " , sleep_time) print("sleep time : " , sleep_time)
await asyncio.sleep(sleep_time) await asyncio.sleep(sleep_time)
print("game end") print("game end")
await self.saveResults()
@sync_to_async @sync_to_async
def saveGame(self, winner): def saveResults(self):
print("nope") 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") to = models.ForeignKey("User", on_delete=models.CASCADE, related_name="to")
content = models.TextField() content = models.TextField()
class Game(models.Model): class GameResults(models.Model):
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
end_date = models.DateTimeField(auto_now_add=True) end_date = models.DateTimeField(auto_now_add=True)
player1 = models.ForeignKey("User", on_delete=models.SET_NULL, null=True, related_name="p1") 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. +#+ +:+ +#+ # # By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ # # +#+#+#+#+#+ +#+ #
# Created: 2024/09/09 14:31:30 by tomoron #+# #+# # # 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.game = None
self.id = 0 self.id = 0
self.username = None self.username = None
self.online = True
await self.accept() await self.accept()
if(await self.session_get("logged_in", False)): if(await self.session_get("logged_in", False)):
if(not self.add_to_online(await self.session_get("id", 0))): 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): async def disconnect(self, close_code):
print("you can go, i am not mad, we never wanted you anyway") print("you can go, i am not mad, we never wanted you anyway")
self.online = False
if(not self.logged_in): if(not self.logged_in):
return ; return ;
uid = await self.session_get("id", 0) uid = await self.session_get("id", 0)
@ -142,6 +144,8 @@ class WebsocketHandler(AsyncWebsocketConsumer):
self.sendError("Invalid request", 9005, e) self.sendError("Invalid request", 9005, e)
def sync_send(self, data: Union[dict,str]): def sync_send(self, data: Union[dict,str]):
if(not self.online):
return
txt_data = None txt_data = None
if(type(data) is dict): if(type(data) is dict):
txt_data = json.dumps(data) txt_data = json.dumps(data)

View File

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