server now saves the game scores to the DB
This commit is contained in:
@ -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}
|
||||||
@ -173,26 +175,29 @@ class Game:
|
|||||||
print("obstacles generated :", self.obstacles)
|
print("obstacles generated :", self.obstacles)
|
||||||
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)
|
||||||
|
@ -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")
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user