From 984c8a2a827485aa660cb50a01ae6873078ef45a Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Sun, 15 Sep 2024 18:39:45 +0200 Subject: [PATCH] chat --- logs/172.20.2.60-1726141292617.log | 56 -- logs/172.20.2.60-1726142931992.log | 72 -- logs/172.20.2.60-1726144089884.log | 126 ---- logs/172.20.2.60-1726150242355.log | 78 -- pong/game/consumers.py | 410 ++++++----- .../0001_initial.py:Zone.Identifier | 0 ...0002_alter_match_winner.py:Zone.Identifier | 0 pong/static/game.js | 671 ++++++++++-------- pong/static/index.html | 44 +- pong/static/styles.css | 223 +++--- 10 files changed, 774 insertions(+), 906 deletions(-) delete mode 100644 logs/172.20.2.60-1726141292617.log delete mode 100644 logs/172.20.2.60-1726142931992.log delete mode 100644 logs/172.20.2.60-1726144089884.log delete mode 100644 logs/172.20.2.60-1726150242355.log delete mode 100644 pong/game/migrations/0001_initial.py:Zone.Identifier delete mode 100644 pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier diff --git a/logs/172.20.2.60-1726141292617.log b/logs/172.20.2.60-1726141292617.log deleted file mode 100644 index 64d21c5..0000000 --- a/logs/172.20.2.60-1726141292617.log +++ /dev/null @@ -1,56 +0,0 @@ -:8080/:1 The Cross-Origin-Opener-Policy header has been ignored, because the URL's origin was untrustworthy. It was defined either in the final response or a redirect. Please deliver the response using the HTTPS protocol. You can also use the 'localhost' origin instead. See https://www.w3.org/TR/powerful-features/#potentially-trustworthy-origin and https://html.spec.whatwg.org/#the-cross-origin-opener-policy-header. -game.js:2 DOM fully loaded and parsed -game.js:48 DOM elements initialized -game.js:71 Event listeners added -game.js:186 checkUserExists called with username: didi -game.js:203 User existence check response: {exists: false} -game.js:212 handleRegister called -game.js:225 Attempting to register user: didi -game.js:250 registerUser called with username: didi -game.js:273 Registration response data: {registered: true, token: '391a5261-4dac-4555-9c5f-7d1000557dc0'} -game.js:275 User registered successfully: {registered: true, token: '391a5261-4dac-4555-9c5f-7d1000557dc0'} -game.js:229 Token stored: 391a5261-4dac-4555-9c5f-7d1000557dc0 -game.js:230 User registered successfully -game.js:964 Joining room: main_room with username: didi and token: 391a5261-4dac-4555-9c5f-7d1000557dc0 -game.js:971 Joining new room: main_room -game.js:888 createRoomTab: main_room with username: didi and token: 391a5261-4dac-4555-9c5f-7d1000557dc0 -game.js:898 Tab for room main_room already exists. -game.js:912 Showing tab for room: main_room -game.js:807 Initializing chat WebSocket... -game.js:808 Initializing chat WebSocket for room: main_room with username: didi -game.js:811 startChatWebSocket: main_room with username: didi and token: 391a5261-4dac-4555-9c5f-7d1000557dc0 -game.js:875 WebSocket connection stored for room: main_room -game.js:919 switchRoom: main_room with username: didi and token: 391a5261-4dac-4555-9c5f-7d1000557dc0 -game.js:925 Attempting to switch to room: main_room -game.js:931 Switching from room null to room main_room -game.js:816 Chat WebSocket connection established in room: main_room -game.js:825 Authentication message sent for room: main_room with username: didi -game.js:831 Message received from server in room main_room: {type: 'authenticated', username: 'didi'} -game.js:835 User authenticated successfully in room: main_room -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'didi: a rejoint le chat main_room', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'didi: kikou', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'didi: /b', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room -game.js:831 Message received from server in room main_room: {type: 'success', message: 'You have blocked dd'} -game.js:855 Unhandled message type: {type: 'success', message: 'You have blocked dd'} -chatSocket.onmessage @ game.js:855 -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'fifi: a rejoint le chat main_room', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'fifi: hello', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'didi: hello', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'didi: tu veux jouer', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'fifi: oui', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room -game.js:831 Message received from server in room main_room: {type: 'error', message: 'Erreur interne du serveur'} -game.js:852 Error message received: Erreur interne du serveur -chatSocket.onmessage @ game.js:852 -game.js:831 Message received from server in room main_room: {type: 'success', message: 'You have blocked fifi'} -game.js:855 Unhandled message type: {type: 'success', message: 'You have blocked fifi'} -chatSocket.onmessage @ game.js:855 -game.js:831 Message received from server in room main_room: {type: 'chat_message', message: 'fifi: conard', room: 'main_room'} -game.js:846 Message displayed in chat log for room: main_room diff --git a/logs/172.20.2.60-1726142931992.log b/logs/172.20.2.60-1726142931992.log deleted file mode 100644 index b064e74..0000000 --- a/logs/172.20.2.60-1726142931992.log +++ /dev/null @@ -1,72 +0,0 @@ -:8080/:1 The Cross-Origin-Opener-Policy header has been ignored, because the URL's origin was untrustworthy. It was defined either in the final response or a redirect. Please deliver the response using the HTTPS protocol. You can also use the 'localhost' origin instead. See https://www.w3.org/TR/powerful-features/#potentially-trustworthy-origin and https://html.spec.whatwg.org/#the-cross-origin-opener-policy-header. -game.js:2 DOM fully loaded and parsed -game.js:48 DOM elements initialized -game.js:71 Event listeners added -game.js:186 checkUserExists called with username: dudu -game.js:203 User existence check response: {exists: false} -game.js:212 handleRegister called -game.js:225 Attempting to register user: dudu -game.js:250 registerUser called with username: dudu -game.js:273 Registration response data: {registered: true, token: '5265ee4d-d0f3-4d7e-a465-e152d90f43f3'} -game.js:275 User registered successfully: {registered: true, token: '5265ee4d-d0f3-4d7e-a465-e152d90f43f3'} -game.js:229 Token stored: 5265ee4d-d0f3-4d7e-a465-e152d90f43f3 -game.js:230 User registered successfully -game.js:973 Joining room: main_room with username: dudu and token: 5265ee4d-d0f3-4d7e-a465-e152d90f43f3 -game.js:980 Joining new room: main_room -game.js:897 createRoomTab: main_room with username: dudu and token: 5265ee4d-d0f3-4d7e-a465-e152d90f43f3 -game.js:907 Tab for room main_room already exists. -game.js:921 Showing tab for room: main_room -game.js:818 Initializing chat WebSocket... -game.js:819 Initializing chat WebSocket for room: main_room with username: dudu -game.js:822 startChatWebSocket: main_room with username: dudu and token: 5265ee4d-d0f3-4d7e-a465-e152d90f43f3 -game.js:886 WebSocket connection stored for room: main_room -game.js:734 ChatInput initialized for room: main_room, username: dudu -game.js:928 switchRoom: main_room with username: dudu and token: 5265ee4d-d0f3-4d7e-a465-e152d90f43f3 -game.js:934 Attempting to switch to room: main_room -game.js:940 Switching from room null to room main_room -game.js:827 Chat WebSocket connection established in room: main_room -game.js:836 Authentication message sent for room: main_room with username: dudu -game.js:842 Message received from server in room main_room: {type: 'authenticated', username: 'dudu'} -game.js:846 User authenticated successfully in room: main_room -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'dudu: a rejoint le chat main_room', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:749 Send button clicked, attempting to send message... -game.js:756 Attempting to send message: frfrfr -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'dudu: frfrfr', room: 'main_room'}message: "dudu: frfrfr"room: "main_room"type: "chat_message"[[Prototype]]: Object -game.js:857 Message displayed in chat log for room: main_room -game.js:749 Send button clicked, attempting to send message... -game.js:756 Attempting to send message: frfr -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'dudu: frfr', room: 'main_room'}message: "dudu: frfr"room: "main_room"type: "chat_message"[[Prototype]]: Object -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /b -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'dudu: /b', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /b b -game.js:761 Detected block command for user: b -game.js:784 Sending block command to WebSocket for user: b -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'success', message: 'You have blocked b'} -game.js:866 Unhandled message type: {type: 'success', message: 'You have blocked b'} -chatSocket.onmessage @ game.js:866 -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /i -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'dudu: /i', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /i hhuhhihi hihi -game.js:765 Detected invite command for user: hhuhhihi hihi -game.js:794 Sending invite command to WebSocket for user: hhuhhihi hihi -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'error', message: 'Erreur interne du serveur'}message: "Erreur interne du serveur"type: "error"[[Prototype]]: Object -game.js:863 Error message received: Erreur interne du serveur -chatSocket.onmessage @ game.js:863 diff --git a/logs/172.20.2.60-1726144089884.log b/logs/172.20.2.60-1726144089884.log deleted file mode 100644 index 751fd1a..0000000 --- a/logs/172.20.2.60-1726144089884.log +++ /dev/null @@ -1,126 +0,0 @@ -:8080/:1 The Cross-Origin-Opener-Policy header has been ignored, because the URL's origin was untrustworthy. It was defined either in the final response or a redirect. Please deliver the response using the HTTPS protocol. You can also use the 'localhost' origin instead. See https://www.w3.org/TR/powerful-features/#potentially-trustworthy-origin and https://html.spec.whatwg.org/#the-cross-origin-opener-policy-header. -game.js:2 DOM fully loaded and parsed -game.js:48 DOM elements initialized -game.js:71 Event listeners added -game.js:186 checkUserExists called with username: rere -game.js:203 User existence check response: {exists: false} -game.js:212 handleRegister called -game.js:225 Attempting to register user: rere -game.js:250 registerUser called with username: rere -game.js:273 Registration response data: {registered: true, token: 'e07d4752-1960-43d2-a971-4cb24ae2486f'} -game.js:275 User registered successfully: {registered: true, token: 'e07d4752-1960-43d2-a971-4cb24ae2486f'} -game.js:229 Token stored: e07d4752-1960-43d2-a971-4cb24ae2486f -game.js:230 User registered successfully -game.js:978 Joining room: main_room with username: rere and token: e07d4752-1960-43d2-a971-4cb24ae2486f -game.js:985 Joining new room: main_room -game.js:902 createRoomTab: main_room with username: rere and token: e07d4752-1960-43d2-a971-4cb24ae2486f -game.js:912 Tab for room main_room already exists. -game.js:926 Showing tab for room: main_room -game.js:818 Initializing chat WebSocket... -game.js:819 Initializing chat WebSocket for room: main_room with username: rere -game.js:822 startChatWebSocket: main_room with username: rere and token: e07d4752-1960-43d2-a971-4cb24ae2486f -game.js:891 WebSocket connection stored for room: main_room -game.js:734 ChatInput initialized for room: main_room, username: rere -game.js:933 switchRoom: main_room with username: rere and token: e07d4752-1960-43d2-a971-4cb24ae2486f -game.js:939 Attempting to switch to room: main_room -game.js:945 Switching from room null to room main_room -game.js:827 Chat WebSocket connection established in room: main_room -game.js:836 Authentication message sent for room: main_room with username: rere -game.js:842 Message received from server in room main_room: {type: 'authenticated', username: 'rere'} -game.js:846 User authenticated successfully in room: main_room -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: a rejoint le chat main_room', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdc -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdc', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcd -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcd', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcdcd -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcdcd', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcdc -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcdc', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcd -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcd', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: ccccc -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: ccccc', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcdcd -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcdcd', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcdc -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcdc', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcdc -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcdc', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcdcdcd -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcdcdcd', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcdc -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcdc', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'aaaa: a rejoint le chat main_room', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'aaaa: cdcdcdcdc', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'aaaa: ccddcdcd', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: cdcdcdc -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'chat_message', message: 'rere: cdcdcdc', room: 'main_room'} -game.js:857 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /b aaaa -game.js:761 Detected block command for user: aaaa -game.js:784 Sending block command to WebSocket for user: aaaa -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'error', message: 'Target user aaaa not found in room'} -game.js:867 Error message received: Target user aaaa not found in room -chatSocket.onmessage @ game.js:867 -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /i aaaa -game.js:765 Detected invite command for user: aaaa -game.js:794 Sending invite command to WebSocket for user: aaaa -game.js:777 Message input cleared. -game.js:842 Message received from server in room main_room: {type: 'error', message: 'Erreur interne du serveur'} -game.js:867 Error message received: Erreur interne du serveur -chatSocket.onmessage @ game.js:867 diff --git a/logs/172.20.2.60-1726150242355.log b/logs/172.20.2.60-1726150242355.log deleted file mode 100644 index 78a214f..0000000 --- a/logs/172.20.2.60-1726150242355.log +++ /dev/null @@ -1,78 +0,0 @@ -172.20.2.60/:1 The Cross-Origin-Opener-Policy header has been ignored, because the URL's origin was untrustworthy. It was defined either in the final response or a redirect. Please deliver the response using the HTTPS protocol. You can also use the 'localhost' origin instead. See https://www.w3.org/TR/powerful-features/#potentially-trustworthy-origin and https://html.spec.whatwg.org/#the-cross-origin-opener-policy-header. -game.js:2 DOM fully loaded and parsed -game.js:48 DOM elements initialized -game.js:71 Event listeners added -game.js:186 checkUserExists called with username: vivi -game.js:203 User existence check response: Object -game.js:212 handleRegister called -game.js:225 Attempting to register user: vivi -game.js:250 registerUser called with username: vivi -game.js:273 Registration response data: Object -game.js:275 User registered successfully: Object -game.js:229 Token stored: 66ce0c1a-dfbc-4f0f-9ec9-a4a9d4b990fe -game.js:230 User registered successfully -game.js:980 Joining room: main_room with username: vivi and token: 66ce0c1a-dfbc-4f0f-9ec9-a4a9d4b990fe -game.js:987 Joining new room: main_room -game.js:904 createRoomTab: main_room with username: vivi and token: 66ce0c1a-dfbc-4f0f-9ec9-a4a9d4b990fe -game.js:914 Tab for room main_room already exists. -game.js:928 Showing tab for room: main_room -game.js:820 Initializing chat WebSocket... -game.js:821 Initializing chat WebSocket for room: main_room with username: vivi -game.js:824 startChatWebSocket: main_room with username: vivi and token: 66ce0c1a-dfbc-4f0f-9ec9-a4a9d4b990fe -game.js:893 WebSocket connection stored for room: main_room -game.js:734 ChatInput initialized for room: main_room, username: vivi -game.js:935 switchRoom: main_room with username: vivi and token: 66ce0c1a-dfbc-4f0f-9ec9-a4a9d4b990fe -game.js:941 Attempting to switch to room: main_room -game.js:947 Switching from room null to room main_room -game.js:829 Chat WebSocket connection established in room: main_room -game.js:838 Authentication message sent for room: main_room with username: vivi -game.js:844 Message received from server in room main_room: Object -game.js:848 User authenticated successfully in room: main_room -game.js:844 Message received from server in room main_room: Object -game.js:859 Message displayed in chat log for room: main_room -game.js:749 Send button clicked, attempting to send message... -game.js:756 Attempting to send message: cscscsc -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:844 Message received from server in room main_room: Object -game.js:859 Message displayed in chat log for room: main_room -game.js:749 Send button clicked, attempting to send message... -game.js:756 Attempting to send message: cscscs -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:844 Message received from server in room main_room: Object -game.js:859 Message displayed in chat log for room: main_room -game.js:844 Message received from server in room main_room: Object -game.js:859 Message displayed in chat log for room: main_room -game.js:844 Message received from server in room main_room: Object -game.js:859 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /b sasa -game.js:761 Detected block command for user: sasa -game.js:784 Sending block command to WebSocket for user: sasa -game.js:777 Message input cleared. -game.js:844 Message received from server in room main_room: Object -game.js:869 Error message received: Target user sasa not found in room main_room -chatSocket.onmessage @ game.js:869 -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /isasa -game.js:768 Sending chat message to WebSocket... -game.js:777 Message input cleared. -game.js:844 Message received from server in room main_room: {type: 'chat_message', message: 'vivi: /isasa', room: 'main_room'} -game.js:859 Message displayed in chat log for room: main_room -game.js:742 Enter key pressed, attempting to send message... -game.js:756 Attempting to send message: /i sas -game.js:765 Detected invite command for user: sas -game.js:794 Sending invite command to WebSocket for user: sas -game.js:777 Message input cleared. -game.js:844 Message received from server in room main_room: {type: 'error', message: 'Target user sas not found in room main_room'} -game.js:869 Error message received: Target user sas not found in room main_room -chatSocket.onmessage @ game.js:869 -game.js:749 Send button clicked, attempting to send message... -game.js:756 Attempting to send message: /i sasa -game.js:765 Detected invite command for user: sasa -game.js:794 Sending invite command to WebSocket for user: sasa -game.js:777 Message input cleared. -game.js:844 Message received from server in room main_room: {type: 'error', message: 'Target user sasa not found in room main_room'} -game.js:869 Error message received: Target user sasa not found in room main_room -chatSocket.onmessage @ game.js:869 diff --git a/pong/game/consumers.py b/pong/game/consumers.py index 86211ee..bf8fb73 100644 --- a/pong/game/consumers.py +++ b/pong/game/consumers.py @@ -145,235 +145,321 @@ class GameConsumer(AsyncWebsocketConsumer): async def set_game(self, game): logger.info(f"Setting game: {game}") self.game = game -###############################CHAT############################################ -class ChatConsumer(AsyncWebsocketConsumer): - groups = {} +###################################################################CHAT################################################################### +class ChatConsumer(AsyncWebsocketConsumer): async def connect(self): + try: - # Récupérer le nom de la room + # Récupérer le nom de la room à partir de l'URL self.room_group_name = self.scope['url_route']['kwargs']['room_name'] # Accepter la connexion WebSocket await self.accept() + # Ajouter l'utilisateur au groupe (room) + await self.channel_layer.group_add( + self.room_group_name, + self.channel_name + ) - logger.info(f"Connexion au WebSocket de chat dans la room {self.room_group_name}") - - # Ajouter l'utilisateur au groupe en mémoire - if self.room_group_name not in self.groups: - self.groups[self.room_group_name] = [] - self.groups[self.room_group_name].append(self.channel_name) - - logger.info(f"User {self.channel_name} added to group {self.room_group_name}") - + self.username = self.scope['user'].username # Assurez-vous d'avoir un utilisateur lié à la connexion + logger.info(f"Connexion de l'utilisateur {self.username} à la room {self.room_group_name}") + # Ajouter l'utilisateur à son propre groupe personnel (pour messages directs) + + except Exception as e: logger.error(f"Erreur lors de la connexion WebSocket: {str(e)}") - async def disconnect(self, close_code): try: - # Retirer l'utilisateur du groupe en mémoire - if self.room_group_name in self.groups: - self.groups[self.room_group_name].remove(self.channel_name) - if not self.groups[self.room_group_name]: - del self.groups[self.room_group_name] - - await self.send_group_message( + # Retirer l'utilisateur du groupe (room) + await self.channel_layer.group_discard( self.room_group_name, - { - 'type': 'chat_message', - 'message': f'{self.user.username if hasattr(self, "user") else "Unknown"} a quitté le chat', - 'username': self.user.username if hasattr(self, "user") else "Unknown", - 'room': self.room_group_name - } + self.channel_name ) - logger.info(f"{self.user.username if hasattr(self, 'user') else 'Unknown'} déconnecté du WebSocket de chat dans la room {self.room_group_name}") + + # Retirer l'utilisateur de son groupe personnel + await self.channel_layer.group_discard( + f"user_{self.username}", + self.channel_name + ) + + # Envoyer un message indiquant que l'utilisateur a quitté la room + await self.chat_message( + 'chat_message', + self.user.username if hasattr(self, "user") else "Unknown", + f'{self.user.username if hasattr(self, "user") else "Unknown"} a quitté le chat', + self.room_group_name + ) + logger.info(f"{self.user.username if hasattr(self, 'user') else 'Unknown'} déconnecté de la room {self.room_group_name}") + except Exception as e: - logger.error(f"Erreur lors de la déconnexion WebSocket du chat: {str(e)}") + logger.error(f"Erreur lors de la déconnexion WebSocket: {str(e)}") async def receive(self, text_data): try: + # Convertir les données JSON reçues en dictionnaire Python data = json.loads(text_data) message_type = data.get('type') - username = data.get('username').strip().lower() # Normalisation du nom d'utilisateur + username = data.get('username') + message = data.get('message', None) + target_user = data.get('target_user', None) + + logger.info(f"Message reçu: {data}") - # Log pour vérifier que le username est bien reçu - logger.info(f"Message reçu avec username: {username}") if not username: - logger.error(f"Username missing in message: {data}") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Username is missing'})) + logger.error(f"Username manquant dans le message: {data}") + await self.chat_message('error', 'server', 'Username is missing', self.room_group_name) return - # Gestion des types de messages + # Gestion des différents types de messages if message_type == 'authenticate': + logger.info(f"Authentification demandée pour {username}") await self.authenticate(data.get('token'), username) + return elif message_type == 'chat_message': - if 'message' not in data: - logger.error(f"Format de message incorrect : {data}") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Format de message incorrect'})) - return + logger.info(f"Message de chat envoyé par {username}: {message}") + await self.chat_message('chat_message', username, message, self.room_group_name) - message = data['message'] - - # Envoyer le message à tous les autres utilisateurs de la room - await self.send_group_message( - self.room_group_name, - { - 'type': 'chat_message', - 'message': message, - 'username': username, - 'room': self.room_group_name - } - ) - - # Gestion de la commande /b pour bloquer un utilisateur elif message_type == 'block_user': - target_user = data.get('target_user').strip().lower() - if target_user == username: - await self.send(text_data=json.dumps({'type': 'error', 'message': 'You cannot block yourself'})) - else: - await self.handle_block_user(data) + logger.info(f"{username} tente de bloquer {target_user}") + await self.handle_block_user(data) - # Gestion de la commande /i pour inviter un utilisateur - elif message_type == 'invite_user': - target_user = data.get('target_user').strip().lower() - if target_user == username: - await self.send(text_data=json.dumps({'type': 'error', 'message': 'You cannot invite yourself'})) - else: - await self.handle_invite_user(data) + elif message_type == 'invite': + await self.handle_invite_user(data) + + elif message_type == 'invite_response': + await self.handle_invite_response(data) else: - logger.warning(f"Unhandled message type: {message_type}") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Unhandled message type'})) + logger.warning(f"Type de message non géré: {message_type}") + await self.chat_message('error', 'server', f"Unhandled message type: {message_type}", self.room_group_name) except json.JSONDecodeError as e: logger.error(f"Erreur de décodage JSON : {str(e)} - Données reçues : {text_data}") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Format JSON invalide'})) + await self.chat_message('error', 'server', 'Invalid JSON format', self.room_group_name) + except Exception as e: - logger.error(f"Erreur lors de la réception du message du chat: {str(e)}") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Erreur interne du serveur'})) + logger.error(f"Erreur lors de la réception du message: {str(e)}") + await self.chat_message('error', 'server', 'Internal server error', self.room_group_name) + + async def chat_message(self, message_type, username, message, room): + """ + Fonction générale pour envoyer tout type de message via WebSocket à tous les utilisateurs dans la room. + """ + logger.info(f"Envoi d'un message de type {message_type} de {username} dans la room {room}") + + # Utilisation de channel_layer pour envoyer le message à tout le groupe (room) + await self.channel_layer.group_send( + room, + { + 'type': 'send_group_message', # Nom de la méthode qui va gérer ce message + 'username': username, + 'message': message, + 'room': room + } + ) + + async def send_group_message(self, event): + """ + Cette fonction est appelée par channel_layer pour envoyer des messages à tous les utilisateurs dans une room. + """ + message = event['message'] + username = event.get('username', 'Anonyme') + room = event.get('room', 'unknown') + + logger.info(f"Diffusion d'un message de {username} à la room {room}: {message}") + + # Envoi du message à chaque utilisateur dans la room via WebSocket + await self.send(text_data=json.dumps({ + 'type': 'chat_message', # Le type de message qui sera renvoyé au client + 'username': username, + 'message': message, + 'room': room + })) async def handle_block_user(self, data): - username = data['username'].strip().lower() # Normalisation du nom d'utilisateur - target_user = data['target_user'].strip().lower() + username = data['username'] + target_user = data['target_user'] - # Utiliser self.room_group_name pour vérifier que l'utilisateur ciblé est bien dans la bonne room - if target_user not in self.groups.get(self.room_group_name, []): - logger.error(f"Target user {target_user} does not exist in room {self.room_group_name}") - await self.send(text_data=json.dumps({'type': 'error', 'message': f'Target user {target_user} not found in room {self.room_group_name}'})) - return - - logger.info(f"Block request: {username} wants to block {target_user} in room {self.room_group_name}") + logger.info(f"handle_block_user appelé avec : {data}") if target_user == username: - logger.warning(f"Block attempt failed: {username} tried to block themselves") + logger.warning(f"{username} a tenté de se bloquer lui-même.") await self.send(text_data=json.dumps({'type': 'error', 'message': 'You cannot block yourself'})) - else: - logger.info(f"{username} successfully blocked {target_user}") - await self.send(text_data=json.dumps({'type': 'success', 'message': f'You have blocked {target_user} in room {self.room_group_name}'})) + return + + logger.info(f"{username} a bloqué {target_user}") + + # Utilisation correcte de l' f-string pour inclure la valeur de target_user + await self.send(text_data=json.dumps({ + 'type': 'block_user', + 'message': f'Vous avez bloqué les messages de {target_user}' + })) async def handle_invite_user(self, data): - username = data['username'].strip().lower() - target_user = data['target_user'].strip().lower() + # Récupération des informations de l'invitation + inviter = data.get('username') + target_user = data.get('target_user') + room = data.get('room') - # Utiliser self.room_group_name pour inviter l'utilisateur dans la room active - room = self.room_group_name - - # Vérification que le joueur à inviter est dans la room - if target_user not in self.groups.get(room, []): - logger.error(f"Target user {target_user} does not exist in room {room}") - await self.send(text_data=json.dumps({'type': 'error', 'message': f'Target user {target_user} not found in room {room}'})) + # Validation des paramètres + if not inviter: + logger.error("Invitant manquant dans le message d'invitation") + await self.chat_message('error', 'server', 'Invitant manquant', self.room_group_name) return - logger.info(f"Invitation request: {username} wants to invite {target_user} to a quick match in room {room}") + if not target_user: + logger.error("Utilisateur cible manquant dans le message d'invitation") + await self.chat_message('error', 'server', 'Utilisateur cible manquant', self.room_group_name) + return - if target_user == username: - logger.warning(f"Invite attempt failed: {username} tried to invite themselves") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'You cannot invite yourself'})) - else: - logger.info(f"{username} successfully sent an invitation to {target_user} in room {room}") - await self.send_group_message(room, { + if not room: + logger.error("Room manquante dans le message d'invitation") + await self.chat_message('error', 'server', 'Room manquante', self.room_group_name) + return + + logger.info(f"Invitation envoyée de {inviter} à {target_user} dans la room {room}") + await self.chat_message('chat_message', 'server', f'{inviter} a invité {target_user} à rejoindre une partie {room}', room) + + # Envoi de l'invitation + await self.channel_layer.group_send( + room, + { 'type': 'invite', - 'message': f'{username} invited {target_user} to a quick match', - 'username': username, - 'target_user': target_user - }) - await self.send(text_data=json.dumps({'type': 'success', 'message': f'Invitation sent to {target_user} in room {room}'})) + 'inviter': inviter, + 'target_user': target_user, + 'room': room, + 'message': f'{inviter} vous a invité à rejoindre la room {room}.' + } + ) + async def handle_invite_response(self, data): + inviter = data.get('inviter') + username = data.get('username') # L'utilisateur invité qui répond + response = data.get('response') + room = data.get('room') + + logger.info(f"{username} a répondu '{response}' à l'invitation de {inviter}") + await self.chat_message('chat_message', 'server', f'{username} a répondu {response} à l\'invitation.', room) + + # Si la réponse est 'yes', informer l'invitant que l'invité a accepté + if response.lower() == 'yes': + try: + # Informer l'invitant que l'invitation a été acceptée + await self.channel_layer.group_send( + room, + { + 'type': 'invite_response', + 'inviter': inviter, + 'username': username, + 'response': response, + 'room': room, + 'message': f'{username} a accepté l\'invitation.' + } + ) + # Informer à la fois l'invité et l'invitant que le jeu va commencer + await self.channel_layer.group_send( + room, + { + 'type': 'start_quick_match', + 'inviter': inviter, + 'username': username, + 'message': 'La partie va démarrer pour vous deux.', + } + ) + except Exception as e: + logger.error(f"Error while sending invite response: {str(e)}") + await self.chat_message('error', 'server', f'Internal server error: {str(e)}', room) + + # Méthode appelée pour envoyer l'invitation à l'utilisateur invité (target_user) + async def invite(self, event): + inviter = event['inviter'] + message = event['message'] + room = event['room'] + target_user = event['target_user'] + logger.info(f"invite: Envoi de l'invitation à l'utilisateur via WebSocket. Inviter={inviter}, Room={room}, Message={message}") + + # Envoyer le message d'invitation via WebSocket + await self.send(text_data=json.dumps({ + 'type': 'invite', + 'inviter': inviter, + 'target_user': target_user, + 'message': message, + 'room': room + })) + + async def handle_invite_response(self, data): + inviter = data.get('inviter') + username = data.get('username') # L'utilisateur invité qui répond + response = data.get('response') + room = data.get('room') + + logger.info(f"{username} a répondu '{response}' à l'invitation de {inviter}") + await self.chat_message('chat_message', 'server', f'{username} a répondu {response} à l\'invitation.', room) + + # Envoi de la réponse directement à l'invitant dans la room + await self.channel_layer.group_send( + room, + { + 'type': 'invite_response', # Type de message 'invite_response' + 'inviter': inviter, + 'username': username, + 'room': room, + 'message': f'{username} a répondu {response} à l\'invitation.', + 'response': response # Ajout de la réponse 'yes' ou 'no' + } + ) + + async def invite_response(self, event): + message = event['message'] + response = event.get('response') + inviter = event.get('inviter') # Récupérer l'inviteur + + logger.info(f"invite_response: Envoi de la réponse à l'invitation via WebSocket. Message={message}, Response={response}, Inviter={inviter}") + + # Envoyer la réponse à l'invitation via WebSocket à l'invitant + await self.send(text_data=json.dumps({ + 'type': 'invite_response', + 'message': message, + 'response': response, + 'inviter': inviter + })) async def authenticate(self, token, username): if not token: - logger.error("Token is None, authentication cannot proceed") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Token is missing'})) + logger.error("Token est manquant, l'authentification ne peut pas se poursuivre.") + await self.chat_message('error', 'server', 'Token is missing', self.room_group_name) return + + logger.info(f"Tentative d'authentification avec le token: {token} pour l'utilisateur: {username}") + try: user = await self.get_user_from_token(token) if user: self.user = user - logger.info(f"User {username} authenticated successfully with token: {token}") - - # Envoyer un message d'authentification réussie au client - await self.send(text_data=json.dumps({'type': 'authenticated', 'username': username})) - - # Envoyer le message de bienvenue après l'authentification réussie - await self.send_group_message( - self.room_group_name, - { - 'username': username, - 'room': self.room_group_name, - 'type': 'chat_message', - 'message': f' a rejoint le chat {self.room_group_name}', - } + logger.info(f"Utilisateur {username} authentifié avec succès") + await self.chat_message('authenticated', username, 'Authentication successful', self.room_group_name) + + await self.channel_layer.group_add( + f"user_{self.username}", # Group name unique pour cet utilisateur + self.channel_name ) + logger.info(f"Connexion de l'utilisateur {self.username} à son groupe personnel") else: - logger.warning(f"Authentication failed for token: {token}") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) + logger.warning(f"Échec de l'authentification pour le token: {token}") + await self.chat_message('error', username, 'Authentication failed', self.room_group_name) except Exception as e: - logger.error(f"Error during authentication: {str(e)}") - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Internal server error'})) + logger.error(f"Erreur lors de l'authentification : {str(e)}") + await self.chat_message('error', 'server', 'Internal server error', self.room_group_name) @sync_to_async def get_user_from_token(self, token): try: user = User.objects.filter(auth_token=token).first() - logger.debug(f"User found: {user} for token: {token}") + logger.debug(f"Utilisateur trouvé : {user} pour le token : {token}") return user except User.DoesNotExist: - logger.warning(f"User not found for token: {token}") - return None - - async def send_group_message(self, group_name, message): - # Utilisation de self.room_group_name pour s'assurer que la bonne room est utilisée - group_name = self.room_group_name # Utilisation explicite de self.room_group_name - - if group_name in self.groups: - logger.debug(f"Sending message to group {group_name}: {message}") - for channel_name in self.groups[group_name]: - try: - await self.channel_layer.send(channel_name, { - 'type': 'chat_message', - 'message': message['message'], - 'username': message['username'], - 'room': message['room'] - }) - logger.debug(f"Message sent to {channel_name} in room {message['room']}: {message}") - except Exception as e: - logger.error(f"Failed to send message to {channel_name} in room {group_name}: {str(e)}") - else: - logger.error(f"Group {group_name} does not exist, unable to send message") - - async def chat_message(self, event): - message = event['message'] - username = event.get('username', 'Anonyme') - room = event.get('room', 'unknown') - - # Log pour vérifier le username avant envoi - logger.info(f"Sending chat message from username: {username} in room: {room}") - - # Envoyer le message au WebSocket - await self.send(text_data=json.dumps({ - 'type': 'chat_message', - 'message': f'{username}: {message}', - 'room': room - })) + logger.warning(f"Utilisateur non trouvé pour le token : {token}") + return None \ No newline at end of file diff --git a/pong/game/migrations/0001_initial.py:Zone.Identifier b/pong/game/migrations/0001_initial.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier b/pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/game.js b/pong/static/game.js index 20d291b..ac3daaa 100644 --- a/pong/static/game.js +++ b/pong/static/game.js @@ -39,11 +39,12 @@ document.addEventListener('DOMContentLoaded', () => { const tournamentButton = document.getElementById('tournament'); let socket; - let token; let gameState; let activeRoom = null; // Stocker la room active let roomSockets = {}; // Stocker les connexions WebSocket par room - let username; // Ajouter cette variable pour stocker le nom d'utilisateur + let chatManager = null; + let username = null; + let token = null; console.log("DOM elements initialized"); @@ -84,104 +85,44 @@ document.addEventListener('DOMContentLoaded', () => { } async function handleCheckNickname() { - const nickname = nicknameInput.value.trim(); - if (nickname) { - try { - const exists = await checkUserExists(nickname); - if (exists) { - authForm.style.display = 'none'; - loginForm.style.display = 'block'; - loginPasswordInput.focus(); - loginPasswordInput.addEventListener('keypress', function (event) { - if (event.key === 'Enter') { - event.preventDefault(); - loginButton.click(); - } - }); - } else { - authForm.style.display = 'none'; - registerForm.style.display = 'block'; - passwordInput.focus(); - passwordInput.addEventListener('keypress', function (event) { - if (event.key === 'Enter') { - confirmPasswordInput.focus(); - confirmPasswordInput.addEventListener('keypress', function (event) { - if (event.key === 'Enter') { - event.preventDefault(); - registerButton.click(); - } - }); - } - }); - } - } catch (error) { - console.error('Error checking user existence:', error); - } - } else { - alert('Please enter a nickname.'); - } - } - - async function handleRegister() { - console.log("handleRegister called"); const nickname = nicknameInput.value.trim(); - const password = passwordInput.value.trim(); - const confirmPassword = confirmPasswordInput.value.trim(); - - // Validation du nom d'utilisateur - if (!nickname || nickname.length < 3) { - console.error("Invalid username. It must be at least 3 characters long."); - alert("Invalid username. It must be at least 3 characters long."); - return; - } - - // Validation des mots de passe - if (password !== confirmPassword) { - alert('Passwords do not match.'); - console.error('Passwords do not match.'); - return; - } - - // Tentative d'inscription - try { - console.log("Attempting to register user:", nickname); - const result = await registerUser(nickname, password); - - // Vérification du résultat de l'inscription - if (result && result.token) { - token = result.token; // Stocker le token de l'utilisateur - console.log("Token stored successfully:", token); - console.log("User registered successfully"); - - // Mise à jour de l'interface après inscription réussie - registerForm.style.display = 'none'; - document.getElementById("post-form-buttons").style.display = 'block'; - username = nickname; // Stocker le nom d'utilisateur - - // Définir le nom de la room principale - roomName = "main_room"; - - // Sécuriser l'appel à `joinRoom` (initialiser le chat WebSocket) - if (token && roomName) { - console.log(`Joining room: ${roomName} with token: ${token}`); - joinRoom(token, roomName, username); // Initialiser le chat WebSocket + if (nickname) { + try { + const exists = await checkUserExists(nickname); + if (exists) { + authForm.style.display = 'none'; + loginForm.style.display = 'block'; + loginPasswordInput.focus(); + loginPasswordInput.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + loginButton.click(); + } + }); } else { - console.error("Token or roomName is undefined. Cannot join room."); - alert("Error joining the chat room. Please try again."); + authForm.style.display = 'none'; + registerForm.style.display = 'block'; + passwordInput.focus(); + passwordInput.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + confirmPasswordInput.focus(); + confirmPasswordInput.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + registerButton.click(); + } + }); + } + }); } - - } else { - console.error('Registration failed. Invalid response from server.'); - alert('Registration failed. Please try again.'); + } catch (error) { + console.error('Error checking user existence:', error); } - - } catch (error) { - console.error('Error registering user:', error); - alert('An error occurred during registration. Please try again.'); + } else { + alert('Please enter a nickname.'); } } - async function checkUserExists(username) { console.log("checkUserExists called with username:", username); try { @@ -230,9 +171,10 @@ document.addEventListener('DOMContentLoaded', () => { console.log("User registered successfully"); registerForm.style.display = 'none'; document.getElementById("post-form-buttons").style.display = 'block'; - username = nickname; // Stocker le nom d'utilisateur après l'inscription - roomName = "main_room"; // Nom de la room principale - joinRoom(token,roomName, username); // Initialiser le chat WebSocket + username = nickname; + roomName = 'main_room'; // Nom de la room principale + chatManager = new ChatManager(username, token); // Initialiser ChatManager + chatManager.joinRoom(roomName); // Utilisez ChatManager pour rejoindre la room } else { console.error('Registration failed.'); alert('Registration failed. Please try again.'); @@ -588,15 +530,15 @@ document.addEventListener('DOMContentLoaded', () => { console.warn("WebSocket for quick_match already open."); return; } - // Rejoindre la room "quick_match" - roomName = 'quick_match'; - joinRoom(token, roomName, username); + roomName = "quick_match"; // Nom de la room principale + chatManager = new ChatManager(username, token); // Initialiser ChatManager + chatManager.joinRoom(roomName); // Utilisez ChatManager pour rejoindre la room console.log("Starting WebSocket connection for quick match..."); startWebSocketConnection(token, 1); // Le "1" pourrait être un identifiant pour le mode Quick Match } - function startTournament() { + function startTournament() { // Masquer les éléments inutiles et afficher le conteneur du tournoi tournamentContainer.style.display = 'flex'; logo.style.display = 'none'; @@ -616,9 +558,8 @@ document.addEventListener('DOMContentLoaded', () => { console.warn("WebSocket for tournament already open."); return; } - // Rejoindre la room "tournament" - roomName = 'tournament'; - joinRoom(token, roomName, username); + chatManager = new ChatManager(username, token); // Initialiser ChatManager + chatManager.joinRoom('tournament'); // Utilisez ChatManager pour rejoindre la room console.log("Starting WebSocket connection for tournament..."); startWebSocketConnection(token, 42); // Le "42" pourrait être un identifiant pour le mode tournoi } @@ -723,20 +664,307 @@ document.addEventListener('DOMContentLoaded', () => { } ////////////////////////////CHAT//////////////////////////////////// + class ChatManager { + constructor(username, token) { + this.username = username; + this.token = token; + this.roomSockets = {}; // Stockage des WebSockets par room + this.blockedUsers = []; // Liste des utilisateurs bloqués + this.activeRoom = null; // La room actuellement active + + console.log(`ChatManager initialized for user: ${username}`); + } + + startChatWebSocket(roomName) { + if (!this.username || this.username.trim() === '') { + console.error("Username is not defined or empty. WebSocket connection aborted."); + alert("Username is required to join the chat. Please log in."); + return; + } + + if (this.roomSockets[roomName] && this.roomSockets[roomName].readyState === WebSocket.OPEN) { + console.warn(`WebSocket for room ${roomName} already open.`); + return; + } + + console.log("Initializing chat WebSocket..."); + console.log(`Initializing chat WebSocket for room: ${roomName} with username: ${this.username}`); + + try { + const chatSocket = new WebSocket(`ws://${window.location.host}/ws/chat/${roomName}/`); + this.roomSockets[roomName] = chatSocket; // Stockage du WebSocket + console.log(`startChatWebSocket: ${roomName} with username: ${this.username} and token: ${this.token}`); + + const chatInputInstance = new ChatInput(roomName, this.username, chatSocket, this); // On passe l'instance du manager + + // Gestion de l'ouverture du WebSocket + chatSocket.onopen = () => { + console.log(`WebSocket ouvert pour l'utilisateur ${this.username} dans la room ${roomName}`); + + chatSocket.send(JSON.stringify({ + 'type': 'authenticate', + 'username': this.username, + 'token': this.token, + 'room': roomName, + })); + console.log(`Authentication message sent for room: ${roomName} with username: ${this.username}`); + }; + + // Gestion des messages WebSocket + chatSocket.onmessage = (event) => { + const data = JSON.parse(event.data); + console.log(`Message received from server in room ${roomName}:`, data); + const receivedUsername = data.username || this.username; + + // Assurez-vous que le chat log est bien trouvé pour la room active + let chatLog = document.getElementById(`chat-log-${roomName}`); + if (!chatLog) { + console.error(`Chat log element for room ${roomName} not found.`); + return; + } + + switch (data.type) { + case 'authenticated': + console.log(`User authenticated successfully in room: ${roomName}`); + break; + + case 'chat_message': + const message = data.message; + const receivedUsername = data.username; + const roomName = data.room; + + // Si l'utilisateur n'est pas bloqué, afficher le message + if (!this.blockedUsers.includes(receivedUsername)) { + const messageElement = document.createElement('div'); + messageElement.textContent = `${receivedUsername}: ${message}`; + chatLog.appendChild(messageElement); + console.log(`Message displayed in chat log for room: ${roomName}`); + } else { + console.log(`Message from blocked user ${receivedUsername} was filtered out.`); + } + break; + + case 'block_user': + if (data.message) { + const messageElement = document.createElement('div'); + messageElement.textContent = data.message; + chatLog.appendChild(messageElement); // Ajoute le message au chat-log + } else { + console.error(`Failed to block user: ${data.message}`); + alert(`Error: Failed to block user. ${data.message}`); + } + break; + + case 'invite_confirmation': + console.log(`Confirmation de l'invitation reçue: ${data.message}`); + if (data.message) { + const messageElement = document.createElement('div'); + messageElement.textContent = data.message; + chatLog.appendChild(messageElement); + console.log(`Invitation confirmation message displayed in chat log: ${data.message}`); + } else { + console.error(`Échec de l'envoi de l'invitation: ${data.message}`); + alert(`Error: Failed to invite user. ${data.message}`); + } + break; + + case 'invite': + // Vérifie si l'invitation est destinée à cet utilisateur (invité) + if (data.target_user === this.username) { + console.log(`Invitation reçue de ${data.inviter}`); + + const messageElement = document.createElement('div'); + messageElement.textContent = data.message; + chatLog.appendChild(messageElement); // Affiche le message dans le chat-log + + // Demande à l'utilisateur s'il accepte ou refuse l'invitation + const inviteResponse = confirm(`${data.inviter} vous a invité dans la room ${data.room}. Accepter? yes/no.`); + const response = inviteResponse ? 'yes' : 'no'; + + console.log(`Réponse à l'invitation: ${response}`); + + // Envoie la réponse (oui ou non) au serveur + chatSocket.send(JSON.stringify({ + 'type': 'invite_response', + 'username': this.username, // Utilisateur invité + 'response': response, + 'inviter': data.inviter, // Le nom de l'invitant + 'room': data.room + })); + + if (response === 'yes') { + // Si l'invitation est acceptée, lancer QuickMatch pour l'invité + console.log(`L'invité ${this.username} va démarrer le QuickMatch...`); + // Si l'invitation est acceptée, lancer QuickMatch pour l'invité après un délai + console.log("Invitation acceptée, démarrage du QuickMatch pour l'invité après un délai..."); + setTimeout(() => { + startQuickMatch(); // Lancer le jeu après 2 secondes + }, 2000); // 2000 millisecondes = 2 secondes + } + } + break; + + case 'invite_response': + // Vérifie si l'invitation concerne cet utilisateur (l'invitant) + if (data.inviter === this.username) { + const messageElement = document.createElement('div'); + messageElement.textContent = data.message; + chatLog.appendChild(messageElement); // Affiche la réponse dans le chat-log + console.log(`Réponse à l'invitation: ${data.message}`); + + if (data.response && data.response.toLowerCase() === 'yes') { + console.log("Invitation acceptée, démarrage du QuickMatch pour l'invitant..."); + startQuickMatch(); + } + } + break; + + + case 'success': + console.log(`Success message received: ${data.message}`); + alert('Success: ' + data.message); + break; + + case 'error': + console.error('Error message received:', data.message); + alert('Error: ' + data.message); + break; + + default: + console.warn('Unhandled message type:', data); + } + }; + + // Gestion de la fermeture du WebSocket + chatSocket.onclose = (event) => { + if (event.wasClean) { + console.log(`Chat WebSocket closed cleanly for room ${roomName}, code=${event.code}, reason=${event.reason}`); + } else { + console.error(`Chat WebSocket closed unexpectedly for room ${roomName}`); + } + }; + + // Gestion des erreurs WebSocket + chatSocket.onerror = (error) => { + console.error(`Chat WebSocket error in room ${roomName}:`, error); + }; + + } catch (error) { + console.error(`Error initializing chat WebSocket for room ${roomName}:`, error); + } + } + + blockUser(targetUser) { + this.blockedUsers.push(targetUser); + console.log(`User ${targetUser} added to blocked list.`); + } + + createRoomTab(roomName) { + console.log(`createRoomTab: ${roomName} with username: ${username} and token: ${token}`); + + const tabContainer = document.getElementById('room-tabs-container'); + if (!tabContainer) { + console.error('Room tabs container not found.'); + return; + } + + const existingTab = Array.from(tabContainer.children).find(tab => tab.dataset.room === roomName); + if (existingTab) { + console.log(`Tab for room ${roomName} already exists.`); + // Vous pouvez ajouter une classe pour indiquer que l'onglet est inactif + existingTab.classList.remove('active'); + } else { + console.warn(`Tab for room ${roomName} not found in the HTML.`); + } + } + + showRoomTab(roomName) { + const tabContainer = document.getElementById('room-tabs-container'); + const tab = Array.from(tabContainer.children).find(tab => tab.dataset.room === roomName); + if (tab) { + tab.classList.add('active'); + console.log(`Showing tab for room: ${roomName}`); + } else { + console.warn(`Tab for room ${roomName} not found.`); + } + } + + switchRoom(roomName) { + + if (!roomName) { + console.error('Room name is undefined.'); + return; + } + console.log(`Attempting to switch to room: ${roomName}`); + if (activeRoom === roomName) { + console.log(`Already in room: ${roomName}`); + return; + } + + console.log(`Switching from room ${activeRoom} to room ${roomName}`); + const previousRoom = activeRoom; + activeRoom = roomName; + + if (previousRoom && document.getElementById(`chat-log-${previousRoom}`)) { + console.log(`Hiding chat log for previous room: ${previousRoom}`); + document.getElementById(`chat-log-${previousRoom}`).style.display = 'none'; + } + + const chatLog = document.getElementById(`chat-log-${roomName}`); + if (chatLog) { + chatLog.style.display = 'block'; + } else { + console.warn(`No chat log found for room: ${roomName}`); + } + + // Mettre à jour l'affichage des inputs + document.querySelectorAll('.chat-input').forEach(input => { + input.style.display = 'none'; + }); + document.getElementById(`chat-input-${roomName}`).style.display = 'block'; + + // Mettre à jour l'onglet actif + const tabs = document.querySelectorAll('.room-tab'); + tabs.forEach(t => t.classList.remove('active')); + const activeTab = Array.from(tabs).find(tab => tab.dataset.room === roomName); + if (activeTab) { + activeTab.classList.add('active'); + } + } + + joinRoom(roomName) { + console.log(`Joining room: ${roomName} with username: ${chatManager.username} and token: ${chatManager.token}`); + if (activeRoom === roomName) { + console.log(`Already in room: ${roomName}`); + return; + } + + // Si la room n'a pas de WebSocket actif, on le crée + if (!chatManager.roomSockets[roomName]) { + console.log(`Joining new room: ${roomName}`); + this.createRoomTab(roomName); + this.showRoomTab(roomName); + this.startChatWebSocket(roomName); // Utilisation du ChatManager pour démarrer le WebSocket + } + + this.switchRoom(roomName); + } +} + class ChatInput { - constructor(roomName, username, chatSocket) { + constructor(roomName, username, chatSocket, chatManager) { this.roomName = roomName; - this.username = username.toLowerCase().trim(); // Normalisation du nom d'utilisateur + this.username = username; this.chatSocket = chatSocket; + this.chatManager = chatManager; this.messageInput = document.querySelector(`#chat-input-${roomName} input`); this.chatButton = document.querySelector(`#chat-input-${roomName} button`); - console.log(`ChatInput initialized for room: ${roomName}, username: ${this.username}`); + console.log(`ChatInput initialized for room: ${roomName}, username: ${username}`); this.initEventListeners(); } initEventListeners() { - // Envoi de message en appuyant sur "Entrée" this.messageInput.addEventListener('keypress', (event) => { if (event.key === 'Enter') { console.log("Enter key pressed, attempting to send message..."); @@ -744,7 +972,6 @@ document.addEventListener('DOMContentLoaded', () => { } }); - // Envoi de message en cliquant sur le bouton d'envoi this.chatButton.addEventListener('click', () => { console.log("Send button clicked, attempting to send message..."); this.sendMessage(); @@ -754,26 +981,26 @@ document.addEventListener('DOMContentLoaded', () => { sendMessage() { const message = this.messageInput.value.trim(); console.log(`Attempting to send message: ${message}`); - + if (message) { if (message.startsWith('/b ')) { - const targetUser = message.slice(3).trim().toLowerCase() + const targetUser = message.slice(3).trim(); console.log(`Detected block command for user: ${targetUser}`); this.sendBlockCommand(targetUser); } else if (message.startsWith('/i ')) { - const targetUser = message.slice(3).trim().toLowerCase(); + const targetUser = message.slice(3).trim(); console.log(`Detected invite command for user: ${targetUser}`); this.sendInviteCommand(targetUser); } else { - console.log("Sending chat message to WebSocket..."); + console.log(`Sending chat message to WebSocket...`); this.chatSocket.send(JSON.stringify({ 'type': 'chat_message', - 'message': message, 'username': this.username, + 'message': message, 'room': this.roomName })); } - this.messageInput.value = ''; // Effacer le champ de saisie + this.messageInput.value = ''; console.log("Message input cleared."); } else { console.warn('Cannot send an empty message.'); @@ -781,215 +1008,39 @@ document.addEventListener('DOMContentLoaded', () => { } sendBlockCommand(targetUser) { + this.chatManager.blockUser(targetUser); // Met à jour la liste des utilisateurs bloqués via ChatManager console.log(`Sending block command to WebSocket for user: ${targetUser}`); this.chatSocket.send(JSON.stringify({ 'type': 'block_user', - 'target_user': targetUser, 'username': this.username, + 'target_user': targetUser, 'room': this.roomName })); } sendInviteCommand(targetUser) { + if (!targetUser) { + console.error("Target user is not defined. Cannot send invite."); + return; + } + if (!this.username) { + console.error("Username is not defined. Cannot send invite."); + return; + } + if (!this.roomName) { + console.error("Room name is not defined. Cannot send invite."); + return; + } + console.log(`Sending invite command to WebSocket for user: ${targetUser}`); + this.chatSocket.send(JSON.stringify({ - 'type': 'invite_user', - 'target_user': targetUser, - 'username': this.username, - 'room': this.roomName + 'type': 'invite', + 'username': this.username, // Utilisateur qui envoie l'invitation + 'target_user': targetUser, // Utilisateur qui reçoit l'invitation + 'room': this.roomName // Room où l'invitation est faite })); } } - - function startChatWebSocket(token, roomName, username) { - // Vérification de la validité du username - if (!username || username.trim() === '') { - console.error("Username is not defined or empty. WebSocket connection aborted."); - alert("Username is required to join the chat. Please log in."); - return; - } - username = username.toLowerCase().trim(); // Normalisation du nom d'utilisateur - - // Vérification si un WebSocket est déjà ouvert pour la room - if (roomSockets[roomName] && roomSockets[roomName].readyState === WebSocket.OPEN) { - console.warn(`WebSocket for room ${roomName} already open.`); - return; - } - - console.log("Initializing chat WebSocket..."); - console.log(`Initializing chat WebSocket for room: ${roomName} with username: ${username}`); - - try { - console.log(`startChatWebSocket: ${roomName} with username: ${username} and token: ${token}`); - const chatSocket = new WebSocket(`ws://${window.location.host}/ws/chat/${roomName}/`); - - // Événement déclenché lorsque la connexion WebSocket est ouverte - chatSocket.onopen = function () { - console.log(`Chat WebSocket connection established in room: ${roomName}`); - - // Envoi d'un message d'authentification avec le token et le username - chatSocket.send(JSON.stringify({ - 'type': 'authenticate', - 'token': token, - 'room': roomName, - 'username': username - })); - console.log(`Authentication message sent for room: ${roomName} with username: ${username}`); - }; - - // Gestion des messages reçus du serveur WebSocket - chatSocket.onmessage = function (event) { - const data = JSON.parse(event.data); - console.log(`Message received from server in room ${roomName}:`, data); - - switch (data.type) { - case 'authenticated': - console.log(`User authenticated successfully in room: ${roomName}`); - break; - case 'chat_message': - const message = data.message; - const chatLog = document.getElementById(`chat-log-${roomName}`); - const receivedUsername = data.username || 'Anonymous'; // Utiliser un fallback si le username est manquant - - if (chatLog) { - const messageElement = document.createElement('div'); - messageElement.textContent = `${receivedUsername}: ${message}`; - chatLog.appendChild(messageElement); - console.log(`Message displayed in chat log for room: ${roomName}`); - } else { - console.error('Chat log element not found'); - } - break; - case 'success': // Nouveau cas pour traiter les messages de succès - console.log(`Success message received: ${data.message}`); - alert(`Success: ${data.message}`); // Vous pouvez remplacer l'alerte par une notification visuelle plus adaptée - break; - case 'error': - console.error(`Error message received: ${data.message}`); - alert(`Error: ${data.message}`); // Afficher une alerte ou un message d'erreur à l'utilisateur - break; - default: - console.warn('Unhandled message type:', data); - } - }; - - // Gestion de la fermeture du WebSocket - chatSocket.onclose = function (event) { - if (event.wasClean) { - console.log(`Chat WebSocket closed cleanly for room ${roomName}, code=${event.code}, reason=${event.reason}`); - } else { - console.error(`Chat WebSocket closed unexpectedly for room ${roomName}`); - } - }; - - // Gestion des erreurs WebSocket - chatSocket.onerror = function (error) { - console.error(`Chat WebSocket error in room ${roomName}:`, error); - }; - - // Stocker la connexion WebSocket dans roomSockets - roomSockets[roomName] = chatSocket; - console.log(`WebSocket connection stored for room: ${roomName}`); - - // Initialiser l'interface de chat pour cette room - new ChatInput(roomName, username, chatSocket); - - } catch (error) { - console.error(`Error initializing chat WebSocket for room ${roomName}:`, error); - } - } - - function createRoomTab(token, roomName, username) { - console.log(`createRoomTab: ${roomName} with username: ${username} and token: ${token}`); - - const tabContainer = document.getElementById('room-tabs-container'); - if (!tabContainer) { - console.error('Room tabs container not found.'); - return; - } - - const existingTab = Array.from(tabContainer.children).find(tab => tab.dataset.room === roomName); - if (existingTab) { - console.log(`Tab for room ${roomName} already exists.`); - // Vous pouvez ajouter une classe pour indiquer que l'onglet est inactif - existingTab.classList.remove('active'); - } else { - console.warn(`Tab for room ${roomName} not found in the HTML.`); - } - } - - function showRoomTab(roomName) { - const tabContainer = document.getElementById('room-tabs-container'); - const tab = Array.from(tabContainer.children).find(tab => tab.dataset.room === roomName); - if (tab) { - // Vous pouvez ajouter une classe pour indiquer que l'onglet est actif - tab.classList.add('active'); - console.log(`Showing tab for room: ${roomName}`); - } else { - console.warn(`Tab for room ${roomName} not found.`); - } - } - - function switchRoom(token, roomName, username) { - console.log(`switchRoom: ${roomName} with username: ${username} and token: ${token}`); - - if (!roomName) { - console.error('Room name is undefined.'); - return; - } - console.log(`Attempting to switch to room: ${roomName}`); - if (activeRoom === roomName) { - console.log(`Already in room: ${roomName}`); - return; - } - - console.log(`Switching from room ${activeRoom} to room ${roomName}`); - const previousRoom = activeRoom; - activeRoom = roomName; - - if (previousRoom && document.getElementById(`chat-log-${previousRoom}`)) { - console.log(`Hiding chat log for previous room: ${previousRoom}`); - document.getElementById(`chat-log-${previousRoom}`).style.display = 'none'; - } - - const chatLog = document.getElementById(`chat-log-${roomName}`); - if (chatLog) { - chatLog.style.display = 'block'; - } else { - console.warn(`No chat log found for room: ${roomName}`); - } - - // Mettre à jour l'affichage des inputs - document.querySelectorAll('.chat-input').forEach(input => { - input.style.display = 'none'; - }); - document.getElementById(`chat-input-${roomName}`).style.display = 'block'; - - // Mettre à jour l'onglet actif - const tabs = document.querySelectorAll('.room-tab'); - tabs.forEach(t => t.classList.remove('active')); - const activeTab = Array.from(tabs).find(tab => tab.dataset.room === roomName); - if (activeTab) { - activeTab.classList.add('active'); - } - } - - function joinRoom(token, roomName, username) { - // Vérifier si la room est déjà active - console.log(`Joining room: ${roomName} with username: ${username} and token: ${token}`); - if (activeRoom === roomName) { - console.log(`Already in room: ${roomName}`); - return; - } - - if (!roomSockets[roomName]) { - console.log(`Joining new room: ${roomName}`); - createRoomTab(token, roomName, username); - showRoomTab(roomName); - startChatWebSocket(token, roomName, username); - } - - switchRoom(token, roomName, username); - } }); diff --git a/pong/static/index.html b/pong/static/index.html index b762ee1..db8d3f4 100644 --- a/pong/static/index.html +++ b/pong/static/index.html @@ -205,10 +205,10 @@ - +
-
+
@@ -221,48 +221,56 @@
- +
-
Main Room
+
Main Room
Tournament
Quick Match
- - + -