From 6fd802a788c62c1f7436c2f7b7481d1635b768d2 Mon Sep 17 00:00:00 2001 From: tomoron Date: Fri, 27 Sep 2024 03:57:43 +0200 Subject: [PATCH] ball now bounces on walls, the speed of the ball now increase when it bounce anywhere (or take a jumper) --- .../djangoserver/file/server/server/Game.py | 140 ++++++++++++++---- .../file/server/server/fieldsVerif.py | 95 ++++++++++++ .../server/typeRequests/changeBanner.py | 15 +- .../server/server/typeRequests/changePfp.py | 15 +- .../server/typeRequests/changePrivateInfo.py | 88 +++-------- .../server/typeRequests/createAccount.py | 43 +----- .../server/typeRequests/gameActions/start.py | 4 +- .../server/server/typeRequests/searchUser.py | 14 +- .../djangoserver/file/server/server/utils.py | 15 ++ listError.txt | 2 + 10 files changed, 266 insertions(+), 165 deletions(-) create mode 100644 docker-compose/requirements/djangoserver/file/server/server/fieldsVerif.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/utils.py diff --git a/docker-compose/requirements/djangoserver/file/server/server/Game.py b/docker-compose/requirements/djangoserver/file/server/server/Game.py index 1ddabc3..cad8918 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Game.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Game.py @@ -6,7 +6,7 @@ # By: edbernar 0): - if(min_time == -1): - min_time = time - else: - min_time = (min(min_time, time)) - print("time :",time) + elif x["type"] == 2: + pos = self.check_wall_colision(x) + if(pos == None): + continue + dist = pos - self.ballPos["pos"][0] + time = 0 + if(self.ballVel[0] != 0): + time = dist / self.ballVel[0] + else: + time = -1 + if(time > 0): + if(min_time == -1): + min_time = time + else: + min_time = (min(min_time, time)) return(min_time) def getTimeUntilColision(self, limitNeg, limitPos, position, velocity): @@ -259,9 +313,6 @@ class Game: def getPlayerDistance(self, player, ballPos): playerPos = player["pos"] - print("Player pos : ", playerPos) - print("chose player :", 2 if ballPos[1] < 0 else 1) - print("ball position :", ballPos[0]) return(playerPos - ballPos[0]) async def scoreGoal(self, player): @@ -281,14 +332,35 @@ class Game: def checkJumpersDistance(self, ballPos): for i in range(0, len(self.obstacles)): + if(self.obstacles[i]["type"] != 1): + continue; if(self.obstacles[i]["isUp"] != self.ballPos["up"]): continue if(self.twoPointsDistance((self.obstacles[i]["pos"]["x"], self.obstacles[i]["pos"]["z"]), ballPos) < Game.jumperRadius): self.p1.sync_send({"type":"game", "content":{"action":8,"id":i}}) self.p2.sync_send({"type":"game", "content":{"action":8,"id":i}}) self.ballPos["up"] = not self.ballPos["up"] + + def checkWallsColision(self, ballPos): + for i in range(0, len(self.obstacles)): + if(self.obstacles[i]["type"] != 2): + continue; + if(self.obstacles[i]["isUp"] != self.ballPos["up"]): + continue; + if(abs(ballPos[1]) < (Game.wallWidth / 2) + Game.ballRadius): + if(abs(self.obstacles[i]["pos"]["x"] - ballPos[0]) < (Game.wallLength / 2) + Game.ballRadius): + print("not in wall 2") + return(True) + return(False) + + def increaseSpeed(self): + x = self.ballVel[0] + (Game.bounceSpeedIncrease * (self.ballVel[0] / self.speed)) + y = self.ballVel[1] + (Game.bounceSpeedIncrease * (self.ballVel[1] / self.speed)) + self.ballVel = (x, y) + self.speed += Game.bounceSpeedIncrease async def updateBall(self): + print("AAAAAAAAAAAAAAAAAAAAAAA update") now = time.time() delta = now - self.lastUpdate currentBallPos = self.ballPos["pos"] @@ -305,19 +377,22 @@ class Game: if(newBallPos[1] > 0): velZ = -velZ else: - print("distance :", playerDistance) self.lastWin = 1 if newBallPos[1] < 0 else 2 await self.scoreGoal(1 if newBallPos[1] < 0 else 2) return; elif(newBallPos[0] <= Game.limits["left"] or newBallPos[0] >= Game.limits["right"]): velX = -velX + elif(self.checkWallsColision(newBallPos)): + velZ = -velZ self.checkJumpersDistance(newBallPos) self.ballVel = (velX, velZ) + self.increaseSpeed() self.lastUpdate = now self.ballPos["pos"] = newBallPos self.sendNewBallInfo() def prepareGame(self, stop = False): + self.speed = Game.startSpeed self.ballPos = {"pos":(0, 0), "up": False} if(stop): self.ballVel = (0, 0) @@ -333,6 +408,7 @@ class Game: async def gameLoop(self): self.started = True self.sendPlayers({"action":2}) + self.prepareGame(True) await asyncio.sleep(3) self.prepareGame() while(not self.end): diff --git a/docker-compose/requirements/djangoserver/file/server/server/fieldsVerif.py b/docker-compose/requirements/djangoserver/file/server/server/fieldsVerif.py new file mode 100644 index 0000000..2c0a0e0 --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/fieldsVerif.py @@ -0,0 +1,95 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# fieldsVerif.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/09/27 02:22:43 by tomoron #+# #+# # +# Updated: 2024/09/27 03:34:11 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +import re +from .models import User + +mail_pattern = "^((?!\\.)[\\w\\-_.]*[^.])(@\\w+)(\\.\\w+(\\.\\w+)?[^.\\W])$" + +def usernameValid(username, socket=None): + err = None + code = 0 + + if (username.find(' ') != -1): + err = "Username must not contain spaces" + code = 9015 + elif (len(username) < 3): + err = "Username must be at least 3 characters long" + code = 9016 + elif (len(username) > 20): + err = "Username must be at most 20 characters long" + code = 9017 + elif (not all(c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_" for c in username)): + err = "Username must contain only letters and numbers" + code = 9018 + elif (User.objects.filter(username=username).exists()): + err = "Username already used" + code = 9023 + + if(err and socket != None): + socket.sendError(err, code) + return(err == None) + +def passwordValid(password, socket=None): + password_pattern = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$" + err = None + code = 0 + + if (len(password) < 8): + err = "Password must be at least 8 characters long" + code = 9019 +# elif (password.find(content["username"]) != -1): +# err = "Password must not contain the username" +# code = 9021 + elif (not bool(re.match(password_pattern, password))): + err = "Password must contain at least one lowercase letter, one uppercase letter and one special character" + code = 9020 + + if(err and socket != None): + socket.sendError(err, code) + return(err == None) + + +def discordValid(user, socket=None): + discord_pattern = "^[a-zA-Z0-9_.]{0,32}$" + err = None + code = 0 + + if (len(user) > 32): + err = "Discord username must be at most 32 characters long" + code = 9024 + elif (not bool(re.match(discord_pattern, user))): + err = "Discord username must between 2 and 32 letters, numbers, underscores or points" + code = 9025 + elif (len(user) == 1): + err = "Discord username must be at least 2 characters long" + code = 9026 + + if(err and socket != None): + socket.sendError(err, code) + return(err == None) + +def mailValid(mail, socket=None): + mail_pattern = "^((?!\\.)[\\w\\-_.]*[^.])(@\\w+)(\\.\\w+(\\.\\w+)?[^.\\W])$" + err = None + code = 0 + + if (not bool(re.match(mail_pattern, mail))): + err = "Invalid mail" + code = 9014 + if (User.objects.filter(mail=mail).exists()): + err = "Mail already used" + code = 9022 + + if(err and socket != None): + socket.sendError(err, code) + return(err == None) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/changeBanner.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/changeBanner.py index a6016c8..93c0e60 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/changeBanner.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/changeBanner.py @@ -6,28 +6,21 @@ # By: edbernar 20): - socket.sendError("Username must be at most 20 characters long", 9017) - return - if (not all(c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_" for c in content["username"])): - socket.sendError("Username must contain only letters and numbers", 9018) - return - if (User.objects.filter(username=content["username"]).exists()): - socket.sendError("Username already used", 9023) - return - if (content.get("new_password")): - if (not content.get("old_password")): - raise Exception("Old password is required") - if (len(content["new_password"]) < 8): - socket.sendError("Password must be at least 8 characters long", 9019) - return - if (content["new_password"].find(str(content.get("username"))) != -1): - socket.sendError("Password must not contain the username", 9021) - return - if (not bool(re.match(password_pattern, content["password"]))): - socket.sendError("Password must contain at least one lowercase letter, one uppercase letter and one special character", 9020) - if (not bool(re.match(password_pattern, content["new_password"]))): - return - if (content.get("discord")): - if (len(content["discord"]) > 32): - socket.sendError("Discord must be at most 32 characters long", 9024) - return - if (not bool(re.match(discord_pattern, content["discord"]))): - socket.sendError("Discord must contain only letters, numbers and underscores or points", 9025) - return - - user = User.objects.get(id=socket.id) - if (content.get("username")): user.username = content["username"] socket.username = content["username"] socket.scope["session"]['username'] = content["username"] - if (content.get("new_password")): + elif ("new_password" in content): + if (not passwordValid(content.get("new_password"), socket)): + return + if (not content.get("old_password")): + socket.sendError("You must provide your current password to change it",9030) + return if (hashlib.md5((user.mail + content["old_password"]).encode()).hexdigest() != user.password): socket.sendError("Invalid password", 9029) return user.password = hashlib.md5((user.mail + content["new_password"]).encode()).hexdigest() - if (content.get("discord")): - if (content["discord"] != ""): - user.discord_username = content["discord"] - else: + elif ("discord" in content): + if (not discordValid(content.get("discord"), socket)): + return + if (content["discord"] == ""): user.discord_username = None + else: + user.discord_username = content["discord"] + else: + socket.sendError("You must provide a field to update", 9028) + return; user.save() socket.scope["session"].save() socket.sync_send(json.dumps({"type": "change_private_info", "content": "Successfully updated."})) except Exception as e: - socket.sendError("An unknown error occured", 9027, e) \ No newline at end of file + socket.sendError("An unknown error occured", 9027, e) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/createAccount.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/createAccount.py index a67421c..b784afe 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/createAccount.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/createAccount.py @@ -6,7 +6,7 @@ # By: marvin +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/08/09 08:08:00 by edbernar #+# #+# # -# Updated: 2024/09/22 18:58:55 by marvin ### ########.fr # +# Updated: 2024/09/27 03:37:05 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -16,15 +16,14 @@ from ..data import ICLOUD_USER, ICLOUD_PASS, SERVER_URL from email.mime.text import MIMEText from email.mime.image import MIMEImage from asgiref.sync import sync_to_async +from ..fieldsVerif import mailValid, usernameValid, passwordValid +from ..utils import genString import smtplib import random import re import json import hashlib -mail_pattern = "^((?!\\.)[\\w\\-_.]*[^.])(@\\w+)(\\.\\w+(\\.\\w+)?[^.\\W])$" -password_pattern = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$" -allowed_char_username = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_" URLMAIL = SERVER_URL + "/verify?token=" @sync_to_async @@ -34,40 +33,16 @@ def createAccount(socket, content): socket.sendError("Already logged in", 9012) return; try: - if (not bool(re.match(mail_pattern, content["mail"]))): - socket.sendError("Invalid mail", 9014) + if(not mailValid(content["mail"], socket)): return - if (content["username"].find(' ') != -1): - socket.sendError("Username must not contain spaces", 9015) + if(not usernameValid(content["username"], socket)): return - if (len(content["username"]) < 3): - socket.sendError("Username must be at least 3 characters long", 9016) - return - if (len(content["username"]) > 20): - socket.sendError("Username must be at most 20 characters long", 9017) - return - if (not all(c in allowed_char_username for c in content["username"])): - socket.sendError("Username must contain only letters and numbers", 9018) - return - if (len(content["password"]) < 8): - socket.sendError("Password must be at least 8 characters long", 9019) - return - if (not bool(re.match(password_pattern, content["password"]))): - socket.sendError("Password must contain at least one lowercase letter, one uppercase letter and one special character", 9020) - return - if (content["password"].find(content["username"]) != -1): - socket.sendError("Password must not contain the username", 9021) - return - if (User.objects.filter(mail=content["mail"]).exists()): - socket.sendError("Mail already used", 9022) - return - if (User.objects.filter(username=content["username"]).exists()): - socket.sendError("Username already used", 9023) + if(not passwordValid(content["password"], socket)): return password = hashlib.md5((content["mail"] + content["password"]).encode()).hexdigest() new_user = User.objects.create(username=content["username"], mail=content["mail"], password=password) new_user.save() - verif_str = gen_string(200) + verif_str = genString(200) MailVerify.objects.create(uid=new_user, token=verif_str).save() print("send") socket.sync_send(json.dumps({"type": "create_account", "content": "Account created"})) @@ -175,7 +150,3 @@ def sendVerifMail(verif_str, mail, username): except Exception as e: print(f"Erreur lors de l'envoi de l'e-mail : {e}") return(0) - -def gen_string(length): - letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - return(''.join(random.choice(letters) for i in range(length))) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/gameActions/start.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/gameActions/start.py index 2d223b8..aa3ba90 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/gameActions/start.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/gameActions/start.py @@ -6,7 +6,7 @@ # By: edbernar = 10: - break - socket.sync_send({"type":"search_user", "content":userList if userList else []}) + userList.append((user.username, user.id, user.pfp)) + socket.sync_send({"type":"search_user", "content":userList}) except Exception as e: socket.sendError("An unknown error occured", 9027, e) - return \ No newline at end of file + return diff --git a/docker-compose/requirements/djangoserver/file/server/server/utils.py b/docker-compose/requirements/djangoserver/file/server/server/utils.py new file mode 100644 index 0000000..35097a0 --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/utils.py @@ -0,0 +1,15 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# utils.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/09/27 03:36:08 by tomoron #+# #+# # +# Updated: 2024/09/27 03:36:42 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +def genString(length): + letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + return(''.join(random.choice(letters) for i in range(length))) diff --git a/listError.txt b/listError.txt index 3fca675..9f52be9 100644 --- a/listError.txt +++ b/listError.txt @@ -31,7 +31,9 @@ - 9027 : An unknown error occured - 9028 : You must provide exactly one field to update - 9029 : Invalid password +- 9030 : You must provide your current password to it - 9100 : Action out of range - 9101 : No game started - 9102 : Game already started +- 9103 : You are not invited to this game