From 0200a360e9d5692d92b1cff56db8cfde0f0c20b7 Mon Sep 17 00:00:00 2001 From: Kum1ta Date: Sat, 5 Oct 2024 01:09:29 +0200 Subject: [PATCH 1/7] Game - add vr support - add gamepad support and vr controller (only in vr for that) --- .../djangoserver/file/server/server/urls.py | 2 +- .../javascript/multiOnlineGame/Player.js | 108 ++++++++++++++++-- .../multiOnlineGame/multiOnlineGamePage.js | 102 ++++++++++++----- .../jsm/webxr/XRControllerModelFactory.js | 4 +- .../nginx/static/style/game/games.css | 14 ++- 5 files changed, 191 insertions(+), 39 deletions(-) diff --git a/docker-compose/requirements/djangoserver/file/server/server/urls.py b/docker-compose/requirements/djangoserver/file/server/server/urls.py index 4fb9a9a..01c8e72 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/urls.py +++ b/docker-compose/requirements/djangoserver/file/server/server/urls.py @@ -25,7 +25,7 @@ urlpatterns = [ path("multiOnlineGamePage", views.multiOnlineGamePage, name='multiOnlineGamePage'), path("waitingGamePage", views.waitingGamePage, name='waitingGamePage'), path("profilPage", views.profilPage, name='profilPage'), - path("game", views.game, name='game'), + # path("game", views.game, name='game'), path("wait_game", views.game, name='wait_game'), path("login42", views.login42, name='login42'), path("logout", views.logout, name='logout'), diff --git a/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/Player.js b/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/Player.js index 6d5cd8e..5ce18d7 100644 --- a/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/Player.js +++ b/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/Player.js @@ -6,13 +6,16 @@ /* By: edbernar 0.75 || this.buttonAAction) + addKeyInArr({key: key.down}) + else + remKeyInArr({key: key.down}); + if (yAxis < -0.75 || this.buttonAAction) + addKeyInArr({key: key.up}) + else + remKeyInArr({key: key.up}); + if (xAxis > 0.5) + addKeyInArr({key: key.right}) + else + remKeyInArr({key: key.right}); + if (xAxis < -0.5) + addKeyInArr({key: key.left}) + else + remKeyInArr({key: key.left}); } setCameraPosition(x, y, z) @@ -369,6 +430,37 @@ class Player }, i * 10); } } + + configureVrController() + { + controller1 = renderer.xr.getController(0); + controller2 = renderer.xr.getController(1); + + scene.add(controller1); + scene.add(controller2); + + for (let i = 0; i < scene.children.length; i++) + { + if (scene.children[i].name === 'vrHeadset') + { + const controllerGrip1 = renderer.xr.getControllerGrip(0); + controllerGrip1.add(controllerModelFactory.createControllerModel(controllerGrip1)); + scene.children[i].add(controllerGrip1); + + const controllerGrip2 = renderer.xr.getControllerGrip(1); + controllerGrip2.add(controllerModelFactory.createControllerModel(controllerGrip2)); + scene.children[i].add(controllerGrip2); + } + } + + controller1.addEventListener('connected', (event) => { + controller1.userData.inputSource = event.data; + }); + + controller2.addEventListener('connected', (event) => { + controller2.userData.inputSource = event.data; + }); + } }; function addKeyInArr(e) diff --git a/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/multiOnlineGamePage.js b/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/multiOnlineGamePage.js index 80d9a3d..086fc0c 100644 --- a/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/multiOnlineGamePage.js +++ b/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/multiOnlineGamePage.js @@ -6,20 +6,20 @@ /* By: edbernar { + mutationsList.forEach((mutation) => { + if (VrButton.innerText == 'VR NOT SUPPORTED') + document.getElementById('newButtonVr').style.display = 'none'; + if (mutation.attributeName === 'style') + VrButton.style.display = 'none'; + }); +}); // ------------------- (need to be remove) -------------------- // const cameraTmp = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight); @@ -75,7 +85,6 @@ class MultiOnlineGamePage { static create(skin) { - console.log(lastSelectedGoal); if (!skin) skin = {player: 0, opponent: 0}; const bar1 = createBarPlayer(availableSkins[skin.player]); @@ -89,6 +98,8 @@ class MultiOnlineGamePage renderer.shadowMap.type = THREE.PCFSoftShadowMap; renderer.domElement.style.animation = 'fadeOutStartGames 1s'; renderer.domElement.style.filter = 'brightness(1)'; + + vrMode(); opponent = new Opponent(bar2, map, Math.floor(Math.random() * 100 % 6)); player = new Player(bar1, map, opponent, Math.floor(Math.random() * 100 % 6), skin.goalId); spotLight = new THREE.SpotLight(0xffffff, 10000, 0, 0.2); @@ -175,6 +186,8 @@ class MultiOnlineGamePage static dispose() { + observer.disconnect(); + VrButton = null; window.removeEventListener('resize', windowUpdater); if (interval) clearInterval(interval); @@ -298,7 +311,6 @@ function loop() renderer.render(scene, player.camera); } -let lastFpsArr = [10, 3, 5]; function showFps() { @@ -316,4 +328,40 @@ function showFps() lastFpsTime = now; } -export { MultiOnlineGamePage, player, opponent, ball, map}; \ No newline at end of file +function vrMode() +{ + const supportsXR = 'xr' in window.navigator; + const newButton = configButton(); + + if (!supportsXR) + return ; + renderer.xr.enabled = true; + document.body.appendChild( VRButton.createButton(renderer) ); + VrButton = document.getElementById('VRButton'); + observer.observe(VrButton, { attributes: true }); + if (VrButton.innerText !== 'VR NOT SUPPORTED') + document.body.append(newButton); +} + +function configButton() +{ + const newButton = document.createElement('button'); + const cameraGroup = new THREE.Group(); + + cameraGroup.name = "vrHeadset"; + newButton.innerText = "Vr mode"; + newButton.setAttribute('id', 'newButtonVr'); + newButton.addEventListener('click', () => { + VrButton.click(); + scene.add(cameraGroup); + scene.remove(player.camera); + player.configureVrController(); + cameraGroup.add(player.camera); + cameraGroup.position.set(0, 0.5, 7.5); + isInVrMode = true; + }); + return (newButton); +} + + +export { MultiOnlineGamePage, player, opponent, ball, map, scene, renderer, isInVrMode }; \ No newline at end of file diff --git a/docker-compose/requirements/nginx/static/javascript/three/examples/jsm/webxr/XRControllerModelFactory.js b/docker-compose/requirements/nginx/static/javascript/three/examples/jsm/webxr/XRControllerModelFactory.js index 9f60521..3fc8efd 100644 --- a/docker-compose/requirements/nginx/static/javascript/three/examples/jsm/webxr/XRControllerModelFactory.js +++ b/docker-compose/requirements/nginx/static/javascript/three/examples/jsm/webxr/XRControllerModelFactory.js @@ -150,14 +150,14 @@ function findNodes( motionController, scene ) { // If the extents cannot be found, skip this animation if ( ! visualResponse.minNode ) { - console.warn( `Could not find ${minNodeName} in the model` ); + // console.warn( `Could not find ${minNodeName} in the model` ); return; } if ( ! visualResponse.maxNode ) { - console.warn( `Could not find ${maxNodeName} in the model` ); + // console.warn( `Could not find ${maxNodeName} in the model` ); return; } diff --git a/docker-compose/requirements/nginx/static/style/game/games.css b/docker-compose/requirements/nginx/static/style/game/games.css index 3d6aa47..cd0a7b7 100644 --- a/docker-compose/requirements/nginx/static/style/game/games.css +++ b/docker-compose/requirements/nginx/static/style/game/games.css @@ -6,7 +6,7 @@ /* By: edbernar Date: Sat, 5 Oct 2024 02:40:15 +0200 Subject: [PATCH 2/7] add tournament request to server(not complete) --- .../requirements/djangoserver/Dockerfile | 2 +- .../file/server/server/Tournament.py | 78 +++++++++++++++++++ .../server/server/typeRequests/changePfp.py | 9 ++- .../server/server/typeRequests/gameRequest.py | 5 +- .../file/server/server/typeRequests/login.py | 39 +++++----- .../tournamentActions/fetchAllData.py | 14 ++++ .../typeRequests/tournamentActions/leave.py | 18 +++++ .../tournamentActions/sendMessage.py | 14 ++++ .../typeRequests/tournamentActions/start.py | 22 ++++++ .../server/typeRequests/tournamentRequest.py | 33 ++++++-- .../djangoserver/file/server/server/urls.py | 1 + .../djangoserver/file/server/server/utils.py | 6 +- .../djangoserver/file/server/server/views.py | 7 +- .../file/server/server/websocket.py | 27 +++++-- .../nginx/static/javascript/lobbyPage/main.js | 5 -- listError.txt | 3 + 16 files changed, 238 insertions(+), 45 deletions(-) create mode 100644 docker-compose/requirements/djangoserver/file/server/server/Tournament.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/fetchAllData.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/leave.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/sendMessage.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/start.py 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 From 4a8825edf12e281fa2b9cbe99aadd6ddc48b9381 Mon Sep 17 00:00:00 2001 From: tomoron Date: Sat, 5 Oct 2024 02:58:23 +0200 Subject: [PATCH 3/7] fix send all info --- .../djangoserver/file/server/server/Tournament.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py index 3f8f6df..576ffc2 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py @@ -6,7 +6,7 @@ # By: tomoron +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/04 17:17:07 by tomoron #+# #+# # -# Updated: 2024/10/05 02:35:50 by tomoron ### ########.fr # +# Updated: 2024/10/05 02:58:08 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -48,7 +48,7 @@ class Tournament: def sendAllInfo(self, socket): players = [] for x in self.players: - players.append({"id":socket.id,"username":socket.username, "pfp":socket.pfp}) + players.append({"id":x.id,"username":x.username, "pfp":x.pfp}) socket.sync_send("tournament",{"action":5, "players":players, "messages" : self.messages}) def sendMessage(self, socket, message): From 3f2f7c7d5f3e1609cd72adf2ffda52336ff282e4 Mon Sep 17 00:00:00 2001 From: tomoron Date: Sat, 5 Oct 2024 03:28:48 +0200 Subject: [PATCH 4/7] add send message tournament request --- .../server/typeRequests/tournamentActions/sendMessage.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 index 81bdd5f..9a57e13 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/sendMessage.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/sendMessage.py @@ -6,9 +6,12 @@ # By: tomoron +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/04 18:05:27 by tomoron #+# #+# # -# Updated: 2024/10/04 18:05:56 by tomoron ### ########.fr # +# Updated: 2024/10/05 03:27:45 by tomoron ### ########.fr # # # # **************************************************************************** # async def sendMessage(socket, content): - print("nope") + if("message" not in content): + socket.sendError("missing message field",9038) + return + socket.tournament.sendMessage(socket, content["message"]) From 64346413c3f42f5eed5549ff7af629b9848ac53d Mon Sep 17 00:00:00 2001 From: tomoron Date: Sat, 5 Oct 2024 03:31:14 +0200 Subject: [PATCH 5/7] fix sendMessage method --- .../djangoserver/file/server/server/Tournament.py | 8 ++++---- listError.txt | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py index 576ffc2..d9be6d0 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py @@ -6,7 +6,7 @@ # By: tomoron +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/04 17:17:07 by tomoron #+# #+# # -# Updated: 2024/10/05 02:58:08 by tomoron ### ########.fr # +# Updated: 2024/10/05 03:30:00 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -52,9 +52,9 @@ class Tournament: 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.messages.append({"username":socket.username, "message":message}) + if(len(self.messages) > 20): + self.messages.pop(0) self.broadcast({"action":3, "username":socket.username, "message":socket.message}) def leave(self, socket): diff --git a/listError.txt b/listError.txt index ab96b6d..df15aa3 100644 --- a/listError.txt +++ b/listError.txt @@ -39,6 +39,7 @@ - 9035 : missing action parameter - 9036 : already in a tournament - 9037 : you're not in a tournament +- 9038 : missing message field - 9100 : Action out of range - 9101 : No game started From d8284b78e261d64634800e1aff994c688479cf15 Mon Sep 17 00:00:00 2001 From: Kum1ta Date: Sat, 5 Oct 2024 04:30:20 +0200 Subject: [PATCH 6/7] Site - can send message in tournament - request 3 server tournamment Game - change buttons position on multi online --- .../file/server/server/Tournament.py | 6 +-- .../server/server/templates/lobbyPage.html | 2 +- .../javascript/multiOnlineGame/Player.js | 3 +- .../tournamentPage/TournamentPage.js | 39 ++++++++++++++++++- .../javascript/typeResponse/typeTournament.js | 4 +- .../nginx/static/style/game/games.css | 14 +++---- 6 files changed, 52 insertions(+), 16 deletions(-) diff --git a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py index d9be6d0..1def069 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py @@ -3,10 +3,10 @@ # ::: :::::::: # # Tournament.py :+: :+: :+: # # +:+ +:+ +:+ # -# By: tomoron +#+ +:+ +#+ # +# By: edbernar 20): self.messages.pop(0) - self.broadcast({"action":3, "username":socket.username, "message":socket.message}) + self.broadcast({"action":3, "username":socket.username, "message":message}) def leave(self, socket): if(socket not in self.players): diff --git a/docker-compose/requirements/djangoserver/file/server/server/templates/lobbyPage.html b/docker-compose/requirements/djangoserver/file/server/server/templates/lobbyPage.html index b4bc000..31838e5 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/templates/lobbyPage.html +++ b/docker-compose/requirements/djangoserver/file/server/server/templates/lobbyPage.html @@ -193,7 +193,7 @@

Tournament code

- +
diff --git a/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/Player.js b/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/Player.js index 5ce18d7..6f00012 100644 --- a/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/Player.js +++ b/docker-compose/requirements/nginx/static/javascript/multiOnlineGame/Player.js @@ -6,7 +6,7 @@ /* By: edbernar { const key = event.target.getAttribute("id"); - for (let i = 0; i < keyList.length; i++) { diff --git a/docker-compose/requirements/nginx/static/javascript/tournamentPage/TournamentPage.js b/docker-compose/requirements/nginx/static/javascript/tournamentPage/TournamentPage.js index 1b54bf6..8e39769 100644 --- a/docker-compose/requirements/nginx/static/javascript/tournamentPage/TournamentPage.js +++ b/docker-compose/requirements/nginx/static/javascript/tournamentPage/TournamentPage.js @@ -6,7 +6,7 @@ /* By: edbernar { + sendRequest("tournament", {action: 2, message: inputMessage.value}); + inputMessage.value = ""; + inputMessage.focus(); + }); + inputMessage.addEventListener("keyup", (event) => { + if (event.key === "Enter" && inputMessage.value.trim() !== "") + { + event.preventDefault(); + sendRequest("tournament", {action: 2, message: inputMessage.value}); + inputMessage.value = ""; + inputMessage.focus(); + } + }); + inputMessage.addEventListener("keydown", (event) => { + if (event.key === "Enter") + event.preventDefault(); + }); +} + export { TournamentPage } \ No newline at end of file diff --git a/docker-compose/requirements/nginx/static/javascript/typeResponse/typeTournament.js b/docker-compose/requirements/nginx/static/javascript/typeResponse/typeTournament.js index 10e6759..3f55167 100644 --- a/docker-compose/requirements/nginx/static/javascript/typeResponse/typeTournament.js +++ b/docker-compose/requirements/nginx/static/javascript/typeResponse/typeTournament.js @@ -6,7 +6,7 @@ /* By: edbernar Date: Sat, 5 Oct 2024 04:30:39 +0200 Subject: [PATCH 7/7] add bot, move player variables to a player class(might have broke some things idk) --- .../djangoserver/file/server/server/Bot.py | 15 +++ .../djangoserver/file/server/server/Game.py | 108 ++++++++---------- .../djangoserver/file/server/server/Player.py | 18 +++ .../file/server/server/Tournament.py | 2 +- 4 files changed, 82 insertions(+), 61 deletions(-) create mode 100644 docker-compose/requirements/djangoserver/file/server/server/Bot.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/Player.py diff --git a/docker-compose/requirements/djangoserver/file/server/server/Bot.py b/docker-compose/requirements/djangoserver/file/server/server/Bot.py new file mode 100644 index 0000000..2ec3d5c --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/Bot.py @@ -0,0 +1,15 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Bot.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/05 03:54:20 by tomoron #+# #+# # +# Updated: 2024/10/05 03:55:31 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +class Bot(Player): + def __init__(self): + print("I am a bot boop boop beep boop") diff --git a/docker-compose/requirements/djangoserver/file/server/server/Game.py b/docker-compose/requirements/djangoserver/file/server/server/Game.py index afe4b3c..d7c7029 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Game.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Game.py @@ -6,11 +6,12 @@ # By: edbernar = Game.limits["front"]): - player = self.p2Pos if newBallPos[1] < 0 else self.p1Pos + player = self.p2.pos if newBallPos[1] < 0 else self.p1.pos playerDistance = self.getPlayerDistance(player, newBallPos) if(playerDistance >= -(Game.playerLength / 2) and playerDistance <= Game.playerLength / 2 and player["up"] == self.ballPos["up"]): velX = -((self.speed * 0.80) * (playerDistance / (Game.playerLength / 2))) velZ = self.speed - abs(velX) if(newBallPos[1] > 0): velZ = -velZ - self.p1.sync_send({"type":"game","content":{"action":4, "is_opponent": newBallPos[1] < 0}}) - self.p2.sync_send({"type":"game","content":{"action":4, "is_opponent": newBallPos[1] > 0}}) + self.p1.socket.sync_send({"type":"game","content":{"action":4, "is_opponent": newBallPos[1] < 0}}) + self.p2.socket.sync_send({"type":"game","content":{"action":4, "is_opponent": newBallPos[1] > 0}}) else: await self.scoreGoal(1 if newBallPos[1] < 0 else 2) return; @@ -458,12 +447,11 @@ class Game: break; sleep_time = self.getSleepTime() print("sleep time : " , sleep_time) - self.expSleepTime = sleep_time await asyncio.sleep(sleep_time) print("game end") await self.saveResults() - self.p1.game = None - self.p2.game = None + self.p1.socket.game = None + self.p2.socket.game = None @sync_to_async def saveResults(self): @@ -472,8 +460,8 @@ class Game: print("unkown winner, setting to 1") self.winner = 1 print("saving results") - p1DbUser = User.objects.get(id=self.p1.id) - p2DbUser = User.objects.get(id=self.p2.id) + p1DbUser = User.objects.get(id=self.p1.socket.id) + p2DbUser = User.objects.get(id=self.p2.socket.id) results = GameResults.objects.create( player1 = p1DbUser, player2 = p2DbUser, @@ -485,5 +473,5 @@ class Game: 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) + self.p1.socket.sendError("Couldn't save last game results", 9104, e) + self.p2.socket.sendError("Couldn't save last game results", 9104, e) diff --git a/docker-compose/requirements/djangoserver/file/server/server/Player.py b/docker-compose/requirements/djangoserver/file/server/server/Player.py new file mode 100644 index 0000000..6aa4cbd --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/Player.py @@ -0,0 +1,18 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Player.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/05 03:22:32 by tomoron #+# #+# # +# Updated: 2024/10/05 03:46:24 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +class Player(): + def __init__(self): + self.socket = None + self.ready = False + self.pos = {"pos":0, "up": False} + self.skin = 0 diff --git a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py index 1def069..22b90e6 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py @@ -6,7 +6,7 @@ # By: edbernar