diff --git a/docker-compose/requirements/djangoserver/Dockerfile b/docker-compose/requirements/djangoserver/Dockerfile index 1145a09..25b8455 100644 --- a/docker-compose/requirements/djangoserver/Dockerfile +++ b/docker-compose/requirements/djangoserver/Dockerfile @@ -12,7 +12,7 @@ RUN apt install -y python3.12 postgresql-client RUN curl https://bootstrap.pypa.io/get-pip.py -o /root/get-pip.py RUN python3.12 /root/get-pip.py -RUN pip3 install requests django psycopg "channels[daphne]" +RUN pip3 install requests django psycopg "channels[daphne]" multimethod ARG DB_HOST ARG DB_NAME diff --git a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py new file mode 100644 index 0000000..3f8f6df --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py @@ -0,0 +1,78 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Tournament.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/04 17:17:07 by tomoron #+# #+# # +# Updated: 2024/10/05 02:35:50 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +import string +import asyncio +from .utils import genString + +class Tournament: + currentTournamentsLock = False + currentTournaments = {} + + playerLimit = 8 + def __init__(self, socket): + self.messages = [] + self.players = [] + while(Tournament.currentTournamentsLock): + continue; + Tournament.currentTournamentsLock = True + self.genCode() + Tournament.currentTournaments[self.code] = self + Tournament.currentTournamentsLock = False + self.join(socket) + + def genCode(self): + nbChar = 4 + self.code = genString(nbChar, string.ascii_uppercase) + nbIter = 0 + while(self.code in Tournament.currentTournaments): + if(nbIter == 100): + nbInter = 0 + nbChar += 1 + self.code = genString(nbChar, string.ascii_uppercase) + nbIter += 1 + + def broadcast(self, content): + for x in self.players: + x.sync_send("tournament",content) + + def sendAllInfo(self, socket): + players = [] + for x in self.players: + players.append({"id":socket.id,"username":socket.username, "pfp":socket.pfp}) + socket.sync_send("tournament",{"action":5, "players":players, "messages" : self.messages}) + + def sendMessage(self, socket, message): + messages.append({"username":socket.username, "message":message}) + if(len(messages) > 20): + messages.pop(0) + self.broadcast({"action":3, "username":socket.username, "message":socket.message}) + + def leave(self, socket): + if(socket not in self.players): + return; + index = self.players.index(socket) + self.players.pop(index) + socket.tournament = None + self.broadcast({"action":2,"id":socket.id}) + + def join(self, socket): + if(socket.tournament != None): + socket.sendError("already in a tournament", 9036) + return + if(len(self.players) == Tournament.playerLimit): + socket.sync_send("tournament",{"action":0, "isFull":True}) + return + socket.tournament = self + self.players.append(socket) + socket.sync_send("tournament",{"action":0,"isFull":False, "isStarted":False,"exist":True, "code":self.code}) + self.broadcast({"action":1, "id":socket.id, "username": socket.username,"pfp":socket.pfp}) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/changePfp.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/changePfp.py index d4308b4..b9a836d 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/changePfp.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/changePfp.py @@ -6,7 +6,7 @@ # By: edbernar +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/09/09 16:10:26 by tomoron #+# #+# # -# Updated: 2024/10/01 16:35:10 by tomoron ### ########.fr # +# Updated: 2024/10/04 17:10:39 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -73,6 +73,9 @@ from .gameActions.ping import ping action_list = [start, ready, leave, move, ping] async def gameRequest(socket, content): + if("action" not in content): + socket.sendError("missing action parameter",9035) + return action = content["action"] if(action < 0 or action > len(action_list)): socket.sendError("Action out of range", 9100) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/login.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/login.py index 1e6c135..17ef8fc 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/login.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/login.py @@ -6,7 +6,7 @@ # By: edbernar +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/05 02:08:12 by tomoron #+# #+# # +# Updated: 2024/10/05 02:08:52 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +async def fetchAllData(socket, content): + socket.tournament.sendAllInfo(socket) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/leave.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/leave.py new file mode 100644 index 0000000..9910b66 --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/leave.py @@ -0,0 +1,18 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# leave.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/04 18:05:07 by tomoron #+# #+# # +# Updated: 2024/10/05 02:28:42 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +async def tournamentLeave(socket, content): + print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" * 100) + if(socket.tournament == None): + socket.sendError("you're not in a tournament", 9037) + return; + socket.tournament.leave(socket) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/sendMessage.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/sendMessage.py new file mode 100644 index 0000000..81bdd5f --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/sendMessage.py @@ -0,0 +1,14 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# sendMessage.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/04 18:05:27 by tomoron #+# #+# # +# Updated: 2024/10/04 18:05:56 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +async def sendMessage(socket, content): + print("nope") diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/start.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/start.py new file mode 100644 index 0000000..bbdaaa8 --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/start.py @@ -0,0 +1,22 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# start.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/04 17:16:02 by tomoron #+# #+# # +# Updated: 2024/10/05 02:28:50 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +from ...Tournament import Tournament + +async def tournamentStart(socket, content): + if("code" in content and len(content["code"])): + if(content["code"] in Tournament.currentTournaments): + Tournament.currentTournaments[content["code"]].join(socket) + else: + socket.sync_send("tournament",{"action":0, "exist":False}) + else: + Tournament(socket) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentRequest.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentRequest.py index 9cfe8d6..f61ae1c 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentRequest.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentRequest.py @@ -6,26 +6,31 @@ # By: edbernar server will send all the data of the tournament (players, messages, etc...) with his actions - +actionList = [tournamentStart, tournamentLeave, sendMessage, fetchAllData] +async def tournamentRequest(socket, content): + if("action" not in content): + socket.sendError("missing action parameter",9035) + return + action = content["action"] + if(action < 0 or action > len(actionList)): + socket.sendError("Action out of range", 9100) + return; + if(action != 0 and socket.tournament == None): + socket.sendError("you're not in a tournament",9037) + return ; + await actionList[action](socket,content) diff --git a/docker-compose/requirements/djangoserver/file/server/server/urls.py b/docker-compose/requirements/djangoserver/file/server/server/urls.py index 01c8e72..e0037f0 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/urls.py +++ b/docker-compose/requirements/djangoserver/file/server/server/urls.py @@ -27,6 +27,7 @@ urlpatterns = [ path("profilPage", views.profilPage, name='profilPage'), # path("game", views.game, name='game'), path("wait_game", views.game, name='wait_game'), + path("tournament", views.tournament, name='tournament'), path("login42", views.login42, name='login42'), path("logout", views.logout, name='logout'), path("verify", views.verify, name='verify'), diff --git a/docker-compose/requirements/djangoserver/file/server/server/utils.py b/docker-compose/requirements/djangoserver/file/server/server/utils.py index a580648..68133a1 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/utils.py +++ b/docker-compose/requirements/djangoserver/file/server/server/utils.py @@ -6,12 +6,12 @@ # By: edbernar int: + async def login(self, uid: int, username: str, pfp : str) -> int: if(await self.session_get("logged_in", False)): print("already logged in") return(0) @@ -93,15 +95,18 @@ class WebsocketHandler(AsyncWebsocketConsumer): await self.session_set("logged_in",True) await self.session_set("id",uid) await self.session_set("username",username) + await self.session_set("pfp", pfp) await self.session_save() self.logged_in = True self.id = uid self.username = username + self.pfp = pfp return(1) async def connect(self): self.logged_in = False self.game = None + self.tournament = None self.id = 0 self.username = None self.online = True @@ -114,6 +119,7 @@ class WebsocketHandler(AsyncWebsocketConsumer): return; self.id = await self.session_get("id",0) self.username = await self.session_get("username", None) + self.pfp = await self.session_get("pfp",None) self.logged_in = True await self.send(text_data=json.dumps({"type":"logged_in", "content":{ "status":await self.session_get("logged_in",False), @@ -133,6 +139,8 @@ class WebsocketHandler(AsyncWebsocketConsumer): del self.onlinePlayers[uid] if(self.game !=None): self.game.leave(self) + if(self.tournament !=None): + self.tournament.leave(self) async def receive(self, text_data): try: @@ -153,7 +161,12 @@ class WebsocketHandler(AsyncWebsocketConsumer): self.sendError("Invalid type", 9004) except Exception as e: self.sendError("Invalid request", 9005, e) - + + @multimethod + def sync_send(self, reqType : str, content:dict): + self.sync_send({"type":reqType,"content":content}) + + @multimethod def sync_send(self, data: Union[dict,str]): if(not self.online): return diff --git a/docker-compose/requirements/nginx/static/javascript/lobbyPage/main.js b/docker-compose/requirements/nginx/static/javascript/lobbyPage/main.js index 44a7774..dee3cf9 100644 --- a/docker-compose/requirements/nginx/static/javascript/lobbyPage/main.js +++ b/docker-compose/requirements/nginx/static/javascript/lobbyPage/main.js @@ -172,11 +172,6 @@ function startTournmament() { const code = document.getElementById('tournamentCode').value; - if (code.length != 6 && code.length != 0) - { - CN.new("Information", "The code must be 6 characters long or empty"); - return ; - } sendRequest("tournament", {action: 0, code: code}); } diff --git a/listError.txt b/listError.txt index e2a66b7..ab96b6d 100644 --- a/listError.txt +++ b/listError.txt @@ -36,6 +36,9 @@ - 9032 : Your opponent isn't online - 9033 : Skin id out of range - 9034 : missing field +- 9035 : missing action parameter +- 9036 : already in a tournament +- 9037 : you're not in a tournament - 9100 : Action out of range - 9101 : No game started