From 21b73a37ae054aff608b90cc3262b5a899058ef3 Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Thu, 12 Sep 2024 17:32:46 +0200 Subject: [PATCH 01/11] 01 --- .gitignore | 5 +- docker-compose.yml | 20 +- env_template | 8 +- 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 + logs/172.31.141.12-1726064615544.log | 41 + logs/172.31.141.12-1726065549172.log | 38 + logs/172.31.141.12-1726069036744.log | 40 + logs/django_errors.log | 9 + makefile | 14 +- pong/asgi.py | 9 + pong/game/consumers.py | 449 ++++-- pong/game/game.py | 74 +- pong/game/matchmaking.py | 9 +- .../0001_initial.py:Zone.Identifier | 0 .../migrations/0002_alter_match_winner.py | 19 - ...0002_alter_match_winner.py:Zone.Identifier | 0 .../migrations/0003_alter_tournoi_date.py | 18 - pong/game/models.py | 29 +- pong/game/routing.py | 11 +- .../templates/pong/tournament_brackets.html | 60 - .../pong/tournament_waiting_room.html | 20 +- pong/game/tournament.py | 223 +-- pong/game/urls.py | 3 +- pong/game/utils.py | 98 +- pong/game/views.py | 130 +- pong/settings.py | 220 +-- pong/static/burger.js | 13 +- pong/static/flags/de.svg | 0 pong/static/flags/es.svg | 0 pong/static/flags/fr.svg | 0 pong/static/flags/it.svg | 0 pong/static/flags/us.svg | 0 pong/static/game.js | 1327 +++++++++++------ pong/static/index.html | 452 +++--- pong/static/styles.css | 715 +++++---- 38 files changed, 2803 insertions(+), 1583 deletions(-) create mode 100644 logs/172.20.2.60-1726141292617.log create mode 100644 logs/172.20.2.60-1726142931992.log create mode 100644 logs/172.20.2.60-1726144089884.log create mode 100644 logs/172.20.2.60-1726150242355.log create mode 100644 logs/172.31.141.12-1726064615544.log create mode 100644 logs/172.31.141.12-1726065549172.log create mode 100644 logs/172.31.141.12-1726069036744.log create mode 100644 logs/django_errors.log create mode 100644 pong/game/migrations/0001_initial.py:Zone.Identifier delete mode 100644 pong/game/migrations/0002_alter_match_winner.py create mode 100644 pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier delete mode 100644 pong/game/migrations/0003_alter_tournoi_date.py delete mode 100644 pong/game/templates/pong/tournament_brackets.html mode change 100755 => 100644 pong/static/flags/de.svg mode change 100755 => 100644 pong/static/flags/es.svg mode change 100755 => 100644 pong/static/flags/fr.svg mode change 100755 => 100644 pong/static/flags/it.svg mode change 100755 => 100644 pong/static/flags/us.svg diff --git a/.gitignore b/.gitignore index c5bd6df..a8727e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ venv/ __pycache__/ -.env \ No newline at end of file +data/ +.env +makefile +logs/django.log diff --git a/docker-compose.yml b/docker-compose.yml index 062be5a..c283dec 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -50,7 +50,7 @@ services: until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done; echo "Setting kibana_system password"; until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done; - echo "All done!"; + echo "All done!"; ' healthcheck: test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"] @@ -67,7 +67,7 @@ services: restart: always command: /bin/sh -c "sleep 5 && venv/bin/python manage.py makemigrations --noinput && - venv/bin/python manage.py migrate --noinput && + venv/bin/python manage.py migrate --noinput && venv/bin/python manage.py collectstatic --noinput && venv/bin/daphne -b 0.0.0.0 -p 8080 pong.asgi:application" volumes: @@ -175,21 +175,21 @@ services: - XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=${ENCRYPTION_KEY} - XPACK_REPORTING_ENCRYPTIONKEY=${ENCRYPTION_KEY} healthcheck: - test: + test: [ - "CMD-SHELL", + "CMD-SHELL", "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'" ] interval: 10s timeout: 10s retries: 120 - + logstash01: image: docker.elastic.co/logstash/logstash:${STACK_VERSION} container_name: logstash01 labels: - co.elastic.logs/module: logstash - user: root + co.elastic.logs/module: logstash + user: root depends_on: es01: condition: service_healthy @@ -209,7 +209,7 @@ services: - ELASTIC_USER=${ELASTIC_USERNAME} - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - xpack.monitoring.enabled=false - + volumes: pong: driver: local @@ -219,6 +219,10 @@ volumes: o: bind pong_django_logs: driver: local + driver_opts: + type: none + device: ${DJANGO_LOGS} + o: bind pong_pg_data: driver: local pong_es_data_01: diff --git a/env_template b/env_template index 92f05fd..b297aeb 100644 --- a/env_template +++ b/env_template @@ -6,7 +6,7 @@ DJANGO_ALLOWED_HOSTS=['*'] # PostgreSQL settings POSTGRES_DB=players_db POSTGRES_USER=42student -POSTGRES_PASSWORD=postgre_pass +POSTGRES_PASSWORD= # Django settings DB_HOST=db @@ -20,11 +20,11 @@ CLUSTER_NAME=docker-cluster LICENSE=basic ELASTIC_USERNAME=elastic -ELASTIC_PASSWORD=elastic_pass +ELASTIC_PASSWORD= # Kibana settings KIBANA_PORT=5601 -KIBANA_USERNAME=kibana_system -KIBANA_PASSWORD=kibana_pass +KIBANA_USERNAME= +KIBANA_PASSWORD= ENCRYPTION_KEY=c34d38b3a14956121ff2170e5030b471551370178f43e5626eec58b04a30fae2 diff --git a/logs/172.20.2.60-1726141292617.log b/logs/172.20.2.60-1726141292617.log new file mode 100644 index 0000000..64d21c5 --- /dev/null +++ b/logs/172.20.2.60-1726141292617.log @@ -0,0 +1,56 @@ +: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 new file mode 100644 index 0000000..b064e74 --- /dev/null +++ b/logs/172.20.2.60-1726142931992.log @@ -0,0 +1,72 @@ +: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 new file mode 100644 index 0000000..751fd1a --- /dev/null +++ b/logs/172.20.2.60-1726144089884.log @@ -0,0 +1,126 @@ +: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 new file mode 100644 index 0000000..78a214f --- /dev/null +++ b/logs/172.20.2.60-1726150242355.log @@ -0,0 +1,78 @@ +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/logs/172.31.141.12-1726064615544.log b/logs/172.31.141.12-1726064615544.log new file mode 100644 index 0000000..b185656 --- /dev/null +++ b/logs/172.31.141.12-1726064615544.log @@ -0,0 +1,41 @@ +: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: dede +game.js:203 User existence check response: {exists: false} +game.js:212 handleRegister called +game.js:225 Attempting to register user: dede +game.js:250 registerUser called with username: dede +game.js:273 Registration response data: {registered: true, token: 'c4ab5fd7-4b04-4353-8d4e-ae1afb2ba793'} +game.js:275 User registered successfully: {registered: true, token: 'c4ab5fd7-4b04-4353-8d4e-ae1afb2ba793'} +game.js:229 Token stored: c4ab5fd7-4b04-4353-8d4e-ae1afb2ba793 +game.js:230 User registered successfully +game.js:922 Joining room: main_room with username: dede and token: c4ab5fd7-4b04-4353-8d4e-ae1afb2ba793 +game.js:929 Joining new room: main_room +game.js:846 createRoomTab: main_room with username: dede and token: c4ab5fd7-4b04-4353-8d4e-ae1afb2ba793 +game.js:856 Tab for room main_room already exists. +game.js:870 Showing tab for room: main_room +game.js:778 Initializing chat WebSocket... +game.js:779 Initializing chat WebSocket for room: main_room with username: dede +game.js:877 switchRoom: main_room with username: dede and token: c4ab5fd7-4b04-4353-8d4e-ae1afb2ba793 +game.js:883 Attempting to switch to room: main_room +game.js:889 Switching from room null to room main_room +game.js:783 startChatWebSocket: main_room with username: dede and token: c4ab5fd7-4b04-4353-8d4e-ae1afb2ba793 +game.js:785 Attempting to connect to WebSocket for room: main_room +game.js:835 WebSocket connection stored for room: main_room +game.js:784 WebSocket connection to 'ws://172.31.141.12:8080/ws/chat/main_room/' failed: +(anonymous) @ game.js:784 +game.js:831 Chat WebSocket error in room main_room: Event {isTrusted: true, type: 'error', target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …} +chatSocket.onerror @ game.js:831 +error +(anonymous) @ game.js:830 +setTimeout +startChatWebSocket @ game.js:781 +joinRoom @ game.js:932 +handleRegister @ game.js:235 +game.js:826 Chat WebSocket closed unexpectedly for room main_room +chatSocket.onclose @ game.js:826 +game.js:754 WebSocket is already in CLOSING or CLOSED state. +sendMessage @ game.js:754 +(anonymous) @ game.js:747 diff --git a/logs/172.31.141.12-1726065549172.log b/logs/172.31.141.12-1726065549172.log new file mode 100644 index 0000000..7a3b513 --- /dev/null +++ b/logs/172.31.141.12-1726065549172.log @@ -0,0 +1,38 @@ +: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: ferdy +game.js:203 User existence check response: {exists: false} +game.js:212 handleRegister called +game.js:225 Attempting to register user: ferdy +game.js:250 registerUser called with username: ferdy +game.js:273 Registration response data: {registered: true, token: '4d383e70-92b8-4e04-8efb-d7bdfc0dcfac'} +game.js:275 User registered successfully: {registered: true, token: '4d383e70-92b8-4e04-8efb-d7bdfc0dcfac'} +game.js:229 Token stored: 4d383e70-92b8-4e04-8efb-d7bdfc0dcfac +game.js:230 User registered successfully +game.js:922 Joining room: main_room with username: ferdy and token: 4d383e70-92b8-4e04-8efb-d7bdfc0dcfac +game.js:929 Joining new room: main_room +game.js:846 createRoomTab: main_room with username: ferdy and token: 4d383e70-92b8-4e04-8efb-d7bdfc0dcfac +game.js:856 Tab for room main_room already exists. +game.js:870 Showing tab for room: main_room +game.js:778 Initializing chat WebSocket... +game.js:779 Initializing chat WebSocket for room: main_room with username: ferdy +game.js:877 switchRoom: main_room with username: ferdy and token: 4d383e70-92b8-4e04-8efb-d7bdfc0dcfac +game.js:883 Attempting to switch to room: main_room +game.js:889 Switching from room null to room main_room +game.js:783 startChatWebSocket: main_room with username: ferdy and token: 4d383e70-92b8-4e04-8efb-d7bdfc0dcfac +game.js:785 Attempting to connect to WebSocket for room: main_room +game.js:835 WebSocket connection stored for room: main_room +game.js:784 WebSocket connection to 'ws://172.31.141.12:8080/ws/chat/main_room/' failed: +(anonymous) @ game.js:784 +game.js:831 Chat WebSocket error in room main_room: Event {isTrusted: true, type: 'error', target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}isTrusted: truebubbles: falsecancelBubble: falsecancelable: falsecomposed: falsecurrentTarget: WebSocket {url: 'ws://172.31.141.12:8080/ws/chat/main_room/', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}defaultPrevented: falseeventPhase: 0returnValue: truesrcElement: WebSocket {url: 'ws://172.31.141.12:8080/ws/chat/main_room/', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}target: WebSocket {url: 'ws://172.31.141.12:8080/ws/chat/main_room/', readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}timeStamp: 13273.79999999702type: "error"[[Prototype]]: Event +chatSocket.onerror @ game.js:831 +error +(anonymous) @ game.js:830 +setTimeout +startChatWebSocket @ game.js:781 +joinRoom @ game.js:932 +handleRegister @ game.js:235 +game.js:826 Chat WebSocket closed unexpectedly for room main_room +chatSocket.onclose @ game.js:826 diff --git a/logs/172.31.141.12-1726069036744.log b/logs/172.31.141.12-1726069036744.log new file mode 100644 index 0000000..8c94772 --- /dev/null +++ b/logs/172.31.141.12-1726069036744.log @@ -0,0 +1,40 @@ +: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: gggg +game.js:203 User existence check response: {exists: false} +game.js:212 handleRegister called +game.js:225 Attempting to register user: gggg +game.js:250 registerUser called with username: gggg +game.js:273 Registration response data: {registered: true, token: 'a6010523-60c5-460b-ac49-39097e66a376'} +game.js:275 User registered successfully: {registered: true, token: 'a6010523-60c5-460b-ac49-39097e66a376'} +game.js:229 Token stored: a6010523-60c5-460b-ac49-39097e66a376 +game.js:230 User registered successfully +game.js:926 Joining room: main_room with username: gggg and token: a6010523-60c5-460b-ac49-39097e66a376 +game.js:933 Joining new room: main_room +game.js:850 createRoomTab: main_room with username: gggg and token: a6010523-60c5-460b-ac49-39097e66a376 +game.js:860 Tab for room main_room already exists. +game.js:874 Showing tab for room: main_room +game.js:780 Initializing chat WebSocket... +game.js:781 Initializing chat WebSocket for room: main_room with username: gggg +game.js:881 switchRoom: main_room with username: gggg and token: a6010523-60c5-460b-ac49-39097e66a376 +game.js:887 Attempting to switch to room: main_room +game.js:893 Switching from room null to room main_room +game.js:785 startChatWebSocket: main_room with username: gggg and token: a6010523-60c5-460b-ac49-39097e66a376 +game.js:787 Attempting to connect to WebSocket for room: main_room +game.js:838 WebSocket connection stored for room: main_room +game.js:839 Authentication username for chat-input: gggg +game.js:790 Chat WebSocket connection established in room: main_room +game.js:798 Authentication message sent with username: gggg +game.js:799 Authentication message sent for room: main_room +game.js:804 Message received from server in room main_room: {type: 'chat_message', message: ': Anonyme Vous avez rejoint le chat main_room', room: 'main_room'}message: ": Anonyme Vous avez rejoint le chat main_room"room: "main_room"type: "chat_message"[[Prototype]]: Object +game.js:814 Message displayed in chat log for room: main_room +game.js:804 Message received from server in room main_room: {type: 'authenticated', username: 'gggg'}type: "authenticated"username: "gggg"[[Prototype]]: Object +game.js:806 User authenticated for chat successfully in room: main_room +game.js:754 Sending message from username: gggg +game.js:804 Message received from server in room main_room: {type: 'chat_message', message: 'gggg: hhfghfh', room: 'main_room'} +game.js:814 Message displayed in chat log for room: main_room +game.js:754 Sending message from username: gggg +game.js:804 Message received from server in room main_room: {type: 'chat_message', message: 'gggg: fhfhfh', room: 'main_room'} +game.js:814 Message displayed in chat log for room: main_room diff --git a/logs/django_errors.log b/logs/django_errors.log new file mode 100644 index 0000000..08ff9f5 --- /dev/null +++ b/logs/django_errors.log @@ -0,0 +1,9 @@ +{"asctime": "2024-09-01 18:09:35,223", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 131470748288704, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} +{"asctime": "2024-09-01 18:19:53,264", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 131966181574336, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} +{"asctime": "2024-09-01 18:34:25,868", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 138740796229312, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} +{"asctime": "2024-09-01 18:35:04,063", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 138740796229312, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} +{"asctime": "2024-09-01 18:57:12,326", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 125916130838208, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} +{"asctime": "2024-09-01 19:05:27,423", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 132460855690944, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} +{"asctime": "2024-09-02 09:24:00,957", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 138073176278720, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} +{"asctime": "2024-09-02 09:31:57,272", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 129740826478272, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} +{"asctime": "2024-09-02 09:38:30,671", "levelname": "ERROR", "name": "django.request", "module": "log", "process": 25, "thread": 136981996635840, "message": "Internal Server Error: /register_user/", "taskName": null, "status_code": 500, "request": ""} diff --git a/makefile b/makefile index e7fbc31..b6c604c 100644 --- a/makefile +++ b/makefile @@ -3,8 +3,8 @@ COMPOSE=docker compose -f $(COMPOSE_FILE) CONTAINER=$(c) up: down - $(COMPOSE) build - $(COMPOSE) up -d $(CONTAINER) || true + $(COMPOSE) build + $(COMPOSE) up $(CONTAINER) || true build: $(COMPOSE) build $(CONTAINER) @@ -20,13 +20,8 @@ down: destroy: $(COMPOSE) down -v --rmi all - -kill-pid: sudo lsof -i :5432 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true - sudo lsof -i :5601 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true - sudo lsof -i :9200 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true - sudo lsof -i :8080 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true - sudo lsof -i :5044 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true + sudo lsof -i :80 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true logs: $(COMPOSE) logs -f $(CONTAINER) @@ -35,7 +30,7 @@ ps: $(COMPOSE) ps db-shell: - $(COMPOSE) exec db psql -U 42student players_db + $(COMPOSE) exec db psql -U 42student players_db re: destroy up @@ -52,4 +47,3 @@ help: @echo " make help # Show this help" .PHONY: up build start stop down destroy logs ps db-shell help - diff --git a/pong/asgi.py b/pong/asgi.py index 3a8dc68..9c90f25 100644 --- a/pong/asgi.py +++ b/pong/asgi.py @@ -11,8 +11,14 @@ https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ import os import django +import logging +logger = logging.getLogger(__name__) + +logger.debug("Setting default DJANGO_SETTINGS_MODULE to 'pong.settings'") os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pong.settings') + +logger.debug("Initializing Django setup") django.setup() from django.core.asgi import get_asgi_application @@ -20,6 +26,7 @@ from channels.routing import ProtocolTypeRouter, URLRouter from channels.auth import AuthMiddlewareStack import pong.game.routing +logger.debug("Configuring ProtocolTypeRouter") application = ProtocolTypeRouter({ "http": get_asgi_application(), "websocket": AuthMiddlewareStack( @@ -28,3 +35,5 @@ application = ProtocolTypeRouter({ ) ), }) + +logger.info("ASGI application configurée et prête à accepter les connexions") diff --git a/pong/game/consumers.py b/pong/game/consumers.py index 8412496..86211ee 100644 --- a/pong/game/consumers.py +++ b/pong/game/consumers.py @@ -1,106 +1,379 @@ -# /pong/game/consumers.py - import json from channels.generic.websocket import AsyncWebsocketConsumer +from asgiref.sync import sync_to_async from django.contrib.auth.models import User from channels.db import database_sync_to_async from .matchmaking import match_maker from .tournament import tournament_match_maker -import asyncio +import logging + +logger = logging.getLogger(__name__) class GameConsumer(AsyncWebsocketConsumer): - async def connect(self): - await self.accept() - self.game = None - print("User connected") + async def connect(self): + try: + await self.accept() + self.game = None + logger.info("User connected via WebSocket") + except Exception as e: + logger.error(f"Error during WebSocket connection: {str(e)}") - async def receive(self, text_data): - data = json.loads(text_data) - if data['type'] == 'authenticate': - await self.authenticate(data['token']) - elif data['type'] == 'authenticate2': - await self.authenticate2(data['token_1'], data['token_2']) - elif data['type'] == 'authenticate3': - await self.authenticate3(data['token']) - elif data['type'] == 'key_press': - if self.game: - await self.game.handle_key_press(self, data['key']) - elif data['type'] == 'start_tournament': - print(f"Start TOURNAMENT received by {self.user}") - # Run the tournament in the background - asyncio.create_task(tournament_match_maker.start_tournament()) + async def receive(self, text_data): + try: + logger.debug(f"Received data: {text_data}") + data = json.loads(text_data) + message_type = data.get('type') - async def authenticate(self, token): - user = await self.get_user_from_token(token) - if user: - self.user = user - await self.send(text_data=json.dumps({'type': 'authenticated'})) - print(f"User {self.user} authenticated") - await self.join_waiting_room() - else: - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) - print("Authentication failed") + if message_type == 'authenticate': + await self.authenticate(data.get('token')) + elif message_type == 'authenticate2': + await self.authenticate2(data.get('token_1'), data.get('token_2')) + elif message_type == 'authenticate3': + await self.authenticate3(data.get('token')) + elif message_type == 'key_press': + if self.game: + await self.game.handle_key_press(self, data.get('key')) + else: + await match_maker.handle_key_press(self, data.get('key')) + else: + logger.warning(f"Received unknown message type: {message_type}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Unknown message type'})) + except json.JSONDecodeError as e: + logger.error(f"JSON decode error: {str(e)} - Data received: {text_data}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Invalid JSON format'})) + except Exception as e: + logger.error(f"Error in WebSocket receive: {str(e)}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Internal server error'})) - @database_sync_to_async - def get_user_from_token(self, token): - try: - user = User.objects.filter(auth_token=token).first() - return user - except User.DoesNotExist: - return None + async def authenticate(self, token): + if not token: + logger.error("Token is None, authentication cannot proceed") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Token is missing'})) + return + try: + user = await self.get_user_from_token(token) + if user: + self.user = user + await self.send(text_data=json.dumps({'type': 'authenticated'})) + logger.info(f"User {self.user} authenticated") + await self.join_waiting_room() + else: + logger.warning(f"Authentication failed for token: {token}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) + 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'})) - async def join_waiting_room(self): - await self.send(text_data=json.dumps({'type': 'waiting_room'})) - await match_maker.add_player(self) + async def authenticate2(self, token_1, token_2): + try: + user = await self.get_user_from_token(token_1) + if user: + self.user = user + await self.send(text_data=json.dumps({'type': 'authenticated'})) + logger.info(f"User {self.user} authenticated with token_1") - async def authenticate2(self, token, token2): - user = await self.get_user_from_token(token) - if user: - self.user = user - await self.send(text_data=json.dumps({'type': 'authenticated'})) - print(f"User {self.user} authenticated") - user2 = await self.get_user_from_token2(token2) - if user2: - self.user2 = user2 - await self.send(text_data=json.dumps({'type': 'authenticated'})) - print(f"User {self.user2} authenticated") - await match_maker.create_game(self, None, True) - else: - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) - print("Authentication failed") - else: - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) - print("Authentication failed") + user2 = await self.get_user_from_token2(token_2) + if user2: + self.user2 = user2 + await self.send(text_data=json.dumps({'type': 'authenticated'})) + logger.info(f"User {self.user2} authenticated with token_2") + await match_maker.create_game(self, None, True) + else: + logger.warning(f"Authentication failed for token_2: {token_2}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed for user 2'})) + else: + logger.warning(f"Authentication failed for token_1: {token_1}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed for user 1'})) + except Exception as e: + logger.error(f"Error during dual authentication: {str(e)}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Internal server error'})) - @database_sync_to_async - def get_user_from_token2(self, token): - try: - user2 = User.objects.filter(auth_token=token).first() - return user2 - except User.DoesNotExist: - return None + async def authenticate3(self, token): + try: + user = await self.get_user_from_token(token) + if user: + self.user = user + await self.send(text_data=json.dumps({'type': 'authenticated'})) + logger.info(f"User {self.user} authenticated for tournament") + await self.join_tournament_waiting_room() + else: + logger.warning(f"Authentication failed for token: {token}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) + except Exception as e: + logger.error(f"Error during tournament authentication: {str(e)}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Internal server error'})) - async def authenticate3(self, token): - user = await self.get_user_from_token(token) - if user: - self.user = user - await self.send(text_data=json.dumps({'type': 'authenticated'})) - print(f"User {self.user.username} authenticated for tournament") - await self.join_tournament_waiting_room() - else: - await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) - print("Tournament authentication failed") + @database_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}") + return user + except User.DoesNotExist: + logger.warning(f"User not found for token: {token}") + return None - async def join_tournament_waiting_room(self): - await tournament_match_maker.add_player(self) + @database_sync_to_async + def get_user_from_token2(self, token): + try: + user2 = User.objects.filter(auth_token=token).first() + logger.debug(f"User2 found: {user2} for token: {token}") + return user2 + except User.DoesNotExist: + logger.warning(f"User not found for token_2: {token}") + return None - async def disconnect(self, close_code): - if self.game: - await self.game.end_game(disconnected_player=self) - await match_maker.remove_player(self) - await tournament_match_maker.remove_player(self) - print(f"User {self.user.username if hasattr(self, 'user') else 'Unknown'} disconnected") + async def join_waiting_room(self): + logger.info("Joining waiting room") + await self.send(text_data=json.dumps({'type': 'waiting_room'})) + await match_maker.add_player(self) - async def set_game(self, game): - print(f"({self.user}) Game set to: {game}") - self.game = game + async def join_tournament_waiting_room(self): + logger.info("Joining tournament waiting room") + await tournament_match_maker.add_player(self) + + async def disconnect(self, close_code): + try: + if self.game: + await self.game.end_game(disconnected_player=self) + await match_maker.remove_player(self) + await tournament_match_maker.remove_player(self) + logger.info(f"User {self.user.username if hasattr(self, 'user') else 'Unknown'} disconnected") + except Exception as e: + logger.error(f"Error during WebSocket disconnection: {str(e)}") + + async def set_game(self, game): + logger.info(f"Setting game: {game}") + self.game = game +###############################CHAT############################################ +class ChatConsumer(AsyncWebsocketConsumer): + groups = {} + + async def connect(self): + try: + # Récupérer le nom de la room + self.room_group_name = self.scope['url_route']['kwargs']['room_name'] + + # Accepter la connexion WebSocket + await self.accept() + + 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}") + + 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( + 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 + } + ) + 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}") + except Exception as e: + logger.error(f"Erreur lors de la déconnexion WebSocket du chat: {str(e)}") + + async def receive(self, text_data): + try: + data = json.loads(text_data) + message_type = data.get('type') + username = data.get('username').strip().lower() # Normalisation du nom d'utilisateur + + # 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'})) + return + + # Gestion des types de messages + if message_type == 'authenticate': + await self.authenticate(data.get('token'), username) + + 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 + + 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) + + # 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) + + else: + logger.warning(f"Unhandled message type: {message_type}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Unhandled message type'})) + + 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'})) + 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'})) + + async def handle_block_user(self, data): + username = data['username'].strip().lower() # Normalisation du nom d'utilisateur + target_user = data['target_user'].strip().lower() + + # 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}") + + if target_user == username: + logger.warning(f"Block attempt failed: {username} tried to block themselves") + 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}'})) + + async def handle_invite_user(self, data): + username = data['username'].strip().lower() + target_user = data['target_user'].strip().lower() + + # 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}'})) + return + + logger.info(f"Invitation request: {username} wants to invite {target_user} to a quick match in room {room}") + + 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, { + '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}'})) + + + 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'})) + return + 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}', + } + ) + else: + logger.warning(f"Authentication failed for token: {token}") + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) + 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'})) + + @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}") + 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 + })) diff --git a/pong/game/game.py b/pong/game/game.py index 42bfda6..515dccd 100644 --- a/pong/game/game.py +++ b/pong/game/game.py @@ -4,14 +4,11 @@ import json import asyncio import random from datetime import datetime -from .utils import handle_game_data, getlen +from .utils import handle_game_data from asgiref.sync import sync_to_async -from .models import Tournoi + class Game: - # Global variable to handle the using of the database - USING_DB = False - def __init__(self, game_id, player1, player2, localgame): self.game_id = game_id self.player1 = player1 @@ -31,10 +28,9 @@ class Game: 'game_text': '' } else: - # Set botgame to True if either player1 or player2 is None - self.botgame = player1 is None or player2 is None + self.botgame = player2 is None self.game_state = { - 'player1_name': player1.user.username if player1 else 'BOT', + 'player1_name': player1.user.username, 'player2_name': player2.user.username if player2 else 'BOT', 'player1_position': 150, 'player2_position': 150, @@ -51,64 +47,57 @@ class Game: self.p2_mov = 0 self.bt1 = 0 self.bt2 = 0 - self.start_time = datetime.now() - self.future_ball_position = {'x': 390, 'y': 190} + self.start_time = None async def start_game(self): - print(f"- Game #{self.game_id} STARTED ({self.game_state['player1_name']} vs {self.game_state['player2_name']}) --- ({self})") + print(f"- Game #{self.game_id} STARTED") self.game_loop_task = asyncio.create_task(self.game_loop()) + self.start_time = datetime.now() print(f" Begin MATCH at: {self.start_time}") async def game_loop(self): print(" In the game loop..") - x = 59 + x = 0 while not self.ended: if self.botgame: x += 1 if x == 60: - # Random BOT difficulty.. - steps = 60#random.randint(10, 60) - self.future_ball_position = await self.predict_ball_trajectory(steps) + await self.update_bot_position() x = 0 - if self.botgame: - await self.update_bot_position() await self.handle_pad_movement() await self.update_game_state() await self.send_game_state() await asyncio.sleep(1/60) # Around 60 FPS async def update_bot_position(self): - #future_ball_position = self.predict_ball_trajectory() - target_y = self.future_ball_position['y'] + future_ball_position = self.predict_ball_trajectory() + + target_y = future_ball_position['y'] player2_position = self.game_state['player2_position'] # Adjusts bot position based on expected ball position if player2_position < target_y < player2_position + 80: pass #bot already placed elif player2_position < target_y: - self.p2_mov = 1 - #self.game_state['player2_position'] = min(player2_position + (50 * self.speed), 300) + self.game_state['player2_position'] = min(player2_position + (50 * self.speed), 300) elif player2_position + 80 > target_y: - self.p2_mov = -1 - #self.game_state['player2_position'] = max(player2_position - (50 * self.speed), 0) + self.game_state['player2_position'] = max(player2_position - (50 * self.speed), 0) - async def predict_ball_trajectory(self, steps=60): + def predict_ball_trajectory(self, steps=60): + future_x = self.game_state['ball_position']['x'] future_y = self.game_state['ball_position']['y'] velocity_x = self.game_state['ball_velocity']['x'] velocity_y = self.game_state['ball_velocity']['y'] + for _ in range(steps): future_x += velocity_x - if future_x <= 10: - future_x = 10 - velocity_x = -velocity_x - elif future_x >= 790: - future_x = 790 - else: - future_y += velocity_y - # Dealing with bounces off walls - if future_y <= 10 or future_y >= 390: - velocity_y = -velocity_y # Reverse the direction of vertical movement + future_y += velocity_y + + # Dealing with bounces off walls + if future_y <= 0 or future_y >= 300: + velocity_y = -velocity_y # Reverse the direction of vertical movement + return {'x': future_x, 'y': future_y} async def update_game_state(self): @@ -221,10 +210,10 @@ class Game: self.ended = True if self.game_loop_task: self.game_loop_task.cancel() - print(f"- Game #{self.game_id} ENDED --- ({self})") + print(f"- Game #{self.game_id} ENDED") end_time = datetime.now() - duration = (end_time - self.start_time).total_seconds() / 60 + duration = (end_time - self.start_time).total_seconds() / 60 # Notify that one player left the game if disconnected_player: @@ -246,17 +235,6 @@ class Game: if not self.botgame: if not self.localgame: await self.player2.send(end_message) - while (Game.USING_DB): - await asyncio.sleep(1) - Game.USING_DB = True - if hasattr(self, 'tournament'): - print(f"*** Game #{self.game_id} from tournament: {self.tournament.tournoi_reg.name} ENDED ***") - await sync_to_async(handle_game_data)(self.game_state['player1_name'], self.game_state['player2_name'], - self.game_state['player1_score'], self.game_state['player2_score'], - self.bt1, self.bt2, duration, True, self.tournament.tournoi_reg) - print(f"*** Game #{self.game_id} from tournament: {self.tournament.tournoi_reg.name} is REGISTERED ***") - else: - await sync_to_async(handle_game_data)(self.game_state['player1_name'], self.game_state['player2_name'], + await sync_to_async(handle_game_data)(self.game_state['player1_name'], self.game_state['player2_name'], self.game_state['player1_score'], self.game_state['player2_score'], self.bt1, self.bt2, duration, False, None) - Game.USING_DB = False diff --git a/pong/game/matchmaking.py b/pong/game/matchmaking.py index 6382b95..989a1dd 100644 --- a/pong/game/matchmaking.py +++ b/pong/game/matchmaking.py @@ -26,8 +26,7 @@ class MatchMaker: for game in self.active_games.values(): if player in [game.player1, game.player2]: await game.end_game(disconnected_player=player) - if game.game_id in self.active_games: - del self.active_games[game.game_id] + del self.active_games[game.game_id] break async def match_loop(self): @@ -103,5 +102,11 @@ class MatchMaker: 'player2': 'BOT' })) + async def handle_key_press(self, player, key): + for game in self.active_games.values(): + if player in [game.player1, game.player2]: + await game.handle_key_press(player, key) + break + # Instance of the class match_maker = MatchMaker() diff --git a/pong/game/migrations/0001_initial.py:Zone.Identifier b/pong/game/migrations/0001_initial.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/migrations/0002_alter_match_winner.py b/pong/game/migrations/0002_alter_match_winner.py deleted file mode 100644 index fe0f120..0000000 --- a/pong/game/migrations/0002_alter_match_winner.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.0.7 on 2024-07-31 16:04 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('game', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='match', - name='winner', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='won_matches', to='game.player'), - ), - ] diff --git a/pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier b/pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/migrations/0003_alter_tournoi_date.py b/pong/game/migrations/0003_alter_tournoi_date.py deleted file mode 100644 index 6bfda6c..0000000 --- a/pong/game/migrations/0003_alter_tournoi_date.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.1 on 2024-09-10 14:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('game', '0002_alter_match_winner'), - ] - - operations = [ - migrations.AlterField( - model_name='tournoi', - name='date', - field=models.DateField(auto_now_add=True), - ), - ] diff --git a/pong/game/models.py b/pong/game/models.py index 4f63102..efdb580 100644 --- a/pong/game/models.py +++ b/pong/game/models.py @@ -1,9 +1,13 @@ -# /pong/game/models.py - from django.db import models from django.contrib.auth.models import User +from django.core.exceptions import ValidationError +import logging +logger = logging.getLogger(__name__) + +# Ajout d'un champ auth_token à la classe User User.add_to_class('auth_token', models.CharField(max_length=100, null=True, blank=True, unique=True)) +logger.debug("Ajout du champ auth_token à la classe User") class Player(models.Model): name = models.CharField(max_length=100) @@ -20,23 +24,33 @@ class Player(models.Model): num_won_tournaments = models.PositiveSmallIntegerField(default=0) def __str__(self): - return self.name + return self.name + + def save(self, *args, **kwargs): + logger.info(f"Saving player: {self.name}") + super().save(*args, **kwargs) + logger.info(f"Player {self.name} saved successfully") class Tournoi(models.Model): name = models.CharField(max_length=200) nbr_player = models.PositiveSmallIntegerField() - date = models.DateField(auto_now_add=True) + date = models.DateField() winner = models.ForeignKey('Player', on_delete=models.SET_NULL, null=True) def __str__(self): return self.name + def save(self, *args, **kwargs): + logger.info(f"Saving tournament: {self.name}") + super().save(*args, **kwargs) + logger.info(f"Tournament {self.name} saved successfully") + class Match(models.Model): player1 = models.ForeignKey('Player', related_name='match_as_player1', on_delete=models.CASCADE) player2 = models.ForeignKey('Player', related_name='match_as_player2', on_delete=models.CASCADE) score_player1 = models.PositiveSmallIntegerField() score_player2 = models.PositiveSmallIntegerField() - winner = models.ForeignKey('Player', related_name='won_matches',on_delete=models.CASCADE, null=True) + winner = models.ForeignKey('Player', related_name='won_matches', on_delete=models.CASCADE, null=True) nbr_ball_touch_p1 = models.PositiveIntegerField() nbr_ball_touch_p2 = models.PositiveIntegerField() duration = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) @@ -45,6 +59,7 @@ class Match(models.Model): tournoi = models.ForeignKey('Tournoi', related_name='matches', on_delete=models.SET_NULL, null=True) def clean(self): + logger.debug(f"Cleaning match: {self.player1.name} vs {self.player2.name}") if self.score_player1 < 0 or self.score_player2 < 0: raise ValidationError('Les scores doivent être positifs.') if self.score_player1 > self.score_player2 and self.winner != self.player1: @@ -54,8 +69,10 @@ class Match(models.Model): super().clean() def save(self, *args, **kwargs): + logger.info(f"Saving match: {self.player1.name} vs {self.player2.name}") self.clean() super().save(*args, **kwargs) + logger.info(f"Match {self.player1.name} vs {self.player2.name} saved successfully") def __str__(self): - return f"{self.player1.name} vs {self.player2.name}" \ No newline at end of file + return f"{self.player1.name} vs {self.player2.name}" diff --git a/pong/game/routing.py b/pong/game/routing.py index 8b421b9..3c631ff 100644 --- a/pong/game/routing.py +++ b/pong/game/routing.py @@ -1,8 +1,15 @@ # /pong/game/routing.py - from django.urls import re_path from . import consumers +import logging + +logger = logging.getLogger(__name__) + +logger.debug("Configuring WebSocket routing patterns") websocket_urlpatterns = [ - re_path(r'ws/game/$', consumers.GameConsumer.as_asgi()), + re_path(r'ws/game/$', consumers.GameConsumer.as_asgi(), name='game_ws'), + re_path(r'ws/chat/(?P\w+)/$', consumers.ChatConsumer.as_asgi()), ] + +logger.info("WebSocket routing patterns configured successfully") diff --git a/pong/game/templates/pong/tournament_brackets.html b/pong/game/templates/pong/tournament_brackets.html deleted file mode 100644 index ca65553..0000000 --- a/pong/game/templates/pong/tournament_brackets.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Tournament Brackets - - - -
- {% for round in tournament_rounds %} -
- {% for match in round %} -
-
- {{ match.player1 }} -
-
- {{ match.player2|default:"BYE" }} -
-
- {% endfor %} -
- {% endfor %} -
- - \ No newline at end of file diff --git a/pong/game/templates/pong/tournament_waiting_room.html b/pong/game/templates/pong/tournament_waiting_room.html index cb77338..dc09859 100644 --- a/pong/game/templates/pong/tournament_waiting_room.html +++ b/pong/game/templates/pong/tournament_waiting_room.html @@ -1,20 +1,10 @@ - +

Tournament Waiting Room

- -

Players currently waiting: {{ players_count }}

-

Minimum players needed to start: {{ min_players_to_start }}

- -

Players:

+

Players currently waiting: {{ players|length }}

    - {% for player in players %} -
  • {{ player }}
  • - {% endfor %} + {% for player in players %} +
  • {{ player }}
  • + {% endfor %}
- - {% if players_count >= min_players_to_start %} - - {% else %} -

Waiting for more players to join...

- {% endif %}
\ No newline at end of file diff --git a/pong/game/tournament.py b/pong/game/tournament.py index c2903a1..4faeca0 100644 --- a/pong/game/tournament.py +++ b/pong/game/tournament.py @@ -1,224 +1,49 @@ # /pong/game/tournament.py - import json -import asyncio from django.template.loader import render_to_string -import random -from .matchmaking import match_maker -from .game import Game -from .models import Tournoi -from .utils import create_tournament, update_tournament, getlen -from asgiref.sync import sync_to_async +import logging -TOURNAMENT_NAMES = [ - "Champion's Clash", "Ultimate Showdown", "Battle Royale", - "Victory's Cup", "Legends Tournament", "Elite Series", "Clash of 42", - "Shibuya Incident", "Cunning Game", "Elite of the Stars", "Chaku's Disciples" -] - -class TournamentMatch(Game): - def __init__(self, game_id, player1, player2, tournament): - # Initialize the parent Game class with the provided parameters - super().__init__(game_id, player1, player2, False) - # Store the current game instance in active games - match_maker.active_games[game_id] = self - # Store the tournament instance - self.tournament = tournament - - async def end_game(self, disconnected_player=None): - # Call the parent class's end_game method - await super().end_game(disconnected_player) - # Handle the end of the match in the tournament context - await self.tournament.handle_match_end(self) - if self.game_id in match_maker.active_games: - del match_maker.active_games[self.game_id] +logger = logging.getLogger(__name__) class TournamentMatchMaker: def __init__(self): self.waiting_players = [] - self.matches = [] - self.rounds = [] - self.current_round = 0 - self.games = 0 - self.tournament_state = "waiting" #Can be "waiting", "in_progress", or "ended" - self.name = random.choice(TOURNAMENT_NAMES) - self.final_name = "" - self.tournoi_reg = None + logger.debug("TournamentMatchMaker initialized with an empty waiting_players list") async def add_player(self, player): - if self.tournament_state == "waiting" and player not in self.waiting_players: + if player not in self.waiting_players: self.waiting_players.append(player) - if player: - print(f"User {player.user.username} joins the TOURNAMENT WAITING ROOM") - else: - print("BOT joins the TOURNAMENT WAITING ROOM") + logger.info(f"User {player.user.username} added to the TOURNAMENT WAITING ROOM") await self.update_waiting_room() - - async def update_waiting_room(self): - html = self.generate_waiting_room_html() - for player in self.waiting_players: - await self.send_to_player(player, { - 'type': 'update_tournament_waiting_room', - 'html': html - }) - - def generate_waiting_room_html(self): - context = { - 'players': [player.user.username if player else 'BYE' for player in self.waiting_players], - 'tournament_state': self.tournament_state, - 'players_count': len(self.waiting_players), - 'min_players_to_start': 3 # You can adjust this number as needed - } - return render_to_string('pong/tournament_waiting_room.html', context) - - async def send_to_player(self, player, data): - if player: - await player.send(json.dumps(data)) + else: + logger.warning(f"User {player.user.username} is already in the TOURNAMENT WAITING ROOM") async def remove_player(self, player): if player in self.waiting_players: self.waiting_players.remove(player) + logger.info(f"User {player.user.username} removed from the TOURNAMENT WAITING ROOM") await self.update_waiting_room() + else: + logger.warning(f"Attempt to remove non-existent user {player.user.username} from the TOURNAMENT WAITING ROOM") - # Tournament start method - async def start_tournament(self): - if len(self.waiting_players) < 3: - return False - random.shuffle(self.waiting_players) - '''if (len(self.waiting_players) % 2) != 0: - print("Adding a BYE to the tournament..") - await self.add_player(None)''' - self.tournament_state = "in_progress" - self.current_round = 0 - len_tournament = await sync_to_async(getlen)() - self.final_name = self.name + " #" + str(len_tournament + 1) - self.tournoi_reg = await sync_to_async(create_tournament)(self.final_name, len(self.waiting_players)) - await self.advance_tournament() - return True - - async def advance_tournament(self): - players = self.waiting_players - while len(players) > 1: - self.current_round += 1 - print(f"Starting round {self.current_round} with {len(players)} players") - await self.create_matches(players) - await self.update_brackets() - await self.start_round_matches() - # Wait for all matches in the current round to finish - current_round_matches = self.rounds[-1] - while not all(match.ended for match in current_round_matches): - await asyncio.sleep(1) # Wait for 1 second before checking again - # Get winners for the next round - players = self.get_round_winners() - print(f"Round {self.current_round} finished. {len(players)} players advancing.") - # Tournament has ended - await self.update_brackets() - await self.end_tournament(players[0] if players else None) - - async def create_matches(self, players): - matches = [] - for i in range(0, len(players), 2): - self.games += 1 - if i + 1 < len(players): - # Create a new instance of TournamentMatch for this round - match = TournamentMatch(self.games, players[i], players[i + 1], self) - matches.append(match) - else: - # Create a BYE match where the second player is None - match = TournamentMatch(self.games, players[i], None, self) # BYE match - matches.append(match) - - # Assign the new match instance to the players - if players[i]: - await players[i].set_game(match) - if i + 1 < len(players): - if players[i + 1]: - await players[i + 1].set_game(match) - - self.rounds.append(matches) - self.matches.extend(matches) - - async def update_brackets(self): - html = self.generate_bracket_html() + async def update_waiting_room(self): + logger.debug("Updating TOURNAMENT WAITING ROOM") + html = self.generate_waiting_room_html() for player in self.waiting_players: - await self.send_to_player(player, { - 'type': 'update_brackets', + await player.send(json.dumps({ + 'type': 'update_waiting_room', 'html': html - }) + })) + logger.info("TOURNAMENT WAITING ROOM updated and sent to all players") - def generate_bracket_html(self): + def generate_waiting_room_html(self): + logger.debug("Generating TOURNAMENT WAITING ROOM HTML") context = { - 'tournament_rounds': self.get_tournament_data() + 'players': [player.user.username for player in self.waiting_players] } - return render_to_string('pong/tournament_brackets.html', context) - - def get_tournament_data(self): - return [ - [ - { - 'player1': match.player1.user.username if match.player1 else 'BYE', - 'player2': match.player2.user.username if match.player2 else 'BYE', - 'winner': match.game_state['player1_name'] if match.game_state['player1_score'] > match.game_state['player2_score'] else match.game_state['player2_name'] if match.ended else None, - 'score1': match.game_state['player1_score'], - 'score2': match.game_state['player2_score'] - } - for match in round_matches - ] - for round_matches in self.rounds - ] - - async def start_round_matches(self): - print(f"Starting TOURNAMENT round #{self.current_round}") - for match in self.rounds[-1]: - if match.player1 and match.player2: - await match_maker.notify_players(match.player1, match.player2, match.game_id, False) - asyncio.create_task(match.start_game()) - elif match.player1: - # Handle BYE match - await match_maker.notify_players(match.player1, match.player2, match.game_id, False) - #asyncio.create_task(match.start_game()) - match.game_state['player1_score'] = 3 - match.game_state['player2_score'] = 0 - await match.end_game() - await self.send_game_text(match.player1, "You lucky bastard! You got an auto-win!") - - async def send_game_text(self, player, text): - message = json.dumps({ - 'type': 'game_text_update', - 'game_text': text - }) - await player.send(message) - - def get_round_winners(self): - winners = [] - for match in self.rounds[-1]: - if match.ended: - winner = match.player1 if match.game_state['player1_score'] > match.game_state['player2_score'] else match.player2 - #if winner: - winners.append(winner) - return winners - - async def end_tournament(self, winner): - self.tournament_state = "ended" - winner_username = winner.user.username if winner else "No winner" - print(f"The TOURNAMENT winner is {winner_username}") - for player in self.waiting_players: - await self.send_to_player(player, { - 'type': 'tournament_end', - 'winner': winner_username - }) - - await sync_to_async(update_tournament)(self.final_name, winner_username) - # Reset tournament state - self.waiting_players = [] - self.matches = [] - self.rounds = [] - self.current_round = 0 - self.games = 0 - self.tournament_state = "waiting" - - async def handle_match_end(self, match): - await self.update_brackets() + html = render_to_string('pong/tournament_waiting_room.html', context) + logger.info("TOURNAMENT WAITING ROOM HTML generated successfully") + return html # Instance of the class -tournament_match_maker = TournamentMatchMaker() \ No newline at end of file +tournament_match_maker = TournamentMatchMaker() diff --git a/pong/game/urls.py b/pong/game/urls.py index df150f0..f4bf6e2 100644 --- a/pong/game/urls.py +++ b/pong/game/urls.py @@ -2,10 +2,9 @@ from django.urls import path, include from . import views -from rest_framework.routers import DefaultRouter +#from rest_framework.routers import DefaultRouter from .views import match_list_json, player_list_json, tournoi_list_json - urlpatterns = [ path('', views.index, name='index'), path('check_user_exists/', views.check_user_exists, name='check_user_exists'), diff --git a/pong/game/utils.py b/pong/game/utils.py index 0f193d1..6b0f565 100644 --- a/pong/game/utils.py +++ b/pong/game/utils.py @@ -1,3 +1,4 @@ +import logging from .models import Player, Tournoi, Match from django.core.exceptions import ValidationError from django.shortcuts import get_object_or_404 @@ -5,55 +6,62 @@ from django.db.models import Max, Sum, F from datetime import timedelta from channels.db import database_sync_to_async +logger = logging.getLogger(__name__) + def handle_game_data(p1, p2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_tournament): + logger.info(f"Handling game data for players: {p1} vs {p2}") try: player_1 = get_or_create_player(p1) player_2 = get_or_create_player(p2) + logger.debug(f"Players created or retrieved: {player_1}, {player_2}") - print("CHAKU & THEOUCHE are the BEST") create_match(player_1, player_2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_tournament) - print("and ADRIANO is the PEST") + logger.info("Match created successfully") update_player_statistics(p1) update_player_statistics(p2) - + logger.info("Player statistics updated") + except Exception as e: - print(f"Error in endfortheouche: {e}") + logger.error(f"Error in handle_game_data: {e}") def get_player_by_name(name): + logger.debug(f"Checking if player exists with name: {name}") exists = Player.objects.filter(name=name).exists() + logger.debug(f"Player exists: {exists}") return exists - def get_player(name): + logger.debug(f"Retrieving player with name: {name}") return Player.objects.get(name=name) - def get_or_create_player(name): + logger.info(f"Getting or creating player with name: {name}") player_exists = get_player_by_name(name) if not player_exists: player = create_player(name) + logger.info(f"Player created: {player}") return player else: player = get_player(name) - return player - + logger.info(f"Player retrieved: {player}") + return player def create_player( - name, - total_match=0, - total_win=0, - p_win= None, - m_score_match= None, - m_score_adv_match= None, - best_score=0, - m_nbr_ball_touch= None, - total_duration= None, - m_duration= None, - num_participated_tournaments=0, + name, + total_match=0, + total_win=0, + p_win=None, + m_score_match=None, + m_score_adv_match=None, + best_score=0, + m_nbr_ball_touch=None, + total_duration=None, + m_duration=None, + num_participated_tournaments=0, num_won_tournaments=0 ): - + logger.info(f"Creating player: {name}") player = Player( name=name, total_match=total_match, @@ -69,14 +77,18 @@ def create_player( num_won_tournaments=num_won_tournaments ) player.save() + logger.info(f"Player {name} saved successfully") return player def create_tournoi(name, nbr_player, date, winner): + logger.info(f"Creating tournament: {name}") tournoi = Tournoi(name=name, nbr_player=nbr_player, date=date, winner=winner) tournoi.save() + logger.info(f"Tournament {name} saved successfully") return tournoi def create_match(player1, player2, score_player1, score_player2, nbr_ball_touch_p1, nbr_ball_touch_p2, duration, is_tournoi, tournoi): + logger.info(f"Creating match between {player1.name} and {player2.name}") match = Match( player1=player1, player2=player2, @@ -95,20 +107,22 @@ def create_match(player1, player2, score_player1, score_player2, nbr_ball_touch_ match.winner = match.player2 else: match.winner = None - + match.save() + logger.info(f"Match saved successfully with winner: {match.winner.name if match.winner else 'None'}") return match def update_player_statistics(player_name): + logger.info(f"Updating statistics for player: {player_name}") player = get_object_or_404(Player, name=player_name) matches_as_player1 = Match.objects.filter(player1=player) matches_as_player2 = Match.objects.filter(player2=player) total_match = matches_as_player1.count() + matches_as_player2.count() - - # avoid dividing by 0 + if total_match == 0: + logger.warning(f"No matches found for player: {player_name}") player.total_match = total_match player.total_win = 0 player.p_win = 0 @@ -121,22 +135,23 @@ def update_player_statistics(player_name): player.num_participated_tournaments = 0 player.num_won_tournaments = 0 player.save() + logger.info(f"Player statistics reset for {player_name}") return - + won_matches = Match.objects.filter(winner=player) #part_tourn_as_p1 = Tournoi.objects.filter(matches__is_tournoi=True, matches__matches_as_player1=player) #part_tourn_as_p2 = Tournoi.objects.filter(matches__is_tournoi=True, matches__matches_as_player2=player) - #won_tourn = Tournoi.objects.filter(winner=player) + #won_tourn = Tournoi.objects.filter(winner=player) total_score = matches_as_player1.aggregate(Sum('score_player1'))['score_player1__sum'] or 0 total_score += matches_as_player2.aggregate(Sum('score_player2'))['score_player2__sum'] or 0 - + total_score_adv = matches_as_player1.aggregate(Sum('score_player2'))['score_player2__sum'] or 0 total_score_adv += matches_as_player2.aggregate(Sum('score_player1'))['score_player1__sum'] or 0 total_win = won_matches.count() p_win = (total_win / total_match) * 100 - + m_score_match = total_score / total_match m_score_adv_match = total_score_adv / total_match @@ -151,7 +166,7 @@ def update_player_statistics(player_name): #total_tourn_p = part_tourn_as_p1.count() + part_tourn_as_p2.count() #total_win_tourn = won_tourn.count() #p_win_tourn = (total_win_tourn / total_tourn_p) * 100 if total_tourn_p else 0 - + best_score_as_player1 = matches_as_player1.aggregate(Max('score_player1'))['score_player1__max'] or 0 best_score_as_player2 = matches_as_player2.aggregate(Max('score_player2'))['score_player2__max'] or 0 best_score = max(best_score_as_player1, best_score_as_player2) @@ -166,33 +181,12 @@ def update_player_statistics(player_name): player.total_duration = total_duration player.m_duration = m_duration # player.num_participated_tournaments = total_tourn_p - #player.num_won_tournaments = total_win_tourn + #player.num_won_tournaments = total_win_tourn player.save() + logger.info(f"Statistics updated for player: {player_name}") def get_player_p_win(player_name): + logger.debug(f"Getting win percentage for player: {player_name}") player = get_object_or_404(Player, name=player_name) return player.p_win - -def create_tournament(name, nbr_player): - print("tournoi created!!!") - tournoi=Tournoi(name=name, nbr_player=nbr_player, winner=None) - tournoi.save() - print(f"tournoi name : {tournoi.name} *******!*!*!*!**!*!**!*!*!*!*!*!*!*!*!*") - return tournoi - -def update_tournament(name_tournoi, winner_name): - tournoi = get_object_or_404(Tournoi, name=name_tournoi) - winner_p = get_object_or_404(Player, name=winner_name) - print(f"in update tourna - tournoi name : {tournoi.name} *******!*!*!*!**!*!**!*!*!*!*!*!*!*!*!*") - print(f"in update tourna - winner is : {winner_p.name} *******!*!*!*!**!*!**!*!*!*!*!*!*!*!*!*") - - tournoi.winner = winner_p - print(f"in update tourna - TOURNOI winner is : {tournoi.winner.name} *******!*!*!*!**!*!**!*!*!*!*!*!*!*!*!*") - tournoi.save() - - - - -def getlen(): - return Tournoi.objects.count() diff --git a/pong/game/views.py b/pong/game/views.py index 304cf1d..22d057a 100644 --- a/pong/game/views.py +++ b/pong/game/views.py @@ -9,65 +9,111 @@ from django.contrib.auth.models import User from django.contrib.auth import authenticate from django.views.decorators.csrf import csrf_exempt from rest_framework import viewsets +from django.db import transaction, IntegrityError import json import uuid +import logging + +logger = logging.getLogger(__name__) def index(request): + logger.info("Accessing index view") return render(request, 'index.html') @csrf_exempt def check_user_exists(request): if request.method == 'POST': + logger.info("POST request received for checking user existence") data = json.loads(request.body) username = data.get('username') if User.objects.filter(username=username).exists(): + logger.info(f"User {username} exists") return JsonResponse({'exists': True}) + logger.info(f"User {username} does not exist") return JsonResponse({'exists': False}) + logger.warning("Invalid request method for check_user_exists") return JsonResponse({'error': 'Invalid request method'}, status=400) @csrf_exempt def register_user(request): - if request.method == 'POST': - data = json.loads(request.body) - username = data.get('username') - password = data.get('password') - if not User.objects.filter(username=username).exists(): - user = User.objects.create_user(username=username, password=password) - token = get_or_create_token(user) - return JsonResponse({'registered': True, 'token': token}) - return JsonResponse({'registered': False, 'error': 'User already exists'}) - return JsonResponse({'error': 'Invalid request method'}, status=400) - -@csrf_exempt -def authenticate_user(request): if request.method == 'POST': try: + logger.info("Received POST request for user registration") data = json.loads(request.body) - username = data.get('username', '') - password = data.get('password', '') - user = authenticate(username=username, password=password) - if user is not None: + username = data.get('username') + password = data.get('password') + + logger.info(f"Attempting to register user: {username}") + + if not username or not password: + logger.warning("Username or password not provided") + return JsonResponse({'registered': False, 'error': 'Username and password are required'}, status=400) + + with transaction.atomic(): + user_exists = User.objects.select_for_update().filter(username=username).exists() + + if user_exists: + logger.warning(f"User {username} already exists") + return JsonResponse({'registered': False, 'error': 'User already exists'}, status=409) + + user = User.objects.create_user(username=username, password=password) token = get_or_create_token(user) - return JsonResponse({'authenticated': True, 'token': token, 'user_id': user.id}) - else: - return JsonResponse({'authenticated': False}, status=401) + logger.info(f"User {username} registered successfully") + return JsonResponse({'registered': True, 'token': token}) + + except json.JSONDecodeError as e: + logger.error(f"JSON decode error: {str(e)}") + return JsonResponse({'error': 'Invalid JSON data'}, status=400) + + except IntegrityError: + logger.error(f"IntegrityError: User {username} already exists") + return JsonResponse({'registered': False, 'error': 'User already exists'}, status=409) + except Exception as e: - return JsonResponse({'error': str(e)}, status=500) - else: - return JsonResponse({'error': 'Method not allowed'}, status=405) + logger.error(f"Error in register_user: {str(e)}") + return JsonResponse({'error': f'Internal Server Error: {str(e)}'}, status=500) + + logger.warning("Invalid request method for register_user") + return JsonResponse({'error': 'Invalid request method'}, status=405) def get_or_create_token(user): + logger.info(f"Generating or retrieving token for user: {user.username}") if not user.auth_token: while True: token = str(uuid.uuid4()) if not User.objects.filter(auth_token=token).exists(): user.auth_token = token user.save() + logger.info(f"Token generated for user {user.username}: {token}") break return user.auth_token +@csrf_exempt +def authenticate_user(request): + if request.method == 'POST': + try: + logger.info("Received POST request for user authentication") + data = json.loads(request.body) + username = data.get('username', '') + password = data.get('password', '') + user = authenticate(username=username, password=password) + if user is not None: + token = get_or_create_token(user) + logger.info(f"User {username} authenticated successfully") + return JsonResponse({'authenticated': True, 'token': token, 'user_id': user.id}) + else: + logger.warning(f"Authentication failed for user {username}") + return JsonResponse({'authenticated': False}, status=401) + except Exception as e: + logger.error(f"Error in authenticate_user: {str(e)}") + return JsonResponse({'error': str(e)}, status=500) + else: + logger.warning("Invalid request method for authenticate_user") + return JsonResponse({'error': 'Method not allowed'}, status=405) + def match_list_json(request): + logger.info("Fetching match list") matches = Match.objects.all() data = { 'matches': list(matches.values( @@ -76,11 +122,13 @@ def match_list_json(request): 'is_tournoi', 'tournoi__name' )) } + logger.info(f"Match list fetched successfully: {len(data['matches'])} matches found") return JsonResponse(data) def player_list_json(request): + logger.info("Fetching player list") players = Player.objects.all() - + data = { 'players': list(players.values( 'id', 'name', 'total_match', 'total_win', 'p_win', @@ -89,25 +137,30 @@ def player_list_json(request): 'num_participated_tournaments', 'num_won_tournaments' )) } + logger.info(f"Player list fetched successfully: {len(data['players'])} players found") return JsonResponse(data) -def get_tournoi_data(tournoi): - return { - "id": tournoi.id, - "name": tournoi.name, - "nbr_player": tournoi.nbr_player, - "date": tournoi.date, - "winner": { - "id": tournoi.winner.id, - "name": tournoi.winner.name - } if tournoi.winner else None +def tournoi_list_json(request): + logger.info("Fetching tournoi list") + tournois = Tournoi.objects.all() + + data = { + 'tournois': list(tournois.values( + 'id', 'name', 'nbr_player', 'date', 'winner' + )) } + logger.info(f"Tournoi list fetched successfully: {len(data['tournois'])} tournois found") + return JsonResponse(data) def tournoi_list_json(request): - tournois = Tournoi.objects.select_related('winner').all() # Charge les données du gagnant - tournois_data = [get_tournoi_data(tournoi) for tournoi in tournois] - return JsonResponse({"tournois": tournois_data}) + tournois = Tournoi.objects.all() + data = { + 'tournois': list(tournois.values( + 'id', 'name', 'nbr_player', 'date', 'winner' + )) + } + return JsonResponse(data) from web3 import Web3 @@ -145,7 +198,7 @@ def read_data(request): # print(f"Final Order: {', '.join(tournament[5])}") print("-----------------------------") return JsonResponse(json_data, safe=False) - + def write_data(request): # addTournament(string,uint256,uint256,string[],string[]) @@ -173,4 +226,3 @@ def write_data(request): # tx_receipt = web3.eth.wait_for_transaction_receipt(tx_hash) # print("Transaction receipt:", tx_receipt) print("-----------------------------") - diff --git a/pong/settings.py b/pong/settings.py index 446ec08..af52863 100644 --- a/pong/settings.py +++ b/pong/settings.py @@ -29,43 +29,43 @@ ALLOWED_HOSTS = ['*'] # Application definition INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'channels', - 'pong.game', - 'rest_framework' + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'channels', + 'pong.game', + 'rest_framework' ] MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'pong.urls' TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'pong', 'static')], # Ensure templates are found - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, 'pong', 'static')], # Ensure templates are found + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, ] ASGI_APPLICATION = 'pong.asgi.application' @@ -74,32 +74,32 @@ ASGI_APPLICATION = 'pong.asgi.application' # https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': os.getenv('DB_NAME'), - 'USER': os.getenv('DB_USER'), - 'PASSWORD': os.getenv('DB_PASSWORD'), - 'HOST': os.getenv('DB_HOST'), - 'PORT': '5432', - } + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': os.getenv('DB_NAME'), + 'USER': os.getenv('DB_USER'), + 'PASSWORD': os.getenv('DB_PASSWORD'), + 'HOST': os.getenv('DB_HOST'), + 'PORT': '5432', + } } # Password validation # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, ] # Internationalization @@ -115,10 +115,6 @@ USE_L10N = True USE_TZ = True - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/3.2/howto/static-files/ - STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'pong/static')] STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') @@ -130,43 +126,87 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # Channels # Define the channel layers for WebSockets +# Define the channel layers for WebSockets CHANNEL_LAYERS = { - 'default': { - 'BACKEND': 'channels.layers.InMemoryChannelLayer', - }, + 'default': { + 'BACKEND': 'channels.layers.InMemoryChannelLayer', + }, } -'''LOGGING = { - 'version': 1, # The version of the logging configuration schema - 'disable_existing_loggers': False, # Allows existing loggers to keep logging - 'formatters': { # Defines how log messages will be formatted - 'json': { - '()': 'pythonjsonlogger.jsonlogger.JsonFormatter', - # Formatter that outputs logs in JSON format, which is ideal for ingestion by Logstash. - }, - 'default': { - 'format': '[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s', - # This is a basic text formatter with timestamp, log level, logger name, line number, and the actual message. - }, - }, - 'handlers': { # Handlers determine where the log messages are sent - 'file': { - 'level': 'INFO', # Minimum log level to be handled (INFO and above) - 'class': 'logging.FileHandler', - 'filename': os.path.join(BASE_DIR, 'logs/django.log'), # The file where logs will be saved - 'formatter': 'json', # Uses the JSON formatter defined above - }, - 'console': { - 'level': 'DEBUG', # Minimum log level to be handled (DEBUG and above) - 'class': 'logging.StreamHandler', - 'formatter': 'default', # Uses the default text formatter - }, - }, - 'loggers': { # Loggers are the actual log streams that get configured - 'django': { # The Django logger catches all messages sent by the Django framework - 'handlers': ['file', 'console'], # Sends logs to both the file and the console - 'level': 'DEBUG', # Minimum log level to be logged - 'propagate': True, # If True, messages will be passed to the parent loggers as well - }, - }, -}''' +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'json': { + '()': 'pythonjsonlogger.jsonlogger.JsonFormatter', + 'format': '%(asctime)s %(levelname)s %(name)s %(module)s %(process)d %(thread)d %(message)s', + }, + 'default': { + 'format': '[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s', + }, + 'verbose': { + 'format': '[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s [%(process)d:%(thread)d]', + }, + 'simple': { + 'format': '%(levelname)s %(message)s', + }, + }, + 'filters': { + 'require_debug_true': { + '()': 'django.utils.log.RequireDebugTrue', + }, + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse', + }, + }, + 'handlers': { + 'file': { + 'level': 'INFO', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(BASE_DIR, 'logs/django.log'), + 'formatter': 'json', + 'maxBytes': 1024 * 1024 * 5, # 5 MB + 'backupCount': 5, + }, + 'error_file': { + 'level': 'ERROR', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(BASE_DIR, 'logs/django_errors.log'), + 'formatter': 'json', + 'maxBytes': 1024 * 1024 * 5, # 5 MB + 'backupCount': 5, + }, + 'console': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'verbose', + 'filters': ['require_debug_true'], + }, + 'mail_admins': { + 'level': 'ERROR', + 'class': 'django.utils.log.AdminEmailHandler', + 'filters': ['require_debug_false'], + }, + }, + 'loggers': { + 'django': { + 'handlers': ['file', 'console', 'mail_admins'], + 'level': 'DEBUG', + 'propagate': True, + }, + 'django.request': { + 'handlers': ['error_file', 'mail_admins'], + 'level': 'ERROR', + 'propagate': False, + }, + 'django.security': { + 'handlers': ['error_file', 'mail_admins'], + 'level': 'ERROR', + 'propagate': False, + }, + }, + 'root': { + 'handlers': ['console', 'file'], + 'level': 'INFO', + }, +} diff --git a/pong/static/burger.js b/pong/static/burger.js index ca45088..a98343c 100644 --- a/pong/static/burger.js +++ b/pong/static/burger.js @@ -103,7 +103,6 @@ document.addEventListener('DOMContentLoaded', () => { console.log('Displaying matches:'); const matchListBody = document.querySelector('#match-list tbody'); matchListBody.innerHTML = ''; - if (matches.length != 0) { matches.forEach(match => { @@ -125,7 +124,6 @@ document.addEventListener('DOMContentLoaded', () => { matchListBody.appendChild(row); }); } else { - const row = document.createElement('tr'); row.innerHTML = ` No matches found. `; @@ -137,7 +135,6 @@ document.addEventListener('DOMContentLoaded', () => { console.log('Displaying players:'); const playersListBody = document.querySelector('#player-list tbody'); playersListBody.innerHTML = ''; - if (players.length != 0) { players.forEach(player => { @@ -160,9 +157,8 @@ document.addEventListener('DOMContentLoaded', () => { playersListBody.appendChild(row); }); } else { - const row = document.createElement('tr'); row.innerHTML = ` - No player found. + No matches found. ` playersListBody.appendChild(row); } @@ -175,22 +171,19 @@ document.addEventListener('DOMContentLoaded', () => { if (tournois.length != 0) { tournois.forEach(tournoi => { - console.log('Winner:', tournoi.winner); //debug !!!!!!!!!!!!!!!!! - console.log('Winner:', tournoi.winner__name); //debug !!!!!!!!!!!!!!!!! const row = document.createElement('tr'); row.innerHTML = ` ${tournoi.id} ${tournoi.name} ${tournoi.nbr_player} ${tournoi.date} - ${tournoi.winner ? tournoi.winner.name : 'No one yet ...'} + ${tournoi.winner.name} `; tournoisListBody.appendChild(row); }); } else { - const row = document.createElement('tr'); row.innerHTML = ` - No tournoi found. + No matches found. ` tournoisListBody.appendChild(row); } diff --git a/pong/static/flags/de.svg b/pong/static/flags/de.svg old mode 100755 new mode 100644 diff --git a/pong/static/flags/es.svg b/pong/static/flags/es.svg old mode 100755 new mode 100644 diff --git a/pong/static/flags/fr.svg b/pong/static/flags/fr.svg old mode 100755 new mode 100644 diff --git a/pong/static/flags/it.svg b/pong/static/flags/it.svg old mode 100755 new mode 100644 diff --git a/pong/static/flags/us.svg b/pong/static/flags/us.svg old mode 100755 new mode 100644 diff --git a/pong/static/game.js b/pong/static/game.js index b5a0b9d..20d291b 100644 --- a/pong/static/game.js +++ b/pong/static/game.js @@ -1,73 +1,91 @@ document.addEventListener('DOMContentLoaded', () => { - const formBlock = document.getElementById('block-form'); + console.log("DOM fully loaded and parsed"); + const formBlock = document.getElementById('block-form'); - const authForm = document.getElementById('auth-form'); - const nicknameInput = document.getElementById('nickname'); - const checkNicknameButton = document.getElementById('check-nickname'); + const authForm = document.getElementById('auth-form'); + const nicknameInput = document.getElementById('nickname'); + const checkNicknameButton = document.getElementById('check-nickname'); - const registerForm = document.getElementById('register-form'); - const passwordInput = document.getElementById('password'); - const confirmPasswordInput = document.getElementById('confirm-password'); - const registerButton = document.getElementById('register'); + const registerForm = document.getElementById('register-form'); + const passwordInput = document.getElementById('password'); + const confirmPasswordInput = document.getElementById('confirm-password'); + const registerButton = document.getElementById('register'); - const loginForm = document.getElementById('login-form'); - const loginPasswordInput = document.getElementById('login-password'); - const loginButton = document.getElementById('login'); + const loginForm = document.getElementById('login-form'); + const loginPasswordInput = document.getElementById('login-password'); + const loginButton = document.getElementById('login'); - const authForm2 = document.getElementById('auth-form2'); - const nicknameInput2 = document.getElementById('nickname2'); - const checkNicknameButton2 = document.getElementById('check-nickname2'); + const authForm2 = document.getElementById('auth-form2'); + const nicknameInput2 = document.getElementById('nickname2'); + const checkNicknameButton2 = document.getElementById('check-nickname2'); - const registerForm2 = document.getElementById('register-form2'); - const passwordInput2 = document.getElementById('password2'); - const confirmPasswordInput2 = document.getElementById('confirm-password2'); - const registerButton2 = document.getElementById('register2'); + const registerForm2 = document.getElementById('register-form2'); + const passwordInput2 = document.getElementById('password2'); + const confirmPasswordInput2 = document.getElementById('confirm-password2'); + const registerButton2 = document.getElementById('register2'); - const loginForm2 = document.getElementById('login-form2'); - const loginPasswordInput2 = document.getElementById('login-password2'); - const loginButton2 = document.getElementById('login2'); + const loginForm2 = document.getElementById('login-form2'); + const loginPasswordInput2 = document.getElementById('login-password2'); + const loginButton2 = document.getElementById('login2'); - const gameContainer = document.getElementById('game1'); - const tournamentContainer = document.getElementById('tournament-bracket'); + const gameContainer = document.getElementById('game1'); + const tournamentContainer = document.getElementById('tournament-bracket'); - const pongElements = document.getElementById('pong-elements'); - const logo = document.querySelector('.logo'); + const pongElements = document.getElementById('pong-elements'); + const logo = document.querySelector('.logo'); - const postFormButtons = document.getElementById('post-form-buttons'); - const localGameButton = document.getElementById('local-game'); - const quickMatchButton = document.getElementById('quick-match'); - const tournamentButton = document.getElementById('tournament'); + const localGameButton = document.getElementById('local-game'); + const quickMatchButton = document.getElementById('quick-match'); + const tournamentButton = document.getElementById('tournament'); - let socket; - let token; - let gameState; - let saveData = null; + 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 - // Auto-focus and key handling for AUTH-FORM - nicknameInput.focus(); - nicknameInput.addEventListener('keypress', function (event) { - if (event.key === 'Enter') { - event.preventDefault(); - checkNicknameButton.click(); - } - }); + console.log("DOM elements initialized"); - checkNicknameButton.addEventListener('click', handleCheckNickname); - registerButton.addEventListener('click', handleRegister); - loginButton.addEventListener('click', handleLogin); + // Auto-focus and key handling for AUTH-FORM + nicknameInput.focus(); + nicknameInput.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + handleCheckNickname(); // Appeler directement la fonction au lieu de simuler un clic + } + }); - checkNicknameButton2.addEventListener('click', handleCheckNickname2); - registerButton2.addEventListener('click', handleRegister2); - loginButton2.addEventListener('click', handleLogin2); + checkNicknameButton.addEventListener('click', handleCheckNickname); + registerButton.addEventListener('click', handleRegister); + loginButton.addEventListener('click', handleLogin); - localGameButton.addEventListener('click', startLocalGame); - quickMatchButton.addEventListener('click', startQuickMatch); - tournamentButton.addEventListener('click', startTournament); + checkNicknameButton2.addEventListener('click', handleCheckNickname2); + registerButton2.addEventListener('click', handleRegister2); + loginButton2.addEventListener('click', handleLogin2); - async function handleCheckNickname() { + localGameButton.addEventListener('click', startLocalGame); + quickMatchButton.addEventListener('click', startQuickMatch); + tournamentButton.addEventListener('click', startTournament); + + console.log("Event listeners added"); + + // Function to get the CSRF token from cookies + function getCSRFToken() { + let csrfToken = null; + const cookies = document.cookie.split(';'); + cookies.forEach(cookie => { + const [name, value] = cookie.trim().split('='); + if (name === 'csrftoken') { + csrfToken = value; + } + }); + return csrfToken; + } + + async function handleCheckNickname() { const nickname = nicknameInput.value.trim(); if (nickname) { - window.firstPlayerName = nickname; try { const exists = await checkUserExists(nickname); if (exists) { @@ -104,421 +122,874 @@ document.addEventListener('DOMContentLoaded', () => { } } - async function checkUserExists(username) { - const response = await fetch('/check_user_exists/', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ username }) - }); - const data = await response.json(); - return data.exists; - } + async function handleRegister() { + console.log("handleRegister called"); + const nickname = nicknameInput.value.trim(); + const password = passwordInput.value.trim(); + const confirmPassword = confirmPasswordInput.value.trim(); - async function handleRegister() { - 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; + } - if (password === confirmPassword) { - try { - const result = await registerUser(nickname, password); - if (result) { - registerForm.style.display = 'none'; - document.getElementById("post-form-buttons").style.display = 'block'; - } else { - alert('Registration failed. Please try again.'); - } - } catch (error) { - console.error('Error registering user:', error); - } - } else { - alert('Passwords do not match.'); - } - } + // Validation des mots de passe + if (password !== confirmPassword) { + alert('Passwords do not match.'); + console.error('Passwords do not match.'); + return; + } - async function registerUser(username, password) { - const response = await fetch('/register_user/', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ username, password }) - }); - const data = await response.json(); - if (data.registered) { - token = data.token; - } - return data.registered; - } + // Tentative d'inscription + try { + console.log("Attempting to register user:", nickname); + const result = await registerUser(nickname, password); - async function handleLogin() { - const nickname = nicknameInput.value.trim(); - const password = loginPasswordInput.value.trim(); - try { - const result = await authenticateUser(nickname, password); - if (result) { - loginForm.style.display = 'none'; - document.getElementById("post-form-buttons").style.display = 'block'; - } else { - alert('Authentication failed. Please try again.'); - } - } catch (error) { - console.error('Error authenticating user:', error); - } - } + // 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"); - async function authenticateUser(username, password) { - const response = await fetch('/authenticate_user/', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ username, password }) - }); - const data = await response.json(); - if (data.authenticated) { - token = data.token; - } - return data.authenticated; - } + // 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 - async function handleCheckNickname2() { - const nickname2 = nicknameInput2.value.trim(); - if (nickname2) { - try { - const exists = await checkUserExists2(nickname2); - if (exists) { - authForm2.style.display = 'none'; - loginForm2.style.display = 'block'; - loginPasswordInput2.focus(); - loginPasswordInput2.addEventListener('keypress', function (event) { - if (event.key === 'Enter') { - event.preventDefault(); - loginButton2.click(); - } - }); - } else { - authForm2.style.display = 'none'; - registerForm2.style.display = 'block'; - passwordInput2.focus(); - passwordInput2.addEventListener('keypress', function (event) { - if (event.key === 'Enter') { - confirmPasswordInput2.focus(); - confirmPasswordInput2.addEventListener('keypress', function (event) { - if (event.key === 'Enter') { - event.preventDefault(); - registerButton2.click(); - } - }); - } - }); - } - } catch (error) { - console.error('Error checking user existence:', error); - } - } else { - alert('Please enter a nickname.'); - } - } + // Définir le nom de la room principale + roomName = "main_room"; - async function checkUserExists2(username) { - const response = await fetch('/check_user_exists/', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ username }) - }); - const data = await response.json(); - return data.exists; - } + // 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 + } else { + console.error("Token or roomName is undefined. Cannot join room."); + alert("Error joining the chat room. Please try again."); + } - async function handleRegister2() { - const nickname2 = nicknameInput2.value.trim(); - const password2 = passwordInput2.value.trim(); - const confirmPassword2 = confirmPasswordInput2.value.trim(); + } else { + console.error('Registration failed. Invalid response from server.'); + alert('Registration failed. Please try again.'); + } - if (password2 === confirmPassword2) { - try { - const result = await registerUser2(nickname2, password2); - if (result) { - registerForm2.style.display = 'none'; - startLocalGame2(); - } else { - alert('Registration failed. Please try again.'); - } - } catch (error) { - console.error('Error registering user:', error); - } - } else { - alert('Passwords do not match.'); - } - } + } catch (error) { + console.error('Error registering user:', error); + alert('An error occurred during registration. Please try again.'); + } + } - async function registerUser2(username, password) { - const response = await fetch('/register_user/', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ username, password }) - }); - const data = await response.json(); - if (data.registered) { - token2 = data.token; - } - return data.registered; - } - async function handleLogin2() { - const nickname2 = nicknameInput2.value.trim(); - const password2 = loginPasswordInput2.value.trim(); - try { - const result = await authenticateUser2(nickname2, password2); - if (result) { - loginForm2.style.display = 'none'; - startLocalGame2(); - } else { - alert('Authentication failed. Please try again.'); - } - } catch (error) { - console.error('Error authenticating user:', error); - } - } + async function checkUserExists(username) { + console.log("checkUserExists called with username:", username); + try { + const response = await fetch('/check_user_exists/', { + method: 'POST', + headers: { + 'X-CSRFToken': getCSRFToken(), + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username }) + }); - async function authenticateUser2(username, password) { - const response = await fetch('/authenticate_user/', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ username, password }) - }); - const data = await response.json(); - if (data.authenticated) { - token2 = data.token; - } - return data.authenticated; - } + if (!response.ok) { + console.error(`HTTP error! Status: ${response.status}`); + return false; + } - function startLocalGame() { - console.log("starting a Local Game.."); - document.getElementById("post-form-buttons").style.display = 'none'; - authForm2.style.display = 'block'; - nicknameInput2.focus(); - nicknameInput2.addEventListener('keypress', function (event) { - if (event.key === 'Enter') { - event.preventDefault(); - checkNicknameButton2.click(); - } - }); - } + const data = await response.json(); + console.log("User existence check response:", data); + return data.exists; + } catch (error) { + console.error('Error during user existence check:', error); + return false; + } + } - function startLocalGame2() { - nickname = nicknameInput.value.trim(); - nickname2 = nicknameInput2.value.trim(); - saveData = { - type: 'local', - player1_name: nickname, - player2_name: nickname2 - }; - gameContainer.style.display = 'flex'; - logo.style.display = 'none'; - pongElements.style.display = 'none'; - formBlock.style.display = 'none'; - startWebSocketConnection(token, 2); - } + async function handleRegister() { + console.log("handleRegister called"); + const nickname = nicknameInput.value.trim(); + const password = passwordInput.value.trim(); + const confirmPassword = confirmPasswordInput.value.trim(); - function startQuickMatch() { - saveData = { - type: 'quick' - } - gameContainer.style.display = 'flex'; - logo.style.display = 'none'; - pongElements.style.display = 'none'; - formBlock.style.display = 'none'; - document.getElementById('player1-name').textContent = "player 1"; - document.getElementById('player2-name').textContent = "player 2"; - document.getElementById('game-text').textContent = ""; - document.getElementById('player1-score').textContent = 0; - document.getElementById('player2-score').textContent = 0; + 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; + } + + if (password === confirmPassword) { + try { + console.log("Attempting to register user:", nickname); + const result = await registerUser(nickname, password); + if (result) { + token = result; // Assurez-vous que le token est bien stocké ici + console.log("Token stored:", token); + 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 + } else { + console.error('Registration failed.'); + alert('Registration failed. Please try again.'); + } + } catch (error) { + console.error('Error registering user:', error); + } + } else { + alert('Passwords do not match.'); + console.error('Passwords do not match.'); + } + } + + async function registerUser(username, password) { + console.log("registerUser called with username:", username); + try { + const response = await fetch('/register_user/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username, password }) + }); + + if (!response.ok) { + console.error(`HTTP error! Status: ${response.status}`); + return null; // Retournez null en cas d'erreur HTTP + } + + let data; + try { + data = await response.json(); + } catch (error) { + console.error('Invalid JSON response:', error); + return null; + } + + console.log("Registration response data:", data); + if (data.registered) { + console.log('User registered successfully:', data); + return data.token; + } else { + console.error('Registration failed:', data.error); + return null; // Retournez null si l'enregistrement échoue + } + } catch (error) { + console.error('Error during registration request:', error); + return null; + } + } + + async function handleLogin() { + console.log("handleLogin called"); + const nickname = nicknameInput.value.trim(); + const password = loginPasswordInput.value.trim(); + try { + console.log("Attempting to authenticate user:", nickname); + const result = await authenticateUser(nickname, password); + if (result) { + console.log("User authenticated successfully"); + loginForm.style.display = 'none'; + document.getElementById("post-form-buttons").style.display = 'block'; + } else { + console.error('Authentication failed.'); + alert('Authentication failed. Please try again.'); + } + } catch (error) { + console.error('Error authenticating user:', error); + } + } + + async function authenticateUser(username, password) { + console.log("authenticateUser called with username:", username); + try { + const response = await fetch('/authenticate_user/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username, password }) + }); + + if (!response.ok) { + console.error(`HTTP error! Status: ${response.status}`); + return false; + } + + const data = await response.json(); + console.log("Authentication response data:", data); + if (data.authenticated) { + token = data.token; + } + return data.authenticated; + } catch (error) { + console.error('Error during authentication request:', error); + return false; + } + } + + + async function handleCheckNickname2() { + const nickname2 = nicknameInput2.value.trim(); + if (nickname2) { + try { + const exists = await checkUserExists2(nickname2); + if (exists) { + authForm2.style.display = 'none'; + loginForm2.style.display = 'block'; + loginPasswordInput2.focus(); + loginPasswordInput2.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + loginButton2.click(); + } + }); + } else { + authForm2.style.display = 'none'; + registerForm2.style.display = 'block'; + passwordInput2.focus(); + passwordInput2.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + confirmPasswordInput2.focus(); + confirmPasswordInput2.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + registerButton2.click(); + } + }); + } + }); + } + } catch (error) { + console.error('Error checking user existence:', error); + } + } else { + alert('Please enter a nickname.'); + } + } + + async function checkUserExists2(username) { + console.log("checkUserExists2 called with username:", username); + try { + const response = await fetch('/check_user_exists/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username }) + }); + + if (!response.ok) { + console.error(`HTTP error! Status: ${response.status}`); + return false; + } + + const data = await response.json(); + console.log("User existence check response (checkUserExists2):", data); + return data.exists; + } catch (error) { + console.error('Error during user existence check (checkUserExists2):', error); + return false; + } + } + + async function handleRegister2() { + console.log("handleRegister2 called"); + const nickname2 = nicknameInput2.value.trim(); + const password2 = passwordInput2.value.trim(); + const confirmPassword2 = confirmPasswordInput2.value.trim(); + + if (!nickname2 || nickname2.length < 3) { + console.error("Invalid username (handleRegister2). It must be at least 3 characters long."); + alert("Invalid username. It must be at least 3 characters long."); + return; + } + + if (password2 === confirmPassword2) { + try { + console.log("Attempting to register user (handleRegister2):", nickname2); + const result = await registerUser2(nickname2, password2); + if (result) { + console.log("User registered successfully (handleRegister2)"); + registerForm2.style.display = 'none'; + startLocalGame2(); + } else { + console.error('Registration failed (handleRegister2).'); + alert('Registration failed. Please try again.'); + } + } catch (error) { + console.error('Error registering user (handleRegister2):', error); + } + } else { + alert('Passwords do not match.'); + console.error('Passwords do not match (handleRegister2).'); + } + } + + async function registerUser2(username, password) { + console.log("registerUser2 called with username:", username); + try { + const response = await fetch('/register_user/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username, password }) + }); + + if (!response.ok) { + console.error(`HTTP error (registerUser2)! Status: ${response.status}`); + return null; + } + + let data; + try { + data = await response.json(); + } catch (error) { + console.error('Invalid JSON response (registerUser2):', error); + return null; + } + + console.log("Registration response data (registerUser2):", data); + if (data.registered) { + console.log('User registered successfully (registerUser2):', data); + return data.token; + } else { + console.error('Registration failed (registerUser2):', data.error); + return null; + } + } catch (error) { + console.error('Error during registration request (registerUser2):', error); + return null; + } + } + + async function handleLogin2() { + console.log("handleLogin2 called"); + const nickname2 = nicknameInput2.value.trim(); + const password2 = loginPasswordInput2.value.trim(); + try { + console.log("Attempting to authenticate user (handleLogin2):", nickname2); + const result = await authenticateUser2(nickname2, password2); + if (result) { + console.log("User authenticated successfully (handleLogin2)"); + loginForm2.style.display = 'none'; + startLocalGame2(); + } else { + console.error('Authentication failed (handleLogin2).'); + alert('Authentication failed. Please try again.'); + } + } catch (error) { + console.error('Error authenticating user (handleLogin2):', error); + } + } + + async function authenticateUser2(username, password) { + console.log("authenticateUser2 called with username:", username); + try { + const response = await fetch('/authenticate_user/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username, password }) + }); + + if (!response.ok) { + console.error(`HTTP error (authenticateUser2)! Status: ${response.status}`); + return false; + } + + const data = await response.json(); + console.log("Authentication response data (authenticateUser2):", data); + if (data.authenticated) { + token2 = data.token; + } + return data.authenticated; + } catch (error) { + console.error('Error during authentication request (authenticateUser2):', error); + return false; + } + } + + function startLocalGame() { + console.log("Starting a Local Game..."); + + document.getElementById("post-form-buttons").style.display = 'none'; + console.log("Hid post-form-buttons."); + + authForm2.style.display = 'block'; + console.log("Displayed authForm2."); + + nicknameInput2.focus(); + console.log("Focused on nicknameInput2."); + + nicknameInput2.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + console.log("Enter key pressed on nicknameInput2."); + checkNicknameButton2.click(); + } + }); + } + + function startLocalGame2() { + console.log("Starting the local game (2 players)..."); + + // Display the game container + gameContainer.style.display = 'flex'; + console.log("Game container set to 'flex'"); + + // Hide the logo, pong elements, and form block + logo.style.display = 'none'; + console.log("Logo hidden"); + + pongElements.style.display = 'none'; + console.log("Pong elements hidden"); + + formBlock.style.display = 'none'; + console.log("Form block hidden"); + + // Log the token before starting the WebSocket connection + console.log("Token before WebSocket authentication:", token); + + // Check if token is defined + if (!token) { + console.error("Token is not defined or is null."); + return; + } + + // Start the WebSocket connection + startWebSocketConnection(token, 2); + console.log("WebSocket connection initiated for a local game."); + } + + function startQuickMatch() { + // Masquer les éléments inutiles et afficher le conteneur de jeu + gameContainer.style.display = 'flex'; + logo.style.display = 'none'; + pongElements.style.display = 'none'; + formBlock.style.display = 'none'; + + // Log pour vérifier le token avant l'authentification WebSocket + console.log("Token before WebSocket authentication:", token); + + if (!token) { + console.error("Token is not defined or is null. WebSocket connection aborted."); + return; + } + + // Vérification si une connexion WebSocket est déjà active avant d'initialiser + if (roomSockets["quick_match"] && roomSockets["quick_match"].readyState === WebSocket.OPEN) { + console.warn("WebSocket for quick_match already open."); + return; + } + // Rejoindre la room "quick_match" + roomName = 'quick_match'; + joinRoom(token, roomName, username); + console.log("Starting WebSocket connection for quick match..."); + startWebSocketConnection(token, 1); // Le "1" pourrait être un identifiant pour le mode Quick Match + } - startWebSocketConnection(token, 1); - } function startTournament() { - saveData = { - type: 'tournoi' - } - tournamentContainer.style.display = 'flex'; - logo.style.display = 'none'; - pongElements.style.display = 'none'; - formBlock.style.display = 'none'; - startWebSocketConnection(token, 42); - } + // Masquer les éléments inutiles et afficher le conteneur du tournoi + tournamentContainer.style.display = 'flex'; + logo.style.display = 'none'; + pongElements.style.display = 'none'; + formBlock.style.display = 'none'; - function startWebSocketConnection(token, players) { - socket = new WebSocket(`ws://${window.location.host}/ws/game/`); + // Log pour vérifier le token avant l'authentification WebSocket + console.log("Token before WebSocket authentication:", token); - socket.onopen = function (event) { - console.log('WebSocket connection established'); - if (players === 1) { - console.log("Sending token for a quick match game"); - socket.send(JSON.stringify({ type: 'authenticate', token: token })); - } else if (players === 2) { - console.log("Sending tokens for a local game"); - socket.send(JSON.stringify({ type: 'authenticate2', token_1: token, token_2: token2 })); - } else { - console.log("Sending token for a tournament game") - socket.send(JSON.stringify({ type: 'authenticate3', token: token })); - } - }; + if (!token) { + console.error("Token is not defined or is null. WebSocket connection aborted."); + return; + } - socket.onmessage = function (event) { - const data = JSON.parse(event.data); - if (data.type === 'authenticated') { - console.log('Authentication successful'); - } else if (data.type === 'waiting_room') { - console.log('Entered the WAITING ROOM'); - } else if (data.type === 'game_start') { - console.log('Game started:', data.game_id, '(', data.player1, 'vs', data.player2, ')'); - gameContainer.style.display = 'flex'; - document.addEventListener('keydown', handleKeyDown); - } else if (data.type === 'game_state_update') { - updateGameState(data.game_state); - } else if (data.type === 'game_text_update') { - updateGameText(data.game_text); - } else if (data.type === 'player_disconnected') { - console.log('Player disconnected:', data.player); - } else if (data.type === 'game_ended') { - console.log('Game ended:', data.game_id); - } else if (data.type === 'error') { - console.error(data.message); - } else if (data.type === 'update_tournament_waiting_room') { - // Update the HTML content of the tournament bracket - document.getElementById('tournament-bracket').innerHTML = data.html; - // Reattach the event listener to the "Start Tournament" button - const startButton = document.getElementById('start-tournament-btn'); - if (startButton) { - startButton.addEventListener('click', function() { - if (typeof socket !== 'undefined' && socket.readyState === WebSocket.OPEN) { - console.log('Start TOURNAMENT sent..'); - socket.send(JSON.stringify({type: 'start_tournament'})); - } else { - console.error('WebSocket is not open or undefined'); - } - }); - } - } else if (data.type === 'update_brackets') { - // Update the HTML content of the tournament bracket - document.getElementById('tournament-bracket').innerHTML = data.html; - } else if (data.type === 'tournament_end') { - console.log('Tournament ended, the winner is:', data.winner); - } else { - console.log('Message from server:', data.type, data.message); - } - }; + // Vérification si une connexion WebSocket est déjà active avant d'initialiser + if (roomSockets["tournament"] && roomSockets["tournament"].readyState === WebSocket.OPEN) { + console.warn("WebSocket for tournament already open."); + return; + } + // Rejoindre la room "tournament" + roomName = 'tournament'; + joinRoom(token, roomName, username); + console.log("Starting WebSocket connection for tournament..."); + startWebSocketConnection(token, 42); // Le "42" pourrait être un identifiant pour le mode tournoi + } - socket.onclose = function (event) { - console.log('WebSocket connection closed'); - }; - socket.onerror = function (error) { - console.error('WebSocket error:', error); - }; - } + function startWebSocketConnection(token, players) { + if (socket && socket.readyState === WebSocket.OPEN) { + console.warn('WebSocket connection already open.'); + return; + } + socket = new WebSocket(`ws://${window.location.host}/ws/game/`); - function handleKeyDown(event) { - if (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'w' || event.key === 's') { - sendKeyPress(event.key.toLowerCase()); - } - } + socket.onopen = function (event) { + console.log('WebSocket connection established'); + if (players === 1) { + console.log("Sending token for a quick match game"); + socket.send(JSON.stringify({ type: 'authenticate', token: token })); + } else if (players === 2) { + console.log("Sending tokens for a local game"); + socket.send(JSON.stringify({ type: 'authenticate2', token_1: token, token_2: token2 })); + } else { + console.log("Sending token for a tournament game"); + socket.send(JSON.stringify({ type: 'authenticate3', token: token })); + } + }; - function sendKeyPress(key) { - if (socket.readyState === WebSocket.OPEN) { - socket.send(JSON.stringify({ type: 'key_press', key })); - } - } + // Gestion des messages reçus + socket.onmessage = function (event) { + const data = JSON.parse(event.data); + if (data.type === 'authenticated') { + console.log('Authentication successful'); + } else if (data.type === 'waiting_room') { + console.log('Entered the WAITING ROOM'); + } else if (data.type === 'game_start') { + console.log('Game started:', data.game_id, '(', data.player1, 'vs', data.player2, ')'); + document.addEventListener('keydown', handleKeyDown); + } else if (data.type === 'game_state_update') { + updateGameState(data.game_state); + } else if (data.type === 'player_disconnected') { + console.log("Player disconnected:", data.player); + } else if (data.type === 'game_ended') { + console.log("Game ended:", data.game_id); + } else if (data.type === 'error') { + console.error(data.message); + } else if (data.type === 'update_waiting_room') { + document.getElementById('tournament-bracket').innerHTML = data.html; + } else { + console.log('Message from server:', data.type, data.message); + } + }; - function updateGameState(newState) { - gameState = newState; - renderGame(); - checkForWinner(); - } + // Gestion des fermetures de connexion + socket.onclose = function (event) { + console.log('WebSocket connection closed'); + }; - function renderGame() { - document.getElementById('player1-name').textContent = `${gameState.player1_name}`; - document.getElementById('player2-name').textContent = `${gameState.player2_name}`; + socket.onerror = function (error) { + console.error('WebSocket error:', error); + }; + } - document.getElementById('player1-pad').style.top = `${gameState.player1_position}px`; - document.getElementById('player2-pad').style.top = `${gameState.player2_position}px`; + // Gestion des événements de touche + function handleKeyDown(event) { + console.log("Key pressed:", event.key); + if (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'w' || event.key === 's') { + sendKeyPress(event.key.toLowerCase()); + } + } - document.getElementById('ball').style.left = `${gameState.ball_position.x}px`; - document.getElementById('ball').style.top = `${gameState.ball_position.y}px`; + function sendKeyPress(key) { + console.log("Sending key press:", key); + if (socket.readyState === WebSocket.OPEN) { + socket.send(JSON.stringify({ type: 'key_press', key })); + } else { + console.warn("WebSocket is not open. Key press not sent."); + } + } - document.getElementById('player1-score').textContent = gameState.player1_score; - document.getElementById('player2-score').textContent = gameState.player2_score; + // Fonction pour mettre à jour l'état du jeu + function updateGameState(newState) { + console.log("Updating game state..."); + gameState = newState; + renderGame(); + } - document.getElementById('game-text').textContent = gameState.game_text; - } + // Fonction pour rendre l'état du jeu à l'écran + function renderGame() { + console.log("Rendering game state..."); + document.getElementById('player1-name').textContent = `${gameState.player1_name}`; + document.getElementById('player2-name').textContent = `${gameState.player2_name}`; - function updateGameText(gameText) { - document.getElementById('game-text').textContent = gameText; - } + document.getElementById('player1-pad').style.top = `${gameState.player1_position}px`; + document.getElementById('player2-pad').style.top = `${gameState.player2_position}px`; - const starsContainer = document.getElementById('stars'); - for (let i = 0; i < 500; i++) { - const star = document.createElement('div'); - star.className = 'star'; - star.style.width = `${Math.random() * 3}px`; - star.style.height = star.style.width; - star.style.left = `${Math.random() * 100}%`; - star.style.top = `${Math.random() * 100}%`; - star.style.animationDuration = `${Math.random() * 2 + 1}s`; - starsContainer.appendChild(star); - } + document.getElementById('ball').style.left = `${gameState.ball_position.x}px`; + document.getElementById('ball').style.top = `${gameState.ball_position.y}px`; - const homeButton = document.getElementById('home'); - const replayButton = document.getElementById('retry'); - const gameControls = document.getElementById('game-controls'); + document.getElementById('player1-score').textContent = gameState.player1_score; + document.getElementById('player2-score').textContent = gameState.player2_score; - homeButton.addEventListener('click', () => { - gameContainer.style.display = 'none'; - gameControls.style.display = 'none'; + document.getElementById('game-text').textContent = gameState.game_text; + } - logo.style.display = 'block' + ////////////////////////////CHAT//////////////////////////////////// + class ChatInput { + constructor(roomName, username, chatSocket) { + this.roomName = roomName; + this.username = username.toLowerCase().trim(); // Normalisation du nom d'utilisateur + this.chatSocket = chatSocket; + 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}`); + 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..."); + this.sendMessage(); + } + }); + + // 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(); + }); + } + + 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() + console.log(`Detected block command for user: ${targetUser}`); + this.sendBlockCommand(targetUser); + } else if (message.startsWith('/i ')) { + const targetUser = message.slice(3).trim().toLowerCase(); + console.log(`Detected invite command for user: ${targetUser}`); + this.sendInviteCommand(targetUser); + } else { + console.log("Sending chat message to WebSocket..."); + this.chatSocket.send(JSON.stringify({ + 'type': 'chat_message', + 'message': message, + 'username': this.username, + 'room': this.roomName + })); + } + this.messageInput.value = ''; // Effacer le champ de saisie + console.log("Message input cleared."); + } else { + console.warn('Cannot send an empty message.'); + } + } + + sendBlockCommand(targetUser) { + console.log(`Sending block command to WebSocket for user: ${targetUser}`); + this.chatSocket.send(JSON.stringify({ + 'type': 'block_user', + 'target_user': targetUser, + 'username': this.username, + 'room': this.roomName + })); + } + + sendInviteCommand(targetUser) { + 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 + })); + } + } + + 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; + } - formBlock.style.display = 'block'; - postFormButtons.style.display = 'flex'; - - setupFirstPlayer(); - }); + 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}`); - function setupFirstPlayer() { - const firstPlayerName = window.firstPlayerName; - document.getElementById('player1-name').textContent = firstPlayerName; - } + const tabContainer = document.getElementById('room-tabs-container'); + if (!tabContainer) { + console.error('Room tabs container not found.'); + return; + } - replayButton.addEventListener('click', () => { - document.getElementById('player1-name').textContent = saveData.player1_name; - document.getElementById('player2-name').textContent = saveData.player2_name; - startLocalGame2(); - }); + 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 checkForWinner() { - if (gameState.player1_score === 3 || gameState.player2_score === 3) { - if (saveData.type != "tournoi"){ - gameControls.style.display = 'flex'; - homeButton.style.display = 'block'; - replayButton.style.display = 'none'; - console.log(saveData.type); - if (saveData.type === 'local'){ - replayButton.style.display = 'block'; - } - } - } - } + 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 aa89490..b762ee1 100644 --- a/pong/static/index.html +++ b/pong/static/index.html @@ -3,205 +3,279 @@ - - - Pong Game - - + + + Pong Game + + -
- Français - English - Italiano - Español - Deutsch -
-
-
-
-
-
-
-
-
+
+ Français + English + Italiano + Español + Deutsch +
+
+
+
+
+
+
+
+
- - + + -
-

BIENVENUE DANS LE PONG 42

-
-
- - - -
- - - - - - -
-
+
+

BIENVENUE DANS LE PONG 42

+
+
+ + + +
+ + + + + + +
+
- + - + - + - - - - - - - - - - - + + + + - - - + + + + + + + + + + + + +
+ +
+
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Main Room
+
Tournament
+
Quick Match
+
+
+ + + + + + - + \ No newline at end of file diff --git a/pong/static/styles.css b/pong/static/styles.css index 38d78f0..29e7fbd 100644 --- a/pong/static/styles.css +++ b/pong/static/styles.css @@ -1,472 +1,601 @@ /* General styles */ html { - font-family: Arial, sans-serif; - color: #00ffff; - background-color: #0a0a2a; - margin: 0; - padding: 0; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - overflow: auto; + font-family: Arial, sans-serif; + color: #00ffff; + background-color: #0a0a2a; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + overflow: auto; } label { - margin: 10px 0 5px; + margin: 10px 0 5px; } input { - padding: 10px; - margin: 5px 0 20px; - width: 200px; + padding: 10px; + margin: 5px 0 20px; + width: 200px; } button { - background-color: #00ffff; - color: #000033; - border: none; - padding: 1rem 2rem; - font-size: 1.5rem; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 10px; - margin-top: 1rem; - text-transform: uppercase; - letter-spacing: 2px; + background-color: #00ffff; + color: #000033; + border: none; + padding: 1rem 2rem; + font-size: 1.5rem; + cursor: pointer; + transition: all 0.3s ease; + border-radius: 10px; + margin-top: 1rem; + text-transform: uppercase; + letter-spacing: 2px; } button:hover { - background-color: #000033; - color: #00ffff; - box-shadow: 0 0 20px #00ffff; + background-color: #000033; + color: #00ffff; + box-shadow: 0 0 20px #00ffff; } #game1 { - width: 810px; - height: 500px; - position: relative; - background-color: #000; - border: 3px solid #00ffff; - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; - overflow: hidden; - display: flex; - justify-content: center; - align-items: center; + width: 810px; + height: 500px; + position: relative; + background-color: #000; + border: 3px solid #00ffff; + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; } .name { - font-size: 24px; - position: absolute; - top: 20px; + font-size: 24px; + position: absolute; + top: 20px; } #player1-name { - left: 10px; - /* Adjust player score position */ + left: 10px; + /* Adjust player score position */ } #player2-name { - right: 10px; - /* Adjust bot score position */ + right: 10px; + /* Adjust bot score position */ } #game2 { - top: 60px; - width: 800px; - height: 400px; - position: absolute; - background-color: #000; - overflow: hidden; - border: 2px solid white; - /* Add red border */ - display: flex; - justify-content: center; - align-items: center; + top: 60px; + width: 800px; + height: 400px; + position: absolute; + background-color: #000; + overflow: hidden; + border: 2px solid white; + /* Add red border */ + display: flex; + justify-content: center; + align-items: center; } .score { - font-size: 24px; - position: absolute; - top: 10px; + font-size: 24px; + position: absolute; + top: 10px; } #player1-score { - left: 50px; - /* Adjust player score position */ + left: 50px; + /* Adjust player score position */ } #player2-score { - right: 50px; - /* Adjust bot score position */ + right: 50px; + /* Adjust bot score position */ } .pad { - width: 10px; - height: 100px; - background-color: #ffffff; - position: absolute; + width: 10px; + height: 100px; + background-color: #ffffff; + position: absolute; } #player1-pad { - left: 10px; - background-color: #00ffff; - border-radius: 10px; - box-shadow: 0 0 15px #00ffff; + left: 10px; + background-color: #00ffff; + border-radius: 10px; + box-shadow: 0 0 15px #00ffff; } #player2-pad { - right: 10px; - background-color: #00ffff; - border-radius: 10px; - box-shadow: 0 0 15px #00ffff; + right: 10px; + background-color: #00ffff; + border-radius: 10px; + box-shadow: 0 0 15px #00ffff; } #ball { - width: 20px; - height: 20px; - background-color: #00ffff; - border-radius: 50%; - position: absolute; + width: 20px; + height: 20px; + background-color: #00ffff; + border-radius: 50%; + position: absolute; } #game-text { - font-size: 64px; - color: #00ffff; - position: absolute; - top: 150px; + font-size: 64px; + color: #00ffff; + position: absolute; + top: 150px; } .logo { - position: absolute; - top: 20px; - left: 20px; - z-index: 20; + position: absolute; + top: 20px; + left: 20px; + z-index: 20; } .logo img { - max-width: 100%; - height: auto; + max-width: 100%; + height: auto; } .stars { - position: absolute; - width: 100%; - height: 100%; + position: absolute; + width: 100%; + height: 100%; } .star { - position: absolute; - background-color: #ffffff; - border-radius: 50%; - animation: twinkle 2s infinite alternate; + position: absolute; + background-color: #ffffff; + border-radius: 50%; + animation: twinkle 2s infinite alternate; } .background { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 0; - pointer-events: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 0; + pointer-events: none; } .pong-elements { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 5; - pointer-events: none; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 5; + pointer-events: none; } .paddle { - position: absolute; - width: 20px; - height: 100px; - background-color: #00ffff; - border-radius: 10px; - box-shadow: 0 0 15px #00ffff; + position: absolute; + width: 20px; + height: 100px; + background-color: #00ffff; + border-radius: 10px; + box-shadow: 0 0 15px #00ffff; } .paddle-left { - left: 50px; - animation: paddleMove 5s infinite alternate ease-in-out; + left: 50px; + animation: paddleMove 5s infinite alternate ease-in-out; } .paddle-right { - right: 50px; - animation: paddleMove 4s infinite alternate-reverse ease-in-out; + right: 50px; + animation: paddleMove 4s infinite alternate-reverse ease-in-out; } .ball_anim { - position: absolute; - width: 30px; - height: 30px; - background-color: #00ffff; - border-radius: 50%; - box-shadow: 0 0 20px #00ffff; - left: 80px; - top: 50%; - transform-style: preserve-3d; - animation: ballMove 3s linear infinite; + position: absolute; + width: 30px; + height: 30px; + background-color: #00ffff; + border-radius: 50%; + box-shadow: 0 0 20px #00ffff; + left: 80px; + top: 50%; + transform-style: preserve-3d; + animation: ballMove 3s linear infinite; } @keyframes paddleMove { - 0% { - transform: translateY(10vh); - } + 0% { + transform: translateY(10vh); + } - 100% { - transform: translateY(70vh); - } + 100% { + transform: translateY(70vh); + } } @keyframes ballMove { - 0% { - transform: translateZ(0) scale(1); - } + 0% { + transform: translateZ(0) scale(1); + } - 50% { - transform: translateZ(-500px) scale(0.5); - } + 50% { + transform: translateZ(-500px) scale(0.5); + } - 100% { - transform: translateZ(0) scale(1); - } + 100% { + transform: translateZ(0) scale(1); + } } .input-container { - margin-bottom: 2rem; + margin-bottom: 2rem; } .container { - text-align: center; - background-color: rgba(0, 0, 40, 0.8); - padding: 3rem; - border-radius: 15px; - border: 3px solid #00ffff; - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; - position: relative; - z-index: 10; - max-width: 80%; - overflow: auto; + text-align: center; + background-color: rgba(0, 0, 40, 0.8); + padding: 3rem; + border-radius: 15px; + border: 3px solid #00ffff; + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + position: relative; + z-index: 10; + max-width: 80%; + overflow: auto; } .navbar { - position: absolute; - top: 30px; - right: 10px; - padding: 10px; + position: absolute; + top: 30px; + right: 10px; + padding: 10px; } .burger-menu { - font-size: 24px; - background: none; - border: none; - color: #00ffff; - cursor: pointer; - transition: color 0.3s ease; + font-size: 24px; + background: none; + border: none; + color: #00ffff; + cursor: pointer; + transition: color 0.3s ease; } .burger-menu:hover { - color: #ffffff; + color: #ffffff; } + .dropdown-content { - display: none; - position: absolute; - top: 100%; - right: 0; - margin-top: 10px; - background-color: #1a1a2e; - color: #ffffff; - box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.3); - border-radius: 5px; - z-index: 1; - width: max-content; + display: none; + position: absolute; + top: 100%; + right: 0; + margin-top: 10px; + background-color: #1a1a2e; + color: #ffffff; + box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.3); + border-radius: 5px; + z-index: 1; + width: max-content; } .dropdown-content.show { - display: block; + display: block; } + .dropdown-content a { - color: #ffffff; - padding: 12px 16px; - text-decoration: none; - display: block; - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - transition: background-color 0.3s ease; + color: #ffffff; + padding: 12px 16px; + text-decoration: none; + display: block; + border-bottom: 1px solid rgba(255, 255, 255, 0.2); + transition: background-color 0.3s ease; } + .dropdown-content a:hover { - background-color: #333; - color: #00ffff; + background-color: #333; + color: #00ffff; } .language-switcher { - position: absolute; - top: 10px; - right: 10px; - display: flex; - gap: 10px; + position: absolute; + top: 10px; + right: 10px; + display: flex; + gap: 10px; } .language-switcher img { - width: 30px; - height: 20px; - cursor: pointer; + width: 30px; + height: 20px; + cursor: pointer; } #settings-btn { - position: fixed; - bottom: 10px; - right: 10px; - cursor: pointer; - z-index: 1000; - border: none; - border-radius: 50%; - padding: 10px; - font-size: 18px; + position: fixed; + bottom: 10px; + right: 10px; + cursor: pointer; + z-index: 1000; + border: none; + border-radius: 50%; + padding: 10px; + font-size: 18px; } #settings-menu { - position: fixed; - bottom: 50px; - right: 10px; - padding: 20px; - background-color: rgb(66, 63, 63); - border: 1px solid #ccc; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - width: 250px; - z-index: 1000; + position: fixed; + bottom: 50px; + right: 10px; + padding: 20px; + background-color: rgb(66, 63, 63); + border: 1px solid #ccc; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + width: 250px; + z-index: 1000; } #close-settings { - position: absolute; - top: 10px; - right: 10px; - background: none; - border: none; - cursor: pointer; - font-size: 16px; + position: absolute; + top: 10px; + right: 10px; + background: none; + border: none; + cursor: pointer; + font-size: 16px; } .modal { - display: none; - position: fixed; - z-index: 1; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgb(0, 0, 0); - background-color: rgba(0, 0, 0, 0.4); - padding-top: 60px; + display: none; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgb(0, 0, 0); + background-color: rgba(0, 0, 0, 0.4); + padding-top: 60px; } .modal-content { - background-color: #fefefe; - margin: 5% auto; - padding: 20px; - border: 5px solid #888; - width: 80%; - max-height: 70vh; - overflow-y: auto; + background-color: #fefefe; + margin: 5% auto; + padding: 20px; + border: 5px solid #888; + width: 80%; + max-height: 70vh; + overflow-y: auto; } .close { - color: #aaa; - float: right; - font-size: 28px; - font-weight: bold; + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; } .close:hover, .close:focus { - color: black; - text-decoration: none; - cursor: pointer; + color: black; + text-decoration: none; + cursor: pointer; } pre { - white-space: pre-wrap; - word-wrap: break-word; + white-space: pre-wrap; + word-wrap: break-word; } -/* + .tournament-waiting-room { - background-color: rgba(0, 0, 0, 0.6); - padding: 20px; - border-radius: 15px; - color: #00ffff; - width: 50%; - margin: auto; - text-align: center; - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + background-color: rgba(0, 0, 0, 0.6); + padding: 20px; + border-radius: 15px; + color: #00ffff; + width: 50%; + margin: auto; + text-align: center; + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; } .tournament-waiting-room h2 { - font-family: 'Arial', sans-serif; - font-size: 2em; - margin-bottom: 15px; - text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7); + font-family: 'Arial', sans-serif; + font-size: 2em; + margin-bottom: 15px; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7); } .tournament-waiting-room p { - font-family: 'Verdana', sans-serif; - font-size: 1.2em; - margin-bottom: 20px; - text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6); + font-family: 'Verdana', sans-serif; + font-size: 1.2em; + margin-bottom: 20px; + text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6); } .tournament-waiting-room ul { - list-style-type: none; - padding: 0; + list-style-type: none; + padding: 0; } -*/ + body { - color: rgb(0, 255, 255); /* Valeur par défaut */ - font-family: Arial, sans-serif; - font-size: 16px; + color: rgb(0, 255, 255); /* Valeur par défaut */ + font-family: Arial, sans-serif; + font-size: 16px; } canvas { - max-width: 100%; - height: auto; - margin-top: 20px; + max-width: 100%; + height: auto; + margin-top: 20px; } #game-controls { - display: flex; - justify-content: center; - gap: 20px; - margin-bottom: 10px; + display: flex; + justify-content: center; + gap: 20px; + margin-bottom: 10px; } #game-controls button { - background-color: #00ffff; - color: #000033; - border: none; - padding: 1rem 2rem; - font-size: 1rem; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 10px; - text-transform: uppercase; - letter-spacing: 2px; + background-color: #00ffff; + color: #000033; + border: none; + padding: 1rem 2rem; + font-size: 1rem; + cursor: pointer; + transition: all 0.3s ease; + border-radius: 10px; + text-transform: uppercase; + letter-spacing: 2px; } #game-controls button:hover { - background-color: #000033; - color: #00ffff; - box-shadow: 0 0 20px #00ffff; -} \ No newline at end of file + background-color: #000033; + color: #00ffff; + box-shadow: 0 0 20px #00ffff; +} + +/* Styles pour le conteneur principal du chat */ +#chat-container { + position: fixed; + bottom: 10px; + left: 10px; + width: 300px; + background-color: rgba(0, 0, 0, 0.7); + border-radius: 10px; + padding: 10px; + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + z-index: 1000; + box-sizing: border-box; /* Ajouté */ + display: flex; + flex-direction: column; +} + +/* Styles pour le conteneur du chat log */ +#chat-log-container { + width: 100%; + background-color: transparent; /* Fond transparent */ + padding: 10px; + border-radius: 10px; + color: #fff; + font-size: 14px; + max-height: 150px; + margin-bottom: 10px; + box-sizing: border-box; /* Ajouté */ + flex: 1; /* Permet au conteneur de prendre tout l'espace disponible */ +} + +.chat-log { + max-height: 150px; + overflow-y: auto; + margin-bottom: 10px; + box-sizing: border-box; /* Ajouté */ + background-color: transparent; /* Fond transparent */ +} + +/* Styles pour l'entrée de texte du chat */ +#chat-input-container { + width: 100%; + height: 25%; + display: flex; + flex-direction: column; /* Aligner les chat-inputs verticalement */ + background-color: transparent; /* Fond transparent */ + padding: 5px; + border-radius: 10px; + box-sizing: border-box; /* Ajouté */ +} + +.chat-input { + flex: 1; + padding: 5px; + font-size: 13px; + border: none; + border-radius: 5px; + margin-right: 5px; + height: 28px; + box-sizing: border-box; /* Ajouté */ + display: none; /* Masquer par défaut */ +} + +.chat-input.active { + display: flex; /* Afficher lorsque actif */ +} + +.chat-input input[type="text"] { + flex: 1; /* Permet à l'input de prendre tout l'espace disponible */ + padding: 5px; + font-size: 13px; + border: none; + border-radius: 5px; + box-sizing: border-box; /* Ajouté */ + height: 28px; /* Augmenter la hauteur de l'input */ +} + +.chat-button { + height: 28px; + width: 150px; /* Réduire la largeur du bouton */ + border: none; + border-radius: 5px; + background-color: #00ffff; + color: #000033; + cursor: pointer; + margin-left: 100px; /* Espace entre l'input et le bouton */ + display: flex; /* Utiliser flexbox pour centrer le contenu */ + align-items: center; /* Centrer verticalement */ + justify-content: center; /* Centrer horizontalement */ + text-align: center; /* Assurer que le texte est centré */ + font-size: 13px; /* Ajuster la taille de la police */ + padding: 0; /* Supprimer le padding interne */ +} + +/* Styles pour les onglets de room */ +#room-tabs-container { + display: flex; + justify-content: space-between; + margin-top: 10px; +} + +/* Styles pour les onglets de room */ +.room-tab { + font-size: 14px; + padding: 5px 10px; + margin-right: 5px; + cursor: pointer; + border: 1px solid #00ffff; + background-color: #000033; + color: #00ffff; + border-radius: 5px; + box-sizing: border-box; /* Ajouté */ + opacity: 0.1; /* Onglets inactifs grisés */ +} + +.room-tab:hover { + background-color: #00ffff; + color: #000033; +} + +.room-tab.active { + background-color: #00ffff; + color: #000033; + opacity: 1; /* Onglets actifs non grisés */ +} + From 984c8a2a827485aa660cb50a01ae6873078ef45a Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Sun, 15 Sep 2024 18:39:45 +0200 Subject: [PATCH 02/11] 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
- - + - -
- -
-
- - -
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
Main Room
-
Tournament
-
Quick Match
-
-
- - +
+ + +
+ +
+ +
+
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Main Room
+
Tournament
+
Quick Match
+
+
+ + - - - - - - - -
- - -
- -
- -
-
- - -
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
Main Room
-
Tournament
-
Quick Match
-
-
- - - - - - - \ No newline at end of file diff --git a/pong/static/language.js b/pong/static/language.js deleted file mode 100644 index dd5b518..0000000 --- a/pong/static/language.js +++ /dev/null @@ -1,113 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - const translations = { - fr: { - welcome: "BIENVENUE DANS LE PONG 42", - labelNickname: "Entrez votre surnom:", - labelPassword: "Entrez votre mot de passe:", - labelConfirmPassword: "Confirmez votre mot de passe:", - labelLoginPassword: "Entrez votre mot de passe:" - }, - en: { - welcome: "WELCOME TO PONG 42", - labelNickname: "Enter your nickname:", - labelPassword: "Enter your password:", - labelConfirmPassword: "Confirm your password:", - labelLoginPassword: "Enter your password:" - }, - it: { - welcome: "BENVENUTO A PONG 42", - labelNickname: "Inserisci il tuo soprannome:", - labelPassword: "Inserisci la tua password:", - labelConfirmPassword: "Conferma la tua password:", - labelLoginPassword: "Inserisci la tua password:" - }, - es: { - welcome: "BIENVENIDO A PONG 42", - labelNickname: "Introduce tu apodo:", - labelPassword: "Introduce tu contraseña:", - labelConfirmPassword: "Confirma tu contraseña:", - labelLoginPassword: "Introduce tu contraseña:" - }, - de: { - welcome: "WILLKOMMEN BEI PONG 42", - labelNickname: "Geben Sie Ihren Spitznamen ein:", - labelPassword: "Geben Sie Ihr Passwort ein:", - labelConfirmPassword: "Bestätigen Sie Ihr Passwort:", - labelLoginPassword: "Geben Sie Ihr Passwort ein:" - } - }; - - function setCookie(name, value, days) { - const d = new Date(); - d.setTime(d.getTime() + (days*24*60*60*1000)); - const expires = "expires=" + d.toUTCString(); - document.cookie = name + "=" + value + ";" + expires + ";path=/"; - } - - function getCookie(name) { - const cname = name + "="; - const decodedCookie = decodeURIComponent(document.cookie); - const ca = decodedCookie.split(';'); - for(let i = 0; i < ca.length; i++) { - let c = ca[i]; - while (c.charAt(0) === ' ') { - c = c.substring(1); - } - if (c.indexOf(cname) === 0) { - return c.substring(cname.length, c.length); - } - } - return ""; - } - - function changeLanguage(lang) { - setCookie('preferredLanguage', lang, 365); - document.getElementById('welcome').innerText = translations[lang].welcome; - document.getElementById('label-nickname').innerText = translations[lang].labelNickname; - document.getElementById('label-password').innerText = translations[lang].labelPassword; - document.getElementById('label-confirm-password').innerText = translations[lang].labelConfirmPassword; - document.getElementById('label-login-password').innerText = translations[lang].labelLoginPassword; - } - - function setLanguageFromCookie() { - const preferredLanguage = getCookie('preferredLanguage'); - if (preferredLanguage && translations[preferredLanguage]) { - changeLanguage(preferredLanguage); - } else { - changeLanguage('fr'); // Default to French if no cookie is found - } - } - - document.getElementById('lang-fr').addEventListener('click', () => changeLanguage('fr')); - document.getElementById('lang-en').addEventListener('click', () => changeLanguage('en')); - document.getElementById('lang-it').addEventListener('click', () => changeLanguage('it')); - document.getElementById('lang-es').addEventListener('click', () => changeLanguage('es')); - document.getElementById('lang-de').addEventListener('click', () => changeLanguage('de')); - - window.onload = setLanguageFromCookie; - - document.getElementById('settings-btn').addEventListener('click', function() { - document.getElementById('settings-menu').style.display = 'block'; - }); - - document.getElementById('close-settings').addEventListener('click', function() { - document.getElementById('settings-menu').style.display = 'none'; - }); - - - document.getElementById('color-picker').addEventListener('input', function() { - document.body.style.color = this.value; - document.querySelectorAll('button').forEach(function(button) { - button.style.backgroundColor = this.value; - }, this); - }); - - document.getElementById('font-selector').addEventListener('change', function() { - document.body.style.fontFamily = this.value; - }); - - document.getElementById('font-size-slider').addEventListener('input', function() { - document.body.style.fontSize = this.value + 'px'; - }); - -}); \ No newline at end of file diff --git a/pong/static/logo-42-perpignan.png b/pong/static/logo-42-perpignan.png deleted file mode 100644 index d91cd1fdf1da6f33dbc52a7600762b165c1424f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5912 zcmeHL_d6U+wARb&tX@}_5WOV2)h*U;1krn4J)(wSm5^u=QNyZ92%-z?vtgA)FDrT{ zy68f3H}~JTcYc^>&O9^kdFMSd&&-@;sEHm8fCE54KtN-luMHz0AjII?xfI0sI^}Zk zf`EXS01A1iqvsF#`~T(t75KlZfa}_!3jS~q1j9_=1kzu6yT8sur7&ZaxqWG}XMf)V z^fjkWG{kz);=f)T-%UBXC-dr5QX(}y^TVuz*K(p4Dwj6$ovH>y*zAM{Nr_02 zWWeb4gIX5<0Oty}sKcE6KL*pXu8a&8jxV>? zt+hqaL~UsEs(qWJ8g8s-pA96l+vck_ulc0a@FYask&d5$fU(a&Tk~OP!M?4h1G5g} z0fkcx1-ltN4N1IltTxe|w^bfQN#uOp=0MFP5gzR}M#==zHgiit9Zd#F=sJZi4eH}| zEZ?0vejWx_W(GQv4*Fn=g~AU9MQerG7j`0H;Ar*5VBEuz$?q5KU#_{ZPATyMJCj1o z{o#676%auopHZn~)T5Szv6oIaE{RkeBAjwu6FrJQ>l@?yrbHG?JdIVNZv^Vuk8jEP z`TMdM72HMW{Q{iM)Y0VWj_|fzL!GQsl^7U z=OOU`OvT`>p?F78pA68M9MUk|#8t{trym1-JBuBk0DjOQYBCjmSZSdTVDiDE6EzwL zp{KIIwn9LpC+)uuC_A+s9g!AvhQGI@QY`g;722a;yk86Yc7D1XZ_C3>P@Q9S&g$Kw zK5q`DCxBSCNwwTjq$nQ+lGgq;7|v!bNdMaz&;#I1>ct~CLV8+0y2QFM3dB;dYnxUOU%gNRy2;a`@Dpfcl*bpHnK#$k z#UMs>75E;?s<8A?RLe4|PKWP*Nm7-;qs&kuasIHkT-89=Jj~me*#<=Lhe300pxf2O zz|1I6H*K>gT&n-|l7l~#t?{3>rMeHAc&b;&`SUSu|HK{R&$=Z0Swl%^;22YcV3k9f zq0FmwLvQ&+Ayfw`f%pl;P3~U?!=SLYESP^(b@9wqBx1bPG3F#WVH-9{^GiI%X6g<7NpVKaY`PM7gepnWr0s4HXe?da zmZ3czW=-*3fCCj}#w#ZhF2nj>AwG|^A>w_r;P7a^<%>H{U8*Fmp(mzvM$oyq9risF z7ibR3H$BR1;|+b(nA&VcK&k8$tGOM69i#z_i&Nuk5$5MwDUaJ3#QT0ZJAoPz;K(eW zO%Ek*vTv;Q0#}9AnWDXnR;eb#p<$prJwYj}2pM0f`^|J7OBC<^K&$3ZT#jf<{GbCm z5I-u%PB$W8r*AvCh7u$G=POn29xb2H}%_7&5c~+s#?mt%_Xp&`54=k+N zIto1W(O%$HYSrYk;*5{8jK3)GURP-*!(^H&?q?L%&SqX>%5OamCGgru3o*{<;N1rc zzd^NqpeZp49vrmz7mD`U$2Fc~-u9E^5A7eS#%bF(ju33T>0zxpE52q?t>>RSE2gUo zn(`XjhUG*~CG@aY6{QB0dl^+pgyVTh`_muyPUWewtL`q+1lB%Ao+xG# zWlv8FLlxoe?ZfiYy-nzZbtam&SCC=SJS}Q+6berXxuszsUShxduZUZJC zJ56BMbu?eJkkGa**Cy4owFhfG11>zbHb~3XUifeK(bv`*L&@s%?tGvyJJx^p#2X-x z00aEySTCfPM>2pxNDEX^1ymjg>&Ks@4<)ZKHlHl+ig8H?PNu)Lp9}(?Gl!2sXF`G* zP?zTr&;S=4CMXqN&EDmlI;u2*5)6>D5JSuB=o_XOy)eYy8sDMjir(rm$f|_wOAVnX zwo#d@U-q^adWD2~FJ_Ld-GIzPbxx$RDJj_71;;IB9i6p*bb;Kj2USFIX5NbI~Z~I0dHwo^EFg< zcFY@S=kikryuvWdsYa5S$Q>)~*3l(^ju8p($=%jUUmmrZ)l#t@?+bhUETfvh*}_V3 zSk`$U&1$Ug_>@T|{DG;@h47TLvwK)7#>N`YCcpjQQZNXonDW*%=f(*V{K`mS;jkqu?2Pr(Q#+5v(0b`veq zNtcQ@e8N=wvSkI4cR7xl8gD_RFGar|8J0YB+bm=P9f{jW>s3hPJl{GpL4>-XT=u~p-0C0s{2|s;S0_vKyY!;+?Rny0RM-a)rS7grC zFD(=e{>55hh(Q=+XPE;_kjmp{{O=FvwoG5AM@04v_&w-zCOM$@tR9*7S=kK$Bk1`^({Lw{CM3>h`$5+Q_c}uS~lJ|VB!K{Wkf`|5Y zC`d^f&~>G}r&O!1vV> zbH$A^hnVJO^8Np?%hGx(QVKvV2M=Ng&+W*Ols+O{ncsCc+{wa?7K@MgqdWV>s!wyr zpK>|F_t;Dn-)^cz`w}Lh{Y7>LXYMIY=hXf&>Nx-S2IC`aGpL2F6GeY$1 z=-gxP{K|M`^LaI+NVT!EcS-b$RvI+)F##TvtM$i|l7rNJUpKv4!feM^Cv7U`&3DJd zD#{2+I1B+@S~b&euy9DD7&b4OqvM(4O=S|gC{2Utp1;URYgC)g3eK4AHyKeStrbNg zzaMl)EZuG$7!qW+xyvZbJ#ipQMMafT7xC@D=jubY{su(OgG;~eHA2jENUMfPoO`<^ z4io5VDjW0ijq%c=AfuE5GwV;mO70#P?khyG z7ZhVMS$WA?cCIYCx6MJVE&E^ehJD_S=#8NQ?+fGV#pR8zHRv14o55_V<#&xNT60kA zkS2C@nqvZF_bGqn5xM@KLU=4qFYlhx0~J+E!fVwvg!1{d)wH`>)`C2C+Sx3U>w%h7 zg%Zi*!^6OhcjXIG;g&lWa_R1zU5#8)V;40tGg<`)IZ`Q6q}KZ!oC@zuRbu8+4Zh7p1; z)JXW=$Ca4nN2cZ{t?A4N-MKr_geiBG!L@%1y0=!oHMpr23dE^N9*9vtV&E8qCLvz* znj|-rP;md~(ja(%IlvxpvX%CACvDl{2nP~XEFTOY=0UGlNkY6?68L(lqa=yXpKRu# z9~zy6*1-(JSTWepN+}O9FKsYL*nUHVf$h6?m;8e&do9t38cRmlI;4?KFmP#|*VaA* zok!KDsnly2gRTUT=e`PAx}{0zlo^@9y`xxt5@1r|H_}XH1`9>Li+84n#KjPjt$arL zvpBbW4QQ8T_|(Der?b?kd!`-+O?sT4@#j&q6Z5FJ+zf?JwZ^-2g3VJ__Bp@S%_mw(S~>TDg9Q`Ta4XV9;4Ln ztORR6l&EibhMV7?SgY#@O1iNz?#`F;S?j#&`#$A4@ym5W|2f(kh9}`K_gCfyN2s! z20+f=KG%Ka-idHXA6t2%NO(`*j)d|6OHfXF=CB_|2gdK#UT6{LW; zYlA!@Kz<3ZFOF6gd>ZSpvEWvfQ(&w_wSKZrGQrtvd2toF$bpjm9neMbY?kg>tvfaR z@XppaC*Zr$4IyYg!ObiWVs#$Tq~5^9Q!GVDQP!S5_orUgzn4ps*VcW>NEH;RpGh<J3u67pe$QLbAv`1g3Xo=E0P`K|pDh-nqXkFmyG(uuyrM%cwWz*0 zlzr_BPs*o4#NJ0LeYw2M3lH6-1Vrl*F9qsji(N7-pDWO5KTU2Kd5U}d*#_4CGCD|PP_tLX}Wmmpq4T6i}Nt+SoA86IdULl z{=|2MlmrmHA#zdx#JHLKroDz*9z0WZC7n8{e!ffyuo7rIqOguR_U<*Y35*Xl&?7=R z^(nI=-3sr7>;yrRBF+&D=xlGef({K3rw|L!Y+p$E z-*d961>k?5i6q5!TumbDe?{Fo6UyjWz1(w$$9}Eoo_E*y;g%;NVzs7)fAq}>7u~|Qlzj~lPp!ZoWQH}Rb8zE0gy7_@W+n0$vVtLzVVUa{Vk5%tD>7{gD zgiDz?%1pa@3ngwj80UPQ2?=niEsczsu_NvhzeGoMl@XAc^LA)~oI4*-!bOGx^o?rw z$v?++oVf8`1e?gry%16NA_}ofbdFN34E4MIATO5ipe1Z=!_lb@yU=2e11X|Z>G_#`~dq@d4lC*9lKwM0jn*c f6A9sDf61#)A~#d%>Phh#Zvq1y6YWo04zd3OsHB2+ diff --git a/pong/static/styles.css b/pong/static/styles.css deleted file mode 100644 index 332f746..0000000 --- a/pong/static/styles.css +++ /dev/null @@ -1,681 +0,0 @@ -/* General styles */ - -html { - font-family: Arial, sans-serif; - color: #00ffff; - background-color: #0a0a2a; - margin: 0; - padding: 0; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - overflow: auto; -} - - -label { - margin: 10px 0 5px; -} - -input { - padding: 10px; - margin: 5px 0 20px; - width: 200px; -} - -button { - background-color: #00ffff; - color: #000033; - border: none; - padding: 1rem 2rem; - font-size: 1.5rem; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 10px; - margin-top: 1rem; - text-transform: uppercase; - letter-spacing: 2px; -} - -button:hover { - background-color: #000033; - color: #00ffff; - box-shadow: 0 0 20px #00ffff; -} - -#game1 { - width: 810px; - height: 500px; - position: relative; - background-color: #000; - border: 3px solid #00ffff; - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; - overflow: hidden; - display: flex; - justify-content: center; - align-items: center; -} - -.name { - font-size: 24px; - position: absolute; - top: 20px; -} - -#player1-name { - left: 10px; - /* Adjust player score position */ -} - -#player2-name { - right: 10px; - /* Adjust bot score position */ -} - -#game2 { - top: 60px; - width: 800px; - height: 400px; - position: absolute; - background-color: #000; - overflow: hidden; - border: 2px solid white; - /* Add red border */ - display: flex; - justify-content: center; - align-items: center; -} - -.score { - font-size: 24px; - position: absolute; - top: 10px; -} - -#player1-score { - left: 50px; - /* Adjust player score position */ -} - -#player2-score { - right: 50px; - /* Adjust bot score position */ -} - -.pad { - width: 10px; - height: 100px; - background-color: #ffffff; - position: absolute; -} - -#player1-pad { - left: 10px; - background-color: #00ffff; - border-radius: 10px; - box-shadow: 0 0 15px #00ffff; -} - -#player2-pad { - right: 10px; - background-color: #00ffff; - border-radius: 10px; - box-shadow: 0 0 15px #00ffff; -} - -#ball { - width: 20px; - height: 20px; - background-color: #00ffff; - border-radius: 50%; - position: absolute; -} - -#game-text { - font-size: 64px; - color: #00ffff; - position: absolute; - top: 150px; -} - -.logo { - position: absolute; - top: 20px; - left: 20px; - z-index: 20; -} - -.logo img { - max-width: 100%; - height: auto; -} - -.stars { - position: absolute; - width: 100%; - height: 100%; -} - -.star { - position: absolute; - background-color: #ffffff; - border-radius: 50%; - animation: twinkle 2s infinite alternate; -} - -.background { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 0; - pointer-events: none; -} - -.pong-elements { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 5; - pointer-events: none; -} - -.paddle { - position: absolute; - width: 20px; - height: 100px; - background-color: #00ffff; - border-radius: 10px; - box-shadow: 0 0 15px #00ffff; -} - -.paddle-left { - left: 50px; - animation: paddleMove 5s infinite alternate ease-in-out; -} - -.paddle-right { - right: 50px; - animation: paddleMove 4s infinite alternate-reverse ease-in-out; -} - -.ball_anim { - position: absolute; - width: 30px; - height: 30px; - background-color: #00ffff; - border-radius: 50%; - box-shadow: 0 0 20px #00ffff; - left: 80px; - top: 50%; - transform-style: preserve-3d; - animation: ballMove 3s linear infinite; -} - -@keyframes paddleMove { - 0% { - transform: translateY(10vh); - } - - 100% { - transform: translateY(70vh); - } -} - -@keyframes ballMove { - 0% { - transform: translateZ(0) scale(1); - } - - 50% { - transform: translateZ(-500px) scale(0.5); - } - - 100% { - transform: translateZ(0) scale(1); - } -} - -.input-container { - margin-bottom: 2rem; -} - -.container { - text-align: center; - background-color: rgba(0, 0, 40, 0.8); - padding: 3rem; - border-radius: 15px; - border: 3px solid #00ffff; - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; - position: relative; - z-index: 10; - max-width: 80%; - overflow: auto; -} - - -.navbar { - position: absolute; - top: 30px; - right: 10px; - padding: 10px; -} - -.burger-menu { - font-size: 24px; - background: none; - border: none; - color: #00ffff; - cursor: pointer; - transition: color 0.3s ease; -} - -.burger-menu:hover { - color: #ffffff; -} - - -.dropdown-content { - display: none; - position: absolute; - top: 100%; - right: 0; - margin-top: 10px; - background-color: #1a1a2e; - color: #ffffff; - box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.3); - border-radius: 5px; - z-index: 1; - width: max-content; -} - -.dropdown-content.show { - display: block; -} - - -.dropdown-content a { - color: #ffffff; - padding: 12px 16px; - text-decoration: none; - display: block; - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - transition: background-color 0.3s ease; -} - - -.dropdown-content a:hover { - background-color: #333; - color: #00ffff; -} - -.language-switcher { - position: absolute; - top: 10px; - right: 10px; - display: flex; - gap: 10px; -} - -.language-switcher img { - width: 30px; - height: 20px; - cursor: pointer; -} - -#settings-btn { - position: fixed; - bottom: 10px; - right: 10px; - cursor: pointer; - z-index: 1000; - border: none; - border-radius: 50%; - padding: 10px; - font-size: 18px; -} - -#settings-menu { - position: fixed; - bottom: 50px; - right: 10px; - padding: 20px; - background-color: rgb(66, 63, 63); - border: 1px solid #ccc; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - width: 250px; - z-index: 1000; -} - -#close-settings { - position: absolute; - top: 10px; - right: 10px; - background: none; - border: none; - cursor: pointer; - font-size: 16px; -} - -.modal { - display: none; - position: fixed; - z-index: 1; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgb(0, 0, 0); - background-color: rgba(0, 0, 0, 0.4); - padding-top: 60px; -} - -.modal-content { - background-color: #fefefe; - margin: 5% auto; - padding: 20px; - border: 5px solid #888; - width: 80%; - max-height: 70vh; - overflow-y: auto; -} - -.close { - color: #aaa; - float: right; - font-size: 28px; - font-weight: bold; -} - -.close:hover, -.close:focus { - color: black; - text-decoration: none; - cursor: pointer; -} - -pre { - white-space: pre-wrap; - word-wrap: break-word; -} - -.tournament-waiting-room { - background-color: rgba(0, 0, 0, 0.6); - padding: 20px; - border-radius: 15px; - color: #00ffff; - width: 50%; - margin: auto; - text-align: center; - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; - -} - -.tournament-waiting-room h2 { - font-family: 'Arial', sans-serif; - font-size: 2em; - margin-bottom: 15px; - text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7); -} - -.tournament-waiting-room p { - font-family: 'Verdana', sans-serif; - font-size: 1.2em; - margin-bottom: 20px; - text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6); -} - -.tournament-waiting-room ul { - list-style-type: none; - padding: 0; -} - -body { - color: rgb(0, 255, 255); /* Valeur par défaut */ - font-family: Arial, sans-serif; - font-size: 16px; -} - -canvas { - max-width: 100%; - height: auto; - margin-top: 20px; -} - -#game-controls { - display: flex; - justify-content: center; - gap: 20px; - margin-bottom: 10px; -} - -#game-controls button { - background-color: #00ffff; - color: #000033; - border: none; - padding: 1rem 2rem; - font-size: 1rem; - cursor: pointer; - transition: all 0.3s ease; - border-radius: 10px; - text-transform: uppercase; - letter-spacing: 2px; -} - -#game-controls button:hover { - background-color: #000033; - color: #00ffff; - box-shadow: 0 0 20px #00ffff; -} - -/**************************CHAT*************************************/ -@keyframes borderGlow { - 0% { - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; - } - 50% { - box-shadow: 0 0 60px #0099ff, inset 0 0 40px #0099ff; - } - 100% { - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; - } -} - -#chat-container { - display: none; /* Masquer par défaut */ - position: fixed; - bottom: 10px; - left: 10px; - width: 300px; - background-color: rgba(0, 0, 0, 0.7); /* Couleur de fond semi-transparente par défaut */ - border-radius: 10px; - padding: 10px; - box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; - z-index: 1000; - box-sizing: border-box; - flex-direction: column; - animation: borderGlow 3s infinite; /* Ajouter l'animation */ - transition: background-color 0.3s, transform 0.3s; /* Ajouter des transitions */ -} - -#chat-container:hover { - background-color: rgba(0, 0, 0, 1); /* Couleur de fond opaque au survol */ - transform: scale(1.05); /* Agrandir légèrement au survol */ -} - -.chat-log { - max-height: 150px; - overflow-y: auto; - margin-bottom: 10px; - box-sizing: border-box; - background-color: transparent; - display: none; -} - -.chat-input { - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - margin-bottom: 5px; - position: relative; /* Assurez-vous que le conteneur parent est positionné */ -} - -.chat-input.active { - display: flex; /* Afficher uniquement l'élément actif */ -} - -.chat-input input[type="text"] { - flex: 1; - padding: 5px; - font-size: 13px; - border: none; - border-radius: 5px; - box-sizing: border-box; - height: 28px; - align-items: center; - justify-content: center; -} - -.chat-button { - height: 50px; - width: 50px; /* Réduire la taille du bouton */ - border: none; - border-radius: 50%; - background: linear-gradient(45deg, #00ffff, #0099ff); - color: #000033; - cursor: pointer; - position: absolute; /* Positionner le bouton de manière absolue */ - right: 10px; /* Ajuster la position à droite */ - top: 10%; /* Centrer verticalement */ - transform: translateY(-50%); /* Centrer verticalement */ - display: flex; - align-items: center; - justify-content: center; - text-align: center; - font-size: 20px; - padding: 0; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); - transition: background 0.3s, transform 0.3s; - animation: buttonGlow 3s infinite; /* Ajouter l'animation */ -} - -.chat-button:hover { - background: linear-gradient(45deg, #0099ff, #00ffff); - transform: translateY(-50%) scale(1.1); /* Agrandir légèrement au survol */ -} - -.chat-button:active { - transform: translateY(-50%) scale(0.95); /* Réduire légèrement à l'activation */ -} - -@keyframes buttonGlow { - 0% { - box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; - } - 50% { - box-shadow: 0 0 20px #0099ff, inset 0 0 10px #0099ff; - } - 100% { - box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; - } -} - -#room-tabs-container { - display: flex; - justify-content: space-between; - margin-top: 5px; -} - -.room-tab { - font-size: 14px; - padding: 5px 10px; - margin-right: 5px; - cursor: pointer; - border: 1px solid #00ffff; - background-color: #000033; - color: #00ffff; - border-radius: 5px; - box-sizing: border-box; - opacity: 0.1; - transition: background 0.3s, transform 0.3s; /* Ajouter des transitions */ - animation: tabGlow 3s infinite; /* Ajouter l'animation */ -} - -.room-tab:hover { - background-color: #00ffff; - color: #000033; - transform: scale(1.1); /* Agrandir légèrement au survol */ -} - -.room-tab:active { - transform: scale(0.95); /* Réduire légèrement à l'activation */ -} - -.room-tab.active { - background-color: #00ffff; - color: #000033; - opacity: 1; -} - -@keyframes tabGlow { - 0% { - box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; - } - 50% { - box-shadow: 0 0 20px #0099ff, inset 0 0 10px #0099ff; - } - 100% { - box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; - } -} - -#chat-controls { - position: fixed; - bottom: 10px; - left: 320px; /* Ajuster la position à côté du conteneur de chat */ - display: flex; - flex-direction: column; - gap: 5px; /* Espacement entre les boutons */ -} - -#chat-controls button { - width: 100px; /* Réduire la taille des boutons */ - height: 30px; /* Réduire la taille des boutons */ - font-size: 12px; /* Ajuster la taille de la police */ - padding: 5px; - border-radius: 5px; - cursor: pointer; - background-color: #00ffff; - color: #000033; - border: none; - transition: background-color 0.3s, transform 0.3s; - animation: buttonGlow 3s infinite; /* Ajouter l'animation */ -} - -#chat-controls button:hover { - background-color: #0099ff; - transform: scale(1.05); -} - -#chat-controls button:active { - transform: scale(0.95); -} - -@keyframes buttonGlow { - 0% { - box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; - } - 50% { - box-shadow: 0 0 20px #0099ff, inset 0 0 10px #0099ff; - } - 100% { - box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; - } -} \ No newline at end of file diff --git a/pong/urls.py b/pong/urls.py deleted file mode 100644 index dae9bf6..0000000 --- a/pong/urls.py +++ /dev/null @@ -1,16 +0,0 @@ -# /pong/urls.py - -from django.contrib import admin -from django.urls import path, include -from django.conf import settings -from django.conf.urls.static import static - -urlpatterns = [ - # Disable the admin page - # path('admin/', admin.site.urls), - # path('api/', include('pong.game.urls')), - path('', include('pong.game.urls')), -] - -if settings.DEBUG: - urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 15069d9..0000000 --- a/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -django -psycopg2 -python-dotenv -channels -daphne -djangorestframework -web3 -python-json-logger==2.0.7 From dd907cd18409761084fca008d5bb083cead004ab Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Tue, 17 Sep 2024 12:16:31 +0200 Subject: [PATCH 06/11] fernand2 --- .env:Zone.Identifier | 0 .gitignore | 4 + .gitignore:Zone.Identifier | 0 Dockerfile | 18 + Dockerfile:Zone.Identifier | 0 config/logstash.conf | 28 + config/logstash.conf:Zone.Identifier | 0 docker-compose.yml | 241 ++++ docker-compose.yml:Zone.Identifier | 0 env_template | 30 + env_template:Zone.Identifier | 0 logs/172.31.141.12-1726534356068.log | 53 + ...1.141.12-1726534356068.log:Zone.Identifier | 0 logs/172.31.141.12-1726534693901.log | 41 + ...1.141.12-1726534693901.log:Zone.Identifier | 0 logs/172.31.141.12-1726536620868.log | 6 + ...1.141.12-1726536620868.log:Zone.Identifier | 0 logs/172.31.141.12-1726538690438.log | 33 + ...1.141.12-1726538690438.log:Zone.Identifier | 0 logs/172.31.141.12-1726541943958.log | 47 + ...1.141.12-1726541943958.log:Zone.Identifier | 0 logs/172.31.141.12-1726542449903.log | 46 + ...1.141.12-1726542449903.log:Zone.Identifier | 0 logs/172.31.141.12-1726543072083.log | 37 + ...1.141.12-1726543072083.log:Zone.Identifier | 0 logs/172.31.141.12-1726543851799.log | 1223 +++++++++++++++++ ...1.141.12-1726543851799.log:Zone.Identifier | 0 logs/django.log | 646 +++++++++ logs/django.log:Zone.Identifier | 0 logs/django_errors.log | 0 logs/django_errors.log:Zone.Identifier | 0 makefile | 56 + makefile:Zone.Identifier | 0 manage.py | 19 + manage.py:Zone.Identifier | 0 pong/__init__.py | 0 pong/__init__.py:Zone.Identifier | 0 pong/asgi.py | 31 + pong/asgi.py:Zone.Identifier | 0 pong/game/__init__.py | 0 pong/game/__init__.py:Zone.Identifier | 0 pong/game/consumers.py | 363 +++++ pong/game/consumers.py:Zone.Identifier | 0 pong/game/game.py | 253 ++++ pong/game/game.py:Zone.Identifier | 0 pong/game/matchmaking.py | 107 ++ pong/game/matchmaking.py:Zone.Identifier | 0 pong/game/migrations/0001_initial.py | 60 + .../0001_initial.py:Zone.Identifier | 0 .../migrations/0002_alter_match_winner.py | 19 + ...0002_alter_match_winner.py:Zone.Identifier | 0 .../migrations/0003_alter_tournoi_date.py | 18 + ...0003_alter_tournoi_date.py:Zone.Identifier | 0 pong/game/migrations/__init__.py | 0 .../migrations/__init__.py:Zone.Identifier | 0 pong/game/models.py | 61 + pong/game/models.py:Zone.Identifier | 0 pong/game/routing.py | 15 + pong/game/routing.py:Zone.Identifier | 0 .../templates/pong/tournament_brackets.html | 60 + .../tournament_brackets.html:Zone.Identifier | 0 .../pong/tournament_waiting_room.html | 20 + ...urnament_waiting_room.html:Zone.Identifier | 0 pong/game/tournament.py | 227 +++ pong/game/tournament.py:Zone.Identifier | 0 pong/game/urls.py | 18 + pong/game/urls.py:Zone.Identifier | 0 pong/game/utils.py | 196 +++ pong/game/utils.py:Zone.Identifier | 0 pong/game/views.py | 169 +++ pong/game/views.py:Zone.Identifier | 0 pong/settings.py | 212 +++ pong/settings.py:Zone.Identifier | 0 pong/static/burger.js | 409 ++++++ pong/static/burger.js:Zone.Identifier | 0 pong/static/flags/de.svg | 7 + pong/static/flags/de.svg:Zone.Identifier | 0 pong/static/flags/es.svg | 712 ++++++++++ pong/static/flags/es.svg:Zone.Identifier | 0 pong/static/flags/fr.svg | 7 + pong/static/flags/fr.svg:Zone.Identifier | 0 pong/static/flags/it.svg | 7 + pong/static/flags/it.svg:Zone.Identifier | 0 pong/static/flags/us.svg | 57 + pong/static/flags/us.svg:Zone.Identifier | 0 pong/static/game.js | 1101 +++++++++++++++ pong/static/game.js:Zone.Identifier | 0 pong/static/index.html | 339 +++++ pong/static/index.html:Zone.Identifier | 0 pong/static/language.js | 113 ++ pong/static/language.js:Zone.Identifier | 0 pong/static/logo-42-perpignan.png | Bin 0 -> 5912 bytes .../logo-42-perpignan.png:Zone.Identifier | 0 pong/static/styles.css | 721 ++++++++++ pong/static/styles.css:Zone.Identifier | 0 pong/urls.py | 16 + pong/urls.py:Zone.Identifier | 0 requirements.txt | 8 + requirements.txt:Zone.Identifier | 0 99 files changed, 7854 insertions(+) create mode 100644 .env:Zone.Identifier create mode 100644 .gitignore create mode 100644 .gitignore:Zone.Identifier create mode 100644 Dockerfile create mode 100644 Dockerfile:Zone.Identifier create mode 100644 config/logstash.conf create mode 100644 config/logstash.conf:Zone.Identifier create mode 100644 docker-compose.yml create mode 100644 docker-compose.yml:Zone.Identifier create mode 100644 env_template create mode 100644 env_template:Zone.Identifier create mode 100644 logs/172.31.141.12-1726534356068.log create mode 100644 logs/172.31.141.12-1726534356068.log:Zone.Identifier create mode 100644 logs/172.31.141.12-1726534693901.log create mode 100644 logs/172.31.141.12-1726534693901.log:Zone.Identifier create mode 100644 logs/172.31.141.12-1726536620868.log create mode 100644 logs/172.31.141.12-1726536620868.log:Zone.Identifier create mode 100644 logs/172.31.141.12-1726538690438.log create mode 100644 logs/172.31.141.12-1726538690438.log:Zone.Identifier create mode 100644 logs/172.31.141.12-1726541943958.log create mode 100644 logs/172.31.141.12-1726541943958.log:Zone.Identifier create mode 100644 logs/172.31.141.12-1726542449903.log create mode 100644 logs/172.31.141.12-1726542449903.log:Zone.Identifier create mode 100644 logs/172.31.141.12-1726543072083.log create mode 100644 logs/172.31.141.12-1726543072083.log:Zone.Identifier create mode 100644 logs/172.31.141.12-1726543851799.log create mode 100644 logs/172.31.141.12-1726543851799.log:Zone.Identifier create mode 100644 logs/django.log create mode 100644 logs/django.log:Zone.Identifier create mode 100644 logs/django_errors.log create mode 100644 logs/django_errors.log:Zone.Identifier create mode 100644 makefile create mode 100644 makefile:Zone.Identifier create mode 100644 manage.py create mode 100644 manage.py:Zone.Identifier create mode 100644 pong/__init__.py create mode 100644 pong/__init__.py:Zone.Identifier create mode 100644 pong/asgi.py create mode 100644 pong/asgi.py:Zone.Identifier create mode 100644 pong/game/__init__.py create mode 100644 pong/game/__init__.py:Zone.Identifier create mode 100644 pong/game/consumers.py create mode 100644 pong/game/consumers.py:Zone.Identifier create mode 100644 pong/game/game.py create mode 100644 pong/game/game.py:Zone.Identifier create mode 100644 pong/game/matchmaking.py create mode 100644 pong/game/matchmaking.py:Zone.Identifier create mode 100644 pong/game/migrations/0001_initial.py create mode 100644 pong/game/migrations/0001_initial.py:Zone.Identifier create mode 100644 pong/game/migrations/0002_alter_match_winner.py create mode 100644 pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier create mode 100644 pong/game/migrations/0003_alter_tournoi_date.py create mode 100644 pong/game/migrations/0003_alter_tournoi_date.py:Zone.Identifier create mode 100644 pong/game/migrations/__init__.py create mode 100644 pong/game/migrations/__init__.py:Zone.Identifier create mode 100644 pong/game/models.py create mode 100644 pong/game/models.py:Zone.Identifier create mode 100644 pong/game/routing.py create mode 100644 pong/game/routing.py:Zone.Identifier create mode 100644 pong/game/templates/pong/tournament_brackets.html create mode 100644 pong/game/templates/pong/tournament_brackets.html:Zone.Identifier create mode 100644 pong/game/templates/pong/tournament_waiting_room.html create mode 100644 pong/game/templates/pong/tournament_waiting_room.html:Zone.Identifier create mode 100644 pong/game/tournament.py create mode 100644 pong/game/tournament.py:Zone.Identifier create mode 100644 pong/game/urls.py create mode 100644 pong/game/urls.py:Zone.Identifier create mode 100644 pong/game/utils.py create mode 100644 pong/game/utils.py:Zone.Identifier create mode 100644 pong/game/views.py create mode 100644 pong/game/views.py:Zone.Identifier create mode 100644 pong/settings.py create mode 100644 pong/settings.py:Zone.Identifier create mode 100644 pong/static/burger.js create mode 100644 pong/static/burger.js:Zone.Identifier create mode 100644 pong/static/flags/de.svg create mode 100644 pong/static/flags/de.svg:Zone.Identifier create mode 100644 pong/static/flags/es.svg create mode 100644 pong/static/flags/es.svg:Zone.Identifier create mode 100644 pong/static/flags/fr.svg create mode 100644 pong/static/flags/fr.svg:Zone.Identifier create mode 100644 pong/static/flags/it.svg create mode 100644 pong/static/flags/it.svg:Zone.Identifier create mode 100644 pong/static/flags/us.svg create mode 100644 pong/static/flags/us.svg:Zone.Identifier create mode 100644 pong/static/game.js create mode 100644 pong/static/game.js:Zone.Identifier create mode 100644 pong/static/index.html create mode 100644 pong/static/index.html:Zone.Identifier create mode 100644 pong/static/language.js create mode 100644 pong/static/language.js:Zone.Identifier create mode 100644 pong/static/logo-42-perpignan.png create mode 100644 pong/static/logo-42-perpignan.png:Zone.Identifier create mode 100644 pong/static/styles.css create mode 100644 pong/static/styles.css:Zone.Identifier create mode 100644 pong/urls.py create mode 100644 pong/urls.py:Zone.Identifier create mode 100644 requirements.txt create mode 100644 requirements.txt:Zone.Identifier diff --git a/.env:Zone.Identifier b/.env:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c1624f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +venv/ +__pycache__/ +.env + diff --git a/.gitignore:Zone.Identifier b/.gitignore:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..42ff94d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM python:latest + +# Set environment variables +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 + +WORKDIR /transcendence + +RUN apt update && apt upgrade -y + +COPY requirements.txt . +COPY manage.py . + +RUN python3 -m venv venv +RUN venv/bin/pip3 install --upgrade pip +RUN venv/bin/pip3 install --no-cache-dir -r requirements.txt + +EXPOSE 8080 diff --git a/Dockerfile:Zone.Identifier b/Dockerfile:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/config/logstash.conf b/config/logstash.conf new file mode 100644 index 0000000..329a522 --- /dev/null +++ b/config/logstash.conf @@ -0,0 +1,28 @@ +input { + file { + path => "/usr/share/logstash/logs/django.log" + start_position => "beginning" + sincedb_path => "/dev/null" + codec => "json" + } +} + +filter { + json { + source => "message" + target => "json_message" + } +} + +output { + elasticsearch { + hosts => ["https://es01:9200"] + user => "elastic" + password => "${ELASTIC_PASSWORD}" + ssl_enabled => true + ssl_certificate_authorities => "/usr/share/logstash/certs/ca/ca.crt" + ssl_verification_mode => "full" + index => "django-logs-%{+YYYY.MM.dd}" + } + stdout { codec => rubydebug } + } diff --git a/config/logstash.conf:Zone.Identifier b/config/logstash.conf:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..84a7e9a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,241 @@ + +services: + setup: + image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} + container_name: setup + user: "0" + volumes: + - certs:/usr/share/elasticsearch/config/certs + command: > + bash -c ' + if [ x${ELASTIC_PASSWORD} == x ]; then + echo "Set the ELASTIC_PASSWORD environment variable in the .env file"; + exit 1; + elif [ x${KIBANA_PASSWORD} == x ]; then + echo "Set the KIBANA_PASSWORD environment variable in the .env file"; + exit 1; + fi; + if [ ! -f config/certs/ca.zip ]; then + echo "Creating CA"; + bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip; + unzip config/certs/ca.zip -d config/certs; + fi; + if [ ! -f config/certs/certs.zip ]; then + echo "Creating certs"; + echo -ne \ + "instances:\n"\ + " - name: es01\n"\ + " dns:\n"\ + " - es01\n"\ + " - localhost\n"\ + " ip:\n"\ + " - 127.0.0.1\n"\ + " - name: kibana\n"\ + " dns:\n"\ + " - kibana\n"\ + " - localhost\n"\ + " ip:\n"\ + " - 127.0.0.1\n"\ + > config/certs/instances.yml; + + bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key; + unzip config/certs/certs.zip -d config/certs; + fi; + + echo "Setting file permissions" + chown -R root:root config/certs; + find . -type d -exec chmod 750 \{\} \;; + find . -type f -exec chmod 640 \{\} \;; + + echo "Waiting for Elasticsearch availability"; + until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done; + echo "Setting kibana_system password"; + until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done; + echo "All done!"; + ' + healthcheck: + test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"] + interval: 1s + timeout: 5s + retries: 120 + + backend: + build: + context: . + dockerfile: Dockerfile + image: backend + container_name: backend + restart: always + command: /bin/sh -c "sleep 5 && + venv/bin/python manage.py makemigrations --noinput && + venv/bin/python manage.py migrate --noinput && + venv/bin/python manage.py collectstatic --noinput && + venv/bin/daphne -b 0.0.0.0 -p 8080 pong.asgi:application" + volumes: + - pong:/transcendence/pong + - pong_django_logs:/transcendence/logs + ports: + - 8080:8080 + networks: + - app-network + environment: + DB_HOST: db + DB_PORT: 5432 + DB_NAME: ${POSTGRES_DB} + DB_USER: ${POSTGRES_USER} + DB_PASSWORD: ${POSTGRES_PASSWORD} + depends_on: + - db + healthcheck: + test: ["CMD-SHELL", "curl", "http://localhost:8080"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + + db: + image: postgres:latest + container_name: postgres + restart: always + volumes: + - pong_pg_data:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - app-network + environment: + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 5 + + es01: + image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} + container_name: es01 + depends_on: + setup: + condition: service_healthy + volumes: + - certs:/usr/share/elasticsearch/config/certs:ro + - pong_es_data_01:/usr/share/elasticsearch/data + labels: + co.elastic.logs/module: elasticsearch + ports: + - 9200:9200 + environment: + - node.name=es01 + - cluster.name=${CLUSTER_NAME} + - discovery.type=single-node + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + - bootstrap.memory_lock=true + - xpack.security.enabled=true + - xpack.security.http.ssl.enabled=true + - xpack.security.http.ssl.key=certs/es01/es01.key + - xpack.security.http.ssl.certificate=certs/es01/es01.crt + - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt + - xpack.security.transport.ssl.enabled=true + - xpack.security.transport.ssl.key=certs/es01/es01.key + - xpack.security.transport.ssl.certificate=certs/es01/es01.crt + - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt + - xpack.security.transport.ssl.verification_mode=certificate + - xpack.license.self_generated.type=${LICENSE} + healthcheck: + test: + [ + "CMD-SHELL", + "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'", + ] + interval: 10s + timeout: 10s + retries: 120 + + kibana: + image: docker.elastic.co/kibana/kibana:${STACK_VERSION} + container_name: kibana + labels: + co.elastic.logs/module: kibana + depends_on: + es01: + condition: service_healthy + volumes: + - certs:/usr/share/kibana/config/certs:ro + - pong_kibana:/usr/share/kibana/data + ports: + - 5601:5601 + environment: + - SERVERNAME=kibana + - ELASTICSEARCH_HOSTS=https://es01:9200 + - ELASTICSEARCH_USERNAME=${KIBANA_USERNAME} + - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} + - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt + - XPACK_SECURITY_ENCRYPTIONKEY=${ENCRYPTION_KEY} + - XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=${ENCRYPTION_KEY} + - XPACK_REPORTING_ENCRYPTIONKEY=${ENCRYPTION_KEY} + healthcheck: + test: + [ + "CMD-SHELL", + "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'" + ] + interval: 10s + timeout: 10s + retries: 120 + + logstash01: + image: docker.elastic.co/logstash/logstash:${STACK_VERSION} + container_name: logstash01 + labels: + co.elastic.logs/module: logstash + user: root + depends_on: + es01: + condition: service_healthy + kibana: + condition: service_healthy + volumes: + - certs:/usr/share/logstash/certs + - pong_logstash_data01:/usr/share/logstash/data + - ./config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro + - pong_django_logs:/usr/share/logstash/logs + ports: + - "5044:5044/udp" + command: logstash -f /usr/share/logstash/pipeline/logstash.conf + environment: + - NODE_NAME="logstash" + - ELASTIC_HOSTS=https://es01:9200 + - ELASTIC_USER=${ELASTIC_USERNAME} + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + - xpack.monitoring.enabled=false + +volumes: + pong: + driver: local + driver_opts: + type: none + device: ${PROJECT_PATH} + o: bind + pong_django_logs: + driver: local + driver_opts: + type: none + device: ${DJANGO_LOGS} + o: bind + pong_pg_data: + driver: local + pong_es_data_01: + driver: local + pong_kibana: + driver: local + pong_logstash_data01: + driver: local + certs: + driver: local + +networks: + app-network: + name: app-network + driver: bridge diff --git a/docker-compose.yml:Zone.Identifier b/docker-compose.yml:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/env_template b/env_template new file mode 100644 index 0000000..165b010 --- /dev/null +++ b/env_template @@ -0,0 +1,30 @@ +# Django settings +SECRET_KEY="FollowTheWhiteRabbit" +DEBUG=True +DJANGO_ALLOWED_HOSTS=['*'] + +# PostgreSQL settings +POSTGRES_DB=players_db +POSTGRES_USER=42student +POSTGRES_PASSWORD= + +# Django settings +DB_HOST=db +DB_PORT=5432 +PWD_PATH=${PWD} +PROJECT_PATH=${PWD_PATH}/pong + +# ElasticSearch settings +STACK_VERSION=8.14.3 +CLUSTER_NAME=docker-cluster +LICENSE=basic + +ELASTIC_USERNAME=elastic +ELASTIC_PASSWORD= + +# Kibana settings +KIBANA_PORT=5601 +KIBANA_USERNAME=kibana_system +KIBANA_PASSWORD= + +ENCRYPTION_KEY=c34d38b3a14956121ff2170e5030b471551370178f43e5626eec58b04a30fae2 diff --git a/env_template:Zone.Identifier b/env_template:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/172.31.141.12-1726534356068.log b/logs/172.31.141.12-1726534356068.log new file mode 100644 index 0000000..ced317b --- /dev/null +++ b/logs/172.31.141.12-1726534356068.log @@ -0,0 +1,53 @@ +: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:3 DOM fully loaded and parsed +game.js:43 DOM elements initialized +game.js:118 checkUserExists called with username: v +game.js:134 User existence check response: {exists: false} +game.js:143 handleRegister called +game.js:148 Nickname: v +game.js:149 Password: v +game.js:150 Confirm Password: v +game.js:154 Attempting to register user: v +game.js:156 Register result: {registered: true, token: '7ab181bc-7bf7-4ac0-a562-23e1c455ca23'} +game.js:160 Token stored: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 +game.js:161 User registered successfully +game.js:166 ChatManager initialized: null +game.js:168 Initializing ChatManager with username: v and token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 +game.js:732 ChatManager initialized for user: v +game.js:170 ChatManager initialized: ChatManager {username: 'v', token: '7ab181bc-7bf7-4ac0-a562-23e1c455ca23', roomSockets: {…}, blockedUsers: Array(0), activeRoom: null, …} +game.js:173 chatManager is defined: ChatManager {username: 'v', token: '7ab181bc-7bf7-4ac0-a562-23e1c455ca23', roomSockets: {…}, blockedUsers: Array(0), activeRoom: null, …} +game.js:178 Joining room: main_room +game.js:983 Joining room: main_room with username: v and token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 +game.js:991 Joining new room: main_room +game.js:910 createRoomTab: main_room with username: v and token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 +game.js:920 Tab for room main_room already exists. +game.js:933 Showing tab for room: main_room +game.js:747 Initializing chat WebSocket... +game.js:748 Initializing chat WebSocket for room: main_room with username: v +game.js:753 startChatWebSocket: main_room with username: v and token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 +game.js:1012 ChatInput initialized for room: main_room, username: v +game.js:945 Attempting to switch to room: main_room +game.js:951 Switching from room null to room main_room +game.js:759 WebSocket ouvert pour l'utilisateur v dans la room main_room +game.js:767 Authentication message sent for room: main_room with username: v +game.js:773 Message received from server in room main_room: {type: 'chat_message', username: 'v', message: 'Authentication successful', room: 'main_room'} +game.js:798 Message displayed in chat log for room: main_room +game.js:773 Message received from server in room main_room: {type: 'chat_message', username: 'f', message: 'Authentication successful', room: 'main_room'} +game.js:798 Message displayed in chat log for room: main_room +game.js:1019 Enter key pressed, attempting to send message... +game.js:1032 Attempting to send message: /s f +game.js:1045 Detected stats command for user: f +game.js:677 Fetching stats for user: f +game.js:1057 Message input cleared. +game.js:680 + + + POST http://172.31.141.12:8080/game_server/get_player_stats/ 404 (Not Found) +fetchPlayerStatsFromGameServer @ game.js:680 +sendMessage @ game.js:1046 +(anonymous) @ game.js:1020 +game.js:689 Failed to fetch stats for f. HTTP error! Status: 404 +fetchPlayerStatsFromGameServer @ game.js:689 +await in fetchPlayerStatsFromGameServer +sendMessage @ game.js:1046 +(anonymous) @ game.js:1020 diff --git a/logs/172.31.141.12-1726534356068.log:Zone.Identifier b/logs/172.31.141.12-1726534356068.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/172.31.141.12-1726534693901.log b/logs/172.31.141.12-1726534693901.log new file mode 100644 index 0000000..ab59820 --- /dev/null +++ b/logs/172.31.141.12-1726534693901.log @@ -0,0 +1,41 @@ +: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:3 DOM fully loaded and parsed +game.js:43 DOM elements initialized +game.js:118 checkUserExists called with username: g +game.js:134 User existence check response: {exists: true} +game.js:224 Initializing ChatManager... +game.js:732 ChatManager initialized for user: g +game.js:983 Joining room: main_room with username: g and token: 458f5428-2c48-4dbe-b126-815da541e7fb +game.js:991 Joining new room: main_room +game.js:910 createRoomTab: main_room with username: g and token: 458f5428-2c48-4dbe-b126-815da541e7fb +game.js:920 Tab for room main_room already exists. +game.js:933 Showing tab for room: main_room +game.js:747 Initializing chat WebSocket... +game.js:748 Initializing chat WebSocket for room: main_room with username: g +game.js:753 startChatWebSocket: main_room with username: g and token: 458f5428-2c48-4dbe-b126-815da541e7fb +game.js:1012 ChatInput initialized for room: main_room, username: g +game.js:945 Attempting to switch to room: main_room +game.js:951 Switching from room null to room main_room +game.js:759 WebSocket ouvert pour l'utilisateur g dans la room main_room +game.js:767 Authentication message sent for room: main_room with username: g +game.js:773 Message received from server in room main_room: {type: 'chat_message', username: 'g', message: 'Authentication successful', room: 'main_room'} +game.js:798 Message displayed in chat log for room: main_room +game.js:773 Message received from server in room main_room: {type: 'chat_message', username: 'h', message: 'Authentication successful', room: 'main_room'} +game.js:798 Message displayed in chat log for room: main_room +game.js:1019 Enter key pressed, attempting to send message... +game.js:1032 Attempting to send message: /s h +game.js:1045 Detected stats command for user: h +game.js:677 Fetching stats for user: h +game.js:1057 Message input cleared. +game.js:680 + + + POST http://172.31.141.12:8080/get_player_stats/ 404 (Not Found) +fetchPlayerStatsFromGameServer @ game.js:680 +sendMessage @ game.js:1046 +(anonymous) @ game.js:1020 +game.js:689 Failed to fetch stats for h. HTTP error! Status: 404 +fetchPlayerStatsFromGameServer @ game.js:689 +await in fetchPlayerStatsFromGameServer +sendMessage @ game.js:1046 +(anonymous) @ game.js:1020 diff --git a/logs/172.31.141.12-1726534693901.log:Zone.Identifier b/logs/172.31.141.12-1726534693901.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/172.31.141.12-1726536620868.log b/logs/172.31.141.12-1726536620868.log new file mode 100644 index 0000000..00bd860 --- /dev/null +++ b/logs/172.31.141.12-1726536620868.log @@ -0,0 +1,6 @@ +get_player_stats/:1 + + + GET http://172.31.141.12:8080/get_player_stats/ 405 (Method Not Allowed) +get_player_stats/: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. +get_player_stats/: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. diff --git a/logs/172.31.141.12-1726536620868.log:Zone.Identifier b/logs/172.31.141.12-1726536620868.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/172.31.141.12-1726538690438.log b/logs/172.31.141.12-1726538690438.log new file mode 100644 index 0000000..09e9c0e --- /dev/null +++ b/logs/172.31.141.12-1726538690438.log @@ -0,0 +1,33 @@ +: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:3 DOM fully loaded and parsed +game.js:43 DOM elements initialized +game.js:118 checkUserExists called with username: vv +game.js:134 User existence check response: {exists: true} +game.js:224 Initializing ChatManager... +game.js:748 ChatManager initialized for user: vv +game.js:999 Joining room: main_room with username: vv and token: 51edbeca-570d-4536-b81d-4eaa64051300 +game.js:1007 Joining new room: main_room +game.js:926 createRoomTab: main_room with username: vv and token: 51edbeca-570d-4536-b81d-4eaa64051300 +game.js:936 Tab for room main_room already exists. +game.js:949 Showing tab for room: main_room +game.js:763 Initializing chat WebSocket... +game.js:764 Initializing chat WebSocket for room: main_room with username: vv +game.js:769 startChatWebSocket: main_room with username: vv and token: 51edbeca-570d-4536-b81d-4eaa64051300 +game.js:1042 ChatInput initialized for room: main_room, username: vv +game.js:961 Attempting to switch to room: main_room +game.js:967 Switching from room null to room main_room +game.js:775 WebSocket ouvert pour l'utilisateur vv dans la room main_room +game.js:783 Authentication message sent for room: main_room with username: vv +game.js:789 Message received from server in room main_room: {type: 'chat_message', username: 'vv', message: 'Authentication successful', room: 'main_room'} +game.js:814 Message displayed in chat log for room: main_room +game.js:1049 Enter key pressed, attempting to send message... +game.js:1062 Attempting to send message: /s v +game.js:1075 Detected stats command for user: v +game.js:721 Player stats not loaded yet. Fetching all player stats... +game.js:1087 Message input cleared. +game.js:708 All player stats received: {players: Array(0)} +game.js:732 Player with username v not found. +getPlayerStatsByUsername @ game.js:732 +await in getPlayerStatsByUsername +sendMessage @ game.js:1076 +(anonymous) @ game.js:1050 diff --git a/logs/172.31.141.12-1726538690438.log:Zone.Identifier b/logs/172.31.141.12-1726538690438.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/172.31.141.12-1726541943958.log b/logs/172.31.141.12-1726541943958.log new file mode 100644 index 0000000..c542c00 --- /dev/null +++ b/logs/172.31.141.12-1726541943958.log @@ -0,0 +1,47 @@ +: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:3 DOM fully loaded and parsed +game.js:43 DOM elements initialized +game.js:118 checkUserExists called with username: x +game.js:134 User existence check response: {exists: false} +game.js:143 handleRegister called +game.js:148 Nickname: x +game.js:149 Password: x +game.js:150 Confirm Password: x +game.js:154 Attempting to register user: x +game.js:156 Register result: {registered: true, token: '7dfe4c69-eaf0-49ca-b914-3f69bc9dda57'} +game.js:160 Token stored: 7dfe4c69-eaf0-49ca-b914-3f69bc9dda57 +game.js:161 User registered successfully +game.js:166 ChatManager initialized: null +game.js:168 Initializing ChatManager with username: x and token: 7dfe4c69-eaf0-49ca-b914-3f69bc9dda57 +game.js:753 ChatManager initialized for user: x +game.js:170 ChatManager initialized: ChatManager {username: 'x', token: '7dfe4c69-eaf0-49ca-b914-3f69bc9dda57', roomSockets: {…}, blockedUsers: Array(0), activeRoom: null, …} +game.js:173 chatManager is defined: ChatManager {username: 'x', token: '7dfe4c69-eaf0-49ca-b914-3f69bc9dda57', roomSockets: {…}, blockedUsers: Array(0), activeRoom: null, …} +game.js:178 Joining room: main_room +game.js:1018 Joining room: main_room with username: x and token: 7dfe4c69-eaf0-49ca-b914-3f69bc9dda57 +game.js:1026 Joining new room: main_room +game.js:945 createRoomTab: main_room with username: x and token: 7dfe4c69-eaf0-49ca-b914-3f69bc9dda57 +game.js:955 Tab for room main_room already exists. +game.js:968 Showing tab for room: main_room +game.js:782 Initializing chat WebSocket... +game.js:783 Initializing chat WebSocket for room: main_room with username: x +game.js:788 startChatWebSocket: main_room with username: x and token: 7dfe4c69-eaf0-49ca-b914-3f69bc9dda57 +game.js:1061 ChatInput initialized for room: main_room, username: x +game.js:980 Attempting to switch to room: main_room +game.js:986 Switching from room null to room main_room +game.js:794 WebSocket ouvert pour l'utilisateur x dans la room main_room +game.js:802 Authentication message sent for room: main_room with username: x +game.js:808 Message received from server in room main_room: {type: 'chat_message', username: 'x', message: 'Authentication successful', room: 'main_room'} +game.js:833 Message displayed in chat log for room: main_room +game.js:808 Message received from server in room main_room: {type: 'chat_message', username: 'w', message: 'Authentication successful', room: 'main_room'} +game.js:833 Message displayed in chat log for room: main_room +game.js:1068 Enter key pressed, attempting to send message... +game.js:1081 Attempting to send message: /s w +game.js:1094 Detected stats command for user: w +game.js:660 Detected stats command for user: w +game.js:663 Uncaught ReferenceError: fetchPlayers is not defined + at sendStatsCommand (game.js:663:6) + at ChatInput.sendMessage (game.js:1095:6) + at HTMLInputElement. (game.js:1069:11) +sendStatsCommand @ game.js:663 +sendMessage @ game.js:1095 +(anonymous) @ game.js:1069 diff --git a/logs/172.31.141.12-1726541943958.log:Zone.Identifier b/logs/172.31.141.12-1726541943958.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/172.31.141.12-1726542449903.log b/logs/172.31.141.12-1726542449903.log new file mode 100644 index 0000000..f4037ae --- /dev/null +++ b/logs/172.31.141.12-1726542449903.log @@ -0,0 +1,46 @@ +: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:3 DOM fully loaded and parsed +game.js:43 DOM elements initialized +game.js:118 checkUserExists called with username: g +game.js:134 User existence check response: {exists: true} +game.js:224 Initializing ChatManager... +game.js:765 ChatManager initialized for user: g +game.js:1030 Joining room: main_room with username: g and token: 458f5428-2c48-4dbe-b126-815da541e7fb +game.js:1038 Joining new room: main_room +game.js:957 createRoomTab: main_room with username: g and token: 458f5428-2c48-4dbe-b126-815da541e7fb +game.js:967 Tab for room main_room already exists. +game.js:980 Showing tab for room: main_room +game.js:794 Initializing chat WebSocket... +game.js:795 Initializing chat WebSocket for room: main_room with username: g +game.js:800 startChatWebSocket: main_room with username: g and token: 458f5428-2c48-4dbe-b126-815da541e7fb +game.js:1073 ChatInput initialized for room: main_room, username: g +game.js:992 Attempting to switch to room: main_room +game.js:998 Switching from room null to room main_room +game.js:806 WebSocket ouvert pour l'utilisateur g dans la room main_room +game.js:814 Authentication message sent for room: main_room with username: g +game.js:820 Message received from server in room main_room: {type: 'chat_message', username: 'g', message: 'Authentication successful', room: 'main_room'} +game.js:845 Message displayed in chat log for room: main_room +game.js:820 Message received from server in room main_room: {type: 'chat_message', username: 'h', message: 'Authentication successful', room: 'main_room'} +game.js:845 Message displayed in chat log for room: main_room +game.js:820 Message received from server in room main_room: {type: 'chat_message', username: 'h', message: 'ggg', room: 'main_room'} +game.js:845 Message displayed in chat log for room: main_room +game.js:1080 Enter key pressed, attempting to send message... +game.js:1093 Attempting to send message: /s h +game.js:1106 Detected stats command for user: h +game.js:672 Detected stats command for user: h +game.js:659 Fetching players... +game.js:675 Uncaught TypeError: Cannot read properties of undefined (reading 'then') + at sendStatsCommand (game.js:675:20) + at ChatInput.sendMessage (game.js:1107:6) + at HTMLInputElement. (game.js:1081:11) +sendStatsCommand @ game.js:675 +sendMessage @ game.js:1107 +(anonymous) @ game.js:1081 +game.js:667 Error fetching match data: ReferenceError: displayPlayers is not defined + at game.js:664:21 +(anonymous) @ game.js:667 +Promise.catch +fetchPlayers @ game.js:667 +sendStatsCommand @ game.js:675 +sendMessage @ game.js:1107 +(anonymous) @ game.js:1081 diff --git a/logs/172.31.141.12-1726542449903.log:Zone.Identifier b/logs/172.31.141.12-1726542449903.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/172.31.141.12-1726543072083.log b/logs/172.31.141.12-1726543072083.log new file mode 100644 index 0000000..4a57504 --- /dev/null +++ b/logs/172.31.141.12-1726543072083.log @@ -0,0 +1,37 @@ +: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:3 DOM fully loaded and parsed +game.js:43 DOM elements initialized +game.js:118 checkUserExists called with username: h +game.js:134 User existence check response: {exists: true} +game.js:224 Initializing ChatManager... +game.js:753 ChatManager initialized for user: h +game.js:1018 Joining room: main_room with username: h and token: 27cda257-bf3c-4523-82e3-28bafd5a6ad2 +game.js:1026 Joining new room: main_room +game.js:945 createRoomTab: main_room with username: h and token: 27cda257-bf3c-4523-82e3-28bafd5a6ad2 +game.js:955 Tab for room main_room already exists. +game.js:968 Showing tab for room: main_room +game.js:782 Initializing chat WebSocket... +game.js:783 Initializing chat WebSocket for room: main_room with username: h +game.js:788 startChatWebSocket: main_room with username: h and token: 27cda257-bf3c-4523-82e3-28bafd5a6ad2 +game.js:1061 ChatInput initialized for room: main_room, username: h +game.js:980 Attempting to switch to room: main_room +game.js:986 Switching from room null to room main_room +game.js:794 WebSocket ouvert pour l'utilisateur h dans la room main_room +game.js:802 Authentication message sent for room: main_room with username: h +game.js:808 Message received from server in room main_room: {type: 'chat_message', username: 'h', message: 'Authentication successful', room: 'main_room'} +game.js:833 Message displayed in chat log for room: main_room +game.js:808 Message received from server in room main_room: {type: 'chat_message', username: 't', message: 'Authentication successful', room: 'main_room'} +game.js:833 Message displayed in chat log for room: main_room +game.js:1068 Enter key pressed, attempting to send message... +game.js:1081 Attempting to send message: /s t +game.js:1094 Detected stats command for user: t +game.js:660 Detected stats command for user: t +burger.js:79 Fetching players... +game.js:663 Uncaught TypeError: Cannot read properties of undefined (reading 'then') + at sendStatsCommand (game.js:663:20) + at ChatInput.sendMessage (game.js:1095:6) + at HTMLInputElement. (game.js:1069:11) +sendStatsCommand @ game.js:663 +sendMessage @ game.js:1095 +(anonymous) @ game.js:1069 +burger.js:136 Displaying players: diff --git a/logs/172.31.141.12-1726543072083.log:Zone.Identifier b/logs/172.31.141.12-1726543072083.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/172.31.141.12-1726543851799.log b/logs/172.31.141.12-1726543851799.log new file mode 100644 index 0000000..c07dbb4 --- /dev/null +++ b/logs/172.31.141.12-1726543851799.log @@ -0,0 +1,1223 @@ +: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:3 DOM fully loaded and parsed +game.js:43 DOM elements initialized +game.js:118 checkUserExists called with username: hhh +game.js:134 User existence check response: {exists: false} +game.js:143 handleRegister called +game.js:148 Nickname: hhh +game.js:149 Password: h +game.js:150 Confirm Password: h +game.js:154 Attempting to register user: hhh +game.js:156 Register result: {registered: true, token: '56c05ced-8b37-4179-9c9a-8f44db796351'} +game.js:160 Token stored: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:161 User registered successfully +game.js:166 ChatManager initialized: null +game.js:168 Initializing ChatManager with username: hhh and token: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:762 ChatManager initialized for user: hhh +game.js:170 ChatManager initialized: ChatManager {username: 'hhh', token: '56c05ced-8b37-4179-9c9a-8f44db796351', roomSockets: {…}, blockedUsers: Array(0), activeRoom: null, …} +game.js:173 chatManager is defined: ChatManager {username: 'hhh', token: '56c05ced-8b37-4179-9c9a-8f44db796351', roomSockets: {…}, blockedUsers: Array(0), activeRoom: null, …} +game.js:178 Joining room: main_room +game.js:1027 Joining room: main_room with username: hhh and token: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:1035 Joining new room: main_room +game.js:954 createRoomTab: main_room with username: hhh and token: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:964 Tab for room main_room already exists. +game.js:977 Showing tab for room: main_room +game.js:791 Initializing chat WebSocket... +game.js:792 Initializing chat WebSocket for room: main_room with username: hhh +game.js:797 startChatWebSocket: main_room with username: hhh and token: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:1070 ChatInput initialized for room: main_room, username: hhh +game.js:989 Attempting to switch to room: main_room +game.js:995 Switching from room null to room main_room +game.js:803 WebSocket ouvert pour l'utilisateur hhh dans la room main_room +game.js:811 Authentication message sent for room: main_room with username: hhh +game.js:817 Message received from server in room main_room: {type: 'chat_message', username: 'hhh', message: 'Authentication successful', room: 'main_room'} +game.js:842 Message displayed in chat log for room: main_room +game.js:817 Message received from server in room main_room: {type: 'chat_message', username: 'v', message: 'Authentication successful', room: 'main_room'} +game.js:842 Message displayed in chat log for room: main_room +game.js:1077 Enter key pressed, attempting to send message... +game.js:1090 Attempting to send message: /s v +game.js:1103 Detected stats command for user: v +game.js:660 Detected stats command for user: v +burger.js:79 Fetching players... +game.js:1115 Message input cleared. +burger.js:149 Displaying players: +game.js:669 Players received in sendStatsCommand: [] +game.js:677 Player with username v not found. +game.js:817 Message received from server in room main_room: {type: 'chat_message', username: 'er', message: 'Authentication successful', room: 'main_room'} +game.js:842 Message displayed in chat log for room: main_room +game.js:459 Token before WebSocket authentication: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:762 ChatManager initialized for user: hhh +game.js:1027 Joining room: tournament with username: hhh and token: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:1035 Joining new room: tournament +game.js:954 createRoomTab: tournament with username: hhh and token: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:964 Tab for room tournament already exists. +game.js:977 Showing tab for room: tournament +game.js:791 Initializing chat WebSocket... +game.js:792 Initializing chat WebSocket for room: tournament with username: hhh +game.js:797 startChatWebSocket: tournament with username: hhh and token: 56c05ced-8b37-4179-9c9a-8f44db796351 +game.js:1070 ChatInput initialized for room: tournament, username: hhh +game.js:989 Attempting to switch to room: tournament +game.js:995 Switching from room main_room to room tournament +game.js:1000 Hiding chat log for previous room: main_room +game.js:473 Starting WebSocket connection for tournament... +game.js:803 WebSocket ouvert pour l'utilisateur hhh dans la room tournament +game.js:811 Authentication message sent for room: tournament with username: hhh +game.js:817 Message received from server in room tournament: {type: 'chat_message', username: 'hhh', message: 'Authentication successful', room: 'tournament'} +game.js:842 Message displayed in chat log for room: tournament +game.js:486 WebSocket connection established +game.js:494 Sending token for a tournament game +game.js:502 Authentication successful +game.js:525 Start TOURNAMENT sent.. +game.js:539 Prochain match du tournoi: Prochain match: er contre v +game.js:506 Game started: 2 ( hhh vs BOT ) +game.js:514 Game ended: 2 +game.js:817 Message received from server in room tournament: {type: 'chat_message', username: 'Server', message: 'Prochain match: er contre v', room: 'tournament'} +game.js:842 Message displayed in chat log for room: tournament +game.js:817 Message received from server in room tournament: {type: 'chat_message', username: 'Server', message: 'Prochain match: er contre v', room: 'tournament'} +game.js:842 Message displayed in chat log for room: tournament +game.js:539 Prochain match du tournoi: Prochain match: v contre hhh +game.js:506 Game started: 3 ( v vs hhh ) +game.js:589 Rendering game state... +game.js:817 Message received from server in room tournament: {type: 'chat_message', username: 'Server', message: 'Prochain match: v contre hhh', room: 'tournament'} +game.js:842 Message displayed in chat log for room: tournament +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +172.31.141.12/:1 Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:589 Rendering game state... +game.js:514 Game ended: 3 +game.js:536 Tournament ended, the winner is: hhh +game.js:817 Message received from server in room tournament: {type: 'chat_message', username: 'v', message: 'fefe', room: 'tournament'} +game.js:842 Message displayed in chat log for room: tournament +game.js:566 Key pressed: Shift +game.js:566 Key pressed: / +game.js:566 Key pressed: s +game.js:573 Sending key press: s +game.js:566 Key pressed: +game.js:566 Key pressed: h +game.js:566 Key pressed: h +game.js:566 Key pressed: h +game.js:566 Key pressed: Enter +game.js:1077 Enter key pressed, attempting to send message... +game.js:1090 Attempting to send message: /s hhh +game.js:1103 Detected stats command for user: hhh +game.js:660 Detected stats command for user: hhh +burger.js:79 Fetching players... +game.js:1115 Message input cleared. +burger.js:149 Displaying players: +game.js:669 Players received in sendStatsCommand: (4) [{…}, {…}, {…}, {…}] +game.js:716 Displaying player stats: {username: 'hhh', total_matches: '2', total_wins: '2', win_percentage: '100.00', best_score: '3.00'} +game.js:722 Creating stats popup element diff --git a/logs/172.31.141.12-1726543851799.log:Zone.Identifier b/logs/172.31.141.12-1726543851799.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/django.log b/logs/django.log new file mode 100644 index 0000000..44e02ca --- /dev/null +++ b/logs/django.log @@ -0,0 +1,646 @@ +{"asctime": "2024-09-16 23:57:14,639", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140470074116992, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-16 23:57:14,643", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140470074116992, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-16 23:57:14,643", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140470074116992, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-16 23:57:14,643", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140470074116992, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-16 23:57:14,644", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140470074116992, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-16 23:57:55,073", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:57:55,075", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'f', 'token': 'f07626a9-d73e-4dcc-b593-93210b8488c1', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:57:55,075", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Authentification demand\u00e9e pour f", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:57:55,076", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Tentative d'authentification avec le token: f07626a9-d73e-4dcc-b593-93210b8488c1 pour l'utilisateur: f", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:57:55,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Utilisateur f authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:57:55,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Envoi d'un message de type authenticated de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:57:55,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Connexion de l'utilisateur \u00e0 son groupe personnel", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:57:55,083", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:58:02,314", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:02,315", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'r', 'token': '6afe3461-2876-4e6c-a3b8-95ad640922f3', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:02,315", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Authentification demand\u00e9e pour r", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:02,315", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Tentative d'authentification avec le token: 6afe3461-2876-4e6c-a3b8-95ad640922f3 pour l'utilisateur: r", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:02,321", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Utilisateur r authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:02,321", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Envoi d'un message de type authenticated de r dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:02,321", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Connexion de l'utilisateur \u00e0 son groupe personnel", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:02,321", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Diffusion d'un message de r \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:58:02,321", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Diffusion d'un message de r \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:04,857", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'r', 'message': 'ggrg', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:04,857", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Message de chat envoy\u00e9 par r: ggrg", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:04,857", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Envoi d'un message de type chat_message de r dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:04,857", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Diffusion d'un message de r \u00e0 la room main_room: ggrg", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:58:04,857", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Diffusion d'un message de r \u00e0 la room main_room: ggrg", "taskName": "Task-111"} +{"asctime": "2024-09-16 23:58:15,112", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Message re\u00e7u: {'type': 'get_player_stats', 'username': 'f', 'target_user': 'f', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:58:15,112", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "receive server get_player_stats{'type': 'get_player_stats', 'username': 'f', 'target_user': 'f', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-16 23:58:15,112", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140470074116992, "message": "Demande de statistiques pour f", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:01:59,877", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140101090810752, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 00:01:59,879", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140101090810752, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:01:59,879", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140101090810752, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 00:01:59,880", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140101090810752, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:01:59,880", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140101090810752, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 00:09:20,424", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:20,425", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:20,425", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:20,425", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:20,432", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:20,432", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:20,433", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Connexion de l'utilisateur \u00e0 son groupe personnel", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:20,433", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:27,387", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:27,389", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 't', 'token': 'bc21e611-b859-46dd-b45f-f181913a7689', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:27,389", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Authentification demand\u00e9e pour t", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:27,389", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Tentative d'authentification avec le token: bc21e611-b859-46dd-b45f-f181913a7689 pour l'utilisateur: t", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:27,395", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Utilisateur t authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:27,395", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type authenticated de t dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:27,395", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Connexion de l'utilisateur \u00e0 son groupe personnel", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:27,395", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:27,395", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:30,135", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 't', 'message': 'gtg', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:30,135", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message de chat envoy\u00e9 par t: gtg", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:30,135", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type chat_message de t dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:30,135", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room main_room: gtg", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:30,135", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room main_room: gtg", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:34,093", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'g', 'message': 'gtgtg', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:34,093", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message de chat envoy\u00e9 par g: gtgtg", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:34,093", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type chat_message de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:34,093", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de g \u00e0 la room main_room: gtgtg", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:34,093", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de g \u00e0 la room main_room: gtgtg", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:09:41,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'get_player_stats', 'username': 'g', 'target_user': 't', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:41,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "receive server get_player_stats{'type': 'get_player_stats', 'username': 'g', 'target_user': 't', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:09:41,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Demande de statistiques pour t", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:13:51,021", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'g', 'target_user': 't', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:13:51,021", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Invitation envoy\u00e9e de g \u00e0 t dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:13:51,021", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:13:51,022", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de server \u00e0 la room main_room: g a invit\u00e9 t \u00e0 rejoindre une partie main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:13:51,022", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de server \u00e0 la room main_room: g a invit\u00e9 t \u00e0 rejoindre une partie main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:13:51,022", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=g, Room=main_room, Message=g vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:13:51,022", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=g, Room=main_room, Message=g vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:13:56,691", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 't', 'response': 'yes', 'inviter': 'g', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:13:56,691", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "t a r\u00e9pondu 'yes' \u00e0 l'invitation de g", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:13:56,691", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:13:56,692", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de server \u00e0 la room main_room: t a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:13:56,692", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de server \u00e0 la room main_room: t a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:13:56,692", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=t a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=g", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:13:56,692", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=t a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=g", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:13:56,738", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:56,739", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'quick_match'}", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:56,740", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:56,740", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:56,746", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:56,746", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type authenticated de g dans la room quick_match", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:56,746", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Connexion de l'utilisateur \u00e0 son groupe personnel", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:56,746", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de g \u00e0 la room quick_match: Authentication successful", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:58,707", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:13:58,708", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 't', 'token': 'bc21e611-b859-46dd-b45f-f181913a7689', 'room': 'quick_match'}", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:13:58,708", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Authentification demand\u00e9e pour t", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:13:58,709", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Tentative d'authentification avec le token: bc21e611-b859-46dd-b45f-f181913a7689 pour l'utilisateur: t", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:13:58,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Utilisateur t authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:13:58,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type authenticated de t dans la room quick_match", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:13:58,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Connexion de l'utilisateur \u00e0 son groupe personnel", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:13:58,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room quick_match: Authentication successful", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:13:58,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room quick_match: Authentication successful", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:14:57,965", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 't', 'message': 'y(y(', 'room': 'quick_match'}", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:14:57,965", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message de chat envoy\u00e9 par t: y(y(", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:14:57,965", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type chat_message de t dans la room quick_match", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:14:57,965", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room quick_match: y(y(", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:14:57,965", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room quick_match: y(y(", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:10,433", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 't', 'message': 'rgrgrg', 'room': 'quick_match'}", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:10,433", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message de chat envoy\u00e9 par t: rgrgrg", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:10,433", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type chat_message de t dans la room quick_match", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:10,433", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room quick_match: rgrgrg", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:17:10,433", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room quick_match: rgrgrg", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:12,702", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 't', 'message': 'grgrg', 'room': 'quick_match'}", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:12,702", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message de chat envoy\u00e9 par t: grgrg", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:12,702", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type chat_message de t dans la room quick_match", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:12,702", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room quick_match: grgrg", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:17:12,702", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de t \u00e0 la room quick_match: grgrg", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:16,524", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'g', 'message': 'grgrgr', 'room': 'quick_match'}", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:17:16,524", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message de chat envoy\u00e9 par g: grgrgr", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:17:16,524", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Envoi d'un message de type chat_message de g dans la room quick_match", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:17:16,524", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de g \u00e0 la room quick_match: grgrgr", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:17:16,524", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Diffusion d'un message de g \u00e0 la room quick_match: grgrgr", "taskName": "Task-147"} +{"asctime": "2024-09-17 00:17:23,133", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Message re\u00e7u: {'type': 'get_player_stats', 'username': 'g', 'target_user': 't', 'room': 'quick_match'}", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:17:23,133", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "receive server get_player_stats{'type': 'get_player_stats', 'username': 'g', 'target_user': 't', 'room': 'quick_match'}", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:17:23,133", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140101090810752, "message": "Demande de statistiques pour t", "taskName": "Task-135"} +{"asctime": "2024-09-17 00:20:32,895", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139898143828864, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 00:20:32,898", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139898143828864, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:20:32,898", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139898143828864, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 00:20:32,898", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139898143828864, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:20:32,899", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139898143828864, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 00:24:25,510", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:25,511", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:25,512", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:25,512", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:25,518", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:25,518", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:25,518", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:32,367", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:32,370", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:32,370", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:32,370", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:32,376", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:32,376", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:32,376", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:32,376", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:53,844", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type chat_message de g dans la room main_room", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:53,844", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "g d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-107"} +{"asctime": "2024-09-17 00:24:53,844", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: g a quitt\u00e9 le chat", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:58,514", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:24:58,516", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'gh', 'token': 'fee1a4d7-fd93-42c7-bc6a-f04eb732c959', 'room': 'main_room'}", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:24:58,516", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Authentification demand\u00e9e pour gh", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:24:58,516", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Tentative d'authentification avec le token: fee1a4d7-fd93-42c7-bc6a-f04eb732c959 pour l'utilisateur: gh", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:24:58,523", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Utilisateur gh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:24:58,523", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type authenticated de gh dans la room main_room", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:24:58,523", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de gh \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:24:58,523", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de gh \u00e0 la room main_room: Authentication successful", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:25:05,099", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'gh', 'message': 'g', 'room': 'main_room'}", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:25:05,099", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message de chat envoy\u00e9 par gh: g", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:25:05,099", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type chat_message de gh dans la room main_room", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:25:05,100", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de gh \u00e0 la room main_room: g", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:25:05,100", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de gh \u00e0 la room main_room: g", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:25:14,013", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'g', 'target_user': 'gh', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:25:14,013", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Erreur lors de la r\u00e9ception du message: 'ChatConsumer' object has no attribute 'handle_invite_user'", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:25:14,013", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:25:14,013", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:25:14,013", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:28:39,186", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type chat_message de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:28:39,186", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "g d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:28:39,187", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: g a quitt\u00e9 le chat", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:28:42,216", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:42,218", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:42,218", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:42,218", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:42,224", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:42,224", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:42,224", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:28:42,224", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:45,683", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type chat_message de gh dans la room main_room", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:28:45,683", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "gh d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-167"} +{"asctime": "2024-09-17 00:28:45,683", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de gh \u00e0 la room main_room: gh a quitt\u00e9 le chat", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:47,993", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:47,996", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:47,996", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:47,996", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:48,002", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:48,002", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:48,002", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:28:48,002", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:59,474", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type chat_message de g dans la room main_room", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:59,474", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "g d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-293"} +{"asctime": "2024-09-17 00:28:59,474", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de g \u00e0 la room main_room: g a quitt\u00e9 le chat", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:29:03,010", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-313"} +{"asctime": "2024-09-17 00:29:03,011", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'rr', 'token': '10d0e58a-fb1c-4e35-9b9f-a7c607389978', 'room': 'main_room'}", "taskName": "Task-313"} +{"asctime": "2024-09-17 00:29:03,012", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Authentification demand\u00e9e pour rr", "taskName": "Task-313"} +{"asctime": "2024-09-17 00:29:03,012", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Tentative d'authentification avec le token: 10d0e58a-fb1c-4e35-9b9f-a7c607389978 pour l'utilisateur: rr", "taskName": "Task-313"} +{"asctime": "2024-09-17 00:29:03,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Utilisateur rr authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-313"} +{"asctime": "2024-09-17 00:29:03,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type authenticated de rr dans la room main_room", "taskName": "Task-313"} +{"asctime": "2024-09-17 00:29:03,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de rr \u00e0 la room main_room: Authentication successful", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:29:03,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de rr \u00e0 la room main_room: Authentication successful", "taskName": "Task-313"} +{"asctime": "2024-09-17 00:29:19,530", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'g', 'target_user': 'g', 'room': 'main_room'}", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:29:19,530", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Erreur lors de la r\u00e9ception du message: 'ChatConsumer' object has no attribute 'handle_invite_user'", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:29:19,530", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:29:19,530", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-233"} +{"asctime": "2024-09-17 00:29:19,530", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139898143828864, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-313"} +{"asctime": "2024-09-17 00:29:56,594", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140543003798400, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 00:29:56,597", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140543003798400, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:29:56,598", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140543003798400, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 00:29:56,598", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140543003798400, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:29:56,598", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140543003798400, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 00:51:22,030", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140414039497600, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 00:51:22,034", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140414039497600, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:51:22,034", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140414039497600, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 00:51:22,034", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140414039497600, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:51:22,035", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140414039497600, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 00:52:02,455", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:52:02,457", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'v', 'token': '7ab181bc-7bf7-4ac0-a562-23e1c455ca23', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:52:02,457", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Authentification demand\u00e9e pour v", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:52:02,457", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Tentative d'authentification avec le token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 pour l'utilisateur: v", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:52:02,466", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Utilisateur v authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:52:02,466", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Envoi d'un message de type authenticated de v dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:52:02,466", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Diffusion d'un message de v \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:52:10,311", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:52:10,313", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'f', 'token': 'f07626a9-d73e-4dcc-b593-93210b8488c1', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:52:10,313", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Authentification demand\u00e9e pour f", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:52:10,313", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Tentative d'authentification avec le token: f07626a9-d73e-4dcc-b593-93210b8488c1 pour l'utilisateur: f", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:52:10,319", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Utilisateur f authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:52:10,319", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Envoi d'un message de type authenticated de f dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:52:10,319", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:52:10,319", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140414039497600, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:56:23,667", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139958940711808, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 00:56:23,670", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139958940711808, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:56:23,670", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139958940711808, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 00:56:23,670", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139958940711808, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 00:56:23,670", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139958940711808, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 00:56:55,420", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:56:55,422", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:56:55,423", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:56:55,423", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:56:55,429", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:56:55,429", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:56:55,429", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:57:02,080", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:57:02,081", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'h', 'token': '27cda257-bf3c-4523-82e3-28bafd5a6ad2', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:57:02,081", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Authentification demand\u00e9e pour h", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:57:02,081", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Tentative d'authentification avec le token: 27cda257-bf3c-4523-82e3-28bafd5a6ad2 pour l'utilisateur: h", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:57:02,087", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Utilisateur h authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:57:02,087", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Envoi d'un message de type authenticated de h dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 00:57:02,087", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 00:57:02,088", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139958940711808, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:04:25,642", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140497234361216, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 01:04:25,645", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140497234361216, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:04:25,646", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140497234361216, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 01:04:25,646", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140497234361216, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:04:25,647", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140497234361216, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 01:05:02,446", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:05:02,448", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'f', 'token': 'f07626a9-d73e-4dcc-b593-93210b8488c1', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:05:02,449", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Authentification demand\u00e9e pour f", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:05:02,449", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Tentative d'authentification avec le token: f07626a9-d73e-4dcc-b593-93210b8488c1 pour l'utilisateur: f", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:05:02,455", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Utilisateur f authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:05:02,455", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Envoi d'un message de type authenticated de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:05:02,455", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:05:09,434", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:05:09,435", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:05:09,436", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:05:09,436", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:05:09,441", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:05:09,441", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:05:09,442", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:05:09,442", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:10:44,678", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Envoi d'un message de type chat_message de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:10:44,678", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "f d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:10:44,679", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140497234361216, "message": "Diffusion d'un message de f \u00e0 la room main_room: f a quitt\u00e9 le chat", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:14:12,351", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 19, "thread": 140501172603776, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 01:14:12,354", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 19, "thread": 140501172603776, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:14:12,355", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 19, "thread": 140501172603776, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 01:14:12,355", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 19, "thread": 140501172603776, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:14:12,355", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 19, "thread": 140501172603776, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 01:14:50,503", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-57"} +{"asctime": "2024-09-17 01:14:50,504", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 's', 'token': '5d799c48-7d21-45de-ba12-688121a2f460', 'room': 'main_room'}", "taskName": "Task-57"} +{"asctime": "2024-09-17 01:14:50,504", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Authentification demand\u00e9e pour s", "taskName": "Task-57"} +{"asctime": "2024-09-17 01:14:50,505", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Tentative d'authentification avec le token: 5d799c48-7d21-45de-ba12-688121a2f460 pour l'utilisateur: s", "taskName": "Task-57"} +{"asctime": "2024-09-17 01:14:50,512", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Utilisateur s authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-57"} +{"asctime": "2024-09-17 01:14:50,512", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Envoi d'un message de type authenticated de s dans la room main_room", "taskName": "Task-57"} +{"asctime": "2024-09-17 01:14:50,512", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Diffusion d'un message de s \u00e0 la room main_room: Authentication successful", "taskName": "Task-57"} +{"asctime": "2024-09-17 01:15:04,583", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-123"} +{"asctime": "2024-09-17 01:15:04,585", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'd', 'token': 'aac3ea82-e3cb-42fd-9747-5bfd776682f6', 'room': 'main_room'}", "taskName": "Task-123"} +{"asctime": "2024-09-17 01:15:04,585", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Authentification demand\u00e9e pour d", "taskName": "Task-123"} +{"asctime": "2024-09-17 01:15:04,585", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Tentative d'authentification avec le token: aac3ea82-e3cb-42fd-9747-5bfd776682f6 pour l'utilisateur: d", "taskName": "Task-123"} +{"asctime": "2024-09-17 01:15:04,591", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Utilisateur d authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-123"} +{"asctime": "2024-09-17 01:15:04,591", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Envoi d'un message de type authenticated de d dans la room main_room", "taskName": "Task-123"} +{"asctime": "2024-09-17 01:15:04,591", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Diffusion d'un message de d \u00e0 la room main_room: Authentication successful", "taskName": "Task-57"} +{"asctime": "2024-09-17 01:15:04,591", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140501172603776, "message": "Diffusion d'un message de d \u00e0 la room main_room: Authentication successful", "taskName": "Task-123"} +{"asctime": "2024-09-17 01:19:34,985", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140644560055168, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 01:19:34,988", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140644560055168, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:19:34,988", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140644560055168, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 01:19:34,988", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140644560055168, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:19:34,988", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140644560055168, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 01:21:08,795", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:08,797", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:08,797", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:08,797", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:08,803", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:08,803", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:08,804", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:11,104", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'g', 'message': 'grgrg', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:11,104", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Message de chat envoy\u00e9 par g: grgrg", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:11,104", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Envoi d'un message de type chat_message de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:11,105", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Diffusion d'un message de g \u00e0 la room main_room: grgrg", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:16,823", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:16,825", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'h', 'token': '27cda257-bf3c-4523-82e3-28bafd5a6ad2', 'room': 'main_room'}", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:16,825", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Authentification demand\u00e9e pour h", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:16,825", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Tentative d'authentification avec le token: 27cda257-bf3c-4523-82e3-28bafd5a6ad2 pour l'utilisateur: h", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:16,831", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Utilisateur h authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:16,831", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Envoi d'un message de type authenticated de h dans la room main_room", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:16,831", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:16,831", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:19,437", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'h', 'message': 'grg', 'room': 'main_room'}", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:19,437", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Message de chat envoy\u00e9 par h: grg", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:19,437", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Envoi d'un message de type chat_message de h dans la room main_room", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:21:19,437", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Diffusion d'un message de h \u00e0 la room main_room: grg", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:21:19,437", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140644560055168, "message": "Diffusion d'un message de h \u00e0 la room main_room: grg", "taskName": "Task-113"} +{"asctime": "2024-09-17 01:28:23,566", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139815095253888, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 01:28:23,568", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139815095253888, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:28:23,569", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139815095253888, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 01:28:23,569", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139815095253888, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:28:23,569", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139815095253888, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 01:28:54,351", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:28:54,354", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:28:54,355", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:28:54,355", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:28:54,368", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:28:54,368", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:28:54,369", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:29:00,173", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:00,176", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:00,176", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:00,176", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:00,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:00,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:00,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:29:00,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:06,439", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Envoi d'un message de type chat_message de g dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:06,439", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "g d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 01:29:06,439", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Diffusion d'un message de g \u00e0 la room main_room: g a quitt\u00e9 le chat", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:29:09,697", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-171"} +{"asctime": "2024-09-17 01:29:09,699", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'h', 'token': '27cda257-bf3c-4523-82e3-28bafd5a6ad2', 'room': 'main_room'}", "taskName": "Task-171"} +{"asctime": "2024-09-17 01:29:09,699", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Authentification demand\u00e9e pour h", "taskName": "Task-171"} +{"asctime": "2024-09-17 01:29:09,699", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Tentative d'authentification avec le token: 27cda257-bf3c-4523-82e3-28bafd5a6ad2 pour l'utilisateur: h", "taskName": "Task-171"} +{"asctime": "2024-09-17 01:29:09,704", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Utilisateur h authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-171"} +{"asctime": "2024-09-17 01:29:09,704", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Envoi d'un message de type authenticated de h dans la room main_room", "taskName": "Task-171"} +{"asctime": "2024-09-17 01:29:09,704", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:29:09,705", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-171"} +{"asctime": "2024-09-17 01:30:05,257", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Envoi d'un message de type chat_message de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:30:05,257", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "g d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 01:30:05,257", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139815095253888, "message": "Diffusion d'un message de g \u00e0 la room main_room: g a quitt\u00e9 le chat", "taskName": "Task-171"} +{"asctime": "2024-09-17 01:34:39,878", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140138464705408, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 01:34:39,880", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140138464705408, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:34:39,880", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140138464705408, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 01:34:39,881", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140138464705408, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:34:39,881", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140138464705408, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 01:54:47,762", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139966639004544, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 01:54:47,765", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139966639004544, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:54:47,765", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139966639004544, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 01:54:47,765", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139966639004544, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 01:54:47,766", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139966639004544, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 01:55:05,629", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:05,632", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'f', 'token': 'f07626a9-d73e-4dcc-b593-93210b8488c1', 'room': 'main_room'}", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:05,632", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Authentification demand\u00e9e pour f", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:05,632", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Tentative d'authentification avec le token: f07626a9-d73e-4dcc-b593-93210b8488c1 pour l'utilisateur: f", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:05,638", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Utilisateur f authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:05,638", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Envoi d'un message de type authenticated de f dans la room main_room", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:05,638", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:16,837", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'f', 'message': 'vfvfvf', 'room': 'main_room'}", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:16,837", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Message de chat envoy\u00e9 par f: vfvfvf", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:16,837", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Envoi d'un message de type chat_message de f dans la room main_room", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:16,838", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Diffusion d'un message de f \u00e0 la room main_room: vfvfvf", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:30,687", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-161"} +{"asctime": "2024-09-17 01:55:30,689", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'v', 'token': '7ab181bc-7bf7-4ac0-a562-23e1c455ca23', 'room': 'main_room'}", "taskName": "Task-161"} +{"asctime": "2024-09-17 01:55:30,690", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Authentification demand\u00e9e pour v", "taskName": "Task-161"} +{"asctime": "2024-09-17 01:55:30,690", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Tentative d'authentification avec le token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 pour l'utilisateur: v", "taskName": "Task-161"} +{"asctime": "2024-09-17 01:55:30,697", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Utilisateur v authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-161"} +{"asctime": "2024-09-17 01:55:30,697", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Envoi d'un message de type authenticated de v dans la room main_room", "taskName": "Task-161"} +{"asctime": "2024-09-17 01:55:30,697", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Diffusion d'un message de v \u00e0 la room main_room: Authentication successful", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:30,697", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Diffusion d'un message de v \u00e0 la room main_room: Authentication successful", "taskName": "Task-161"} +{"asctime": "2024-09-17 01:55:40,773", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-176"} +{"asctime": "2024-09-17 01:55:40,775", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'vv', 'token': '51edbeca-570d-4536-b81d-4eaa64051300', 'room': 'main_room'}", "taskName": "Task-176"} +{"asctime": "2024-09-17 01:55:40,775", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Authentification demand\u00e9e pour vv", "taskName": "Task-176"} +{"asctime": "2024-09-17 01:55:40,775", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Tentative d'authentification avec le token: 51edbeca-570d-4536-b81d-4eaa64051300 pour l'utilisateur: vv", "taskName": "Task-176"} +{"asctime": "2024-09-17 01:55:40,781", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Utilisateur vv authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-176"} +{"asctime": "2024-09-17 01:55:40,781", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Envoi d'un message de type authenticated de vv dans la room main_room", "taskName": "Task-176"} +{"asctime": "2024-09-17 01:55:40,782", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Diffusion d'un message de vv \u00e0 la room main_room: Authentication successful", "taskName": "Task-101"} +{"asctime": "2024-09-17 01:55:40,782", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Diffusion d'un message de vv \u00e0 la room main_room: Authentication successful", "taskName": "Task-161"} +{"asctime": "2024-09-17 01:55:40,782", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139966639004544, "message": "Diffusion d'un message de vv \u00e0 la room main_room: Authentication successful", "taskName": "Task-176"} +{"asctime": "2024-09-17 02:01:55,562", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140042042313600, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 02:01:55,565", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140042042313600, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 02:01:55,565", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140042042313600, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 02:01:55,566", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140042042313600, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 02:01:55,566", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140042042313600, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 02:04:20,296", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:04:20,298", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'v', 'token': '7ab181bc-7bf7-4ac0-a562-23e1c455ca23', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:04:20,298", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Authentification demand\u00e9e pour v", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:04:20,298", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Tentative d'authentification avec le token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 pour l'utilisateur: v", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:04:20,306", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Utilisateur v authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:04:20,306", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Envoi d'un message de type authenticated de v dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:04:20,306", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Diffusion d'un message de v \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:04:29,752", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:04:29,754", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'vv', 'token': '51edbeca-570d-4536-b81d-4eaa64051300', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:04:29,754", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Authentification demand\u00e9e pour vv", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:04:29,754", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Tentative d'authentification avec le token: 51edbeca-570d-4536-b81d-4eaa64051300 pour l'utilisateur: vv", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:04:29,760", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Utilisateur vv authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:04:29,760", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Envoi d'un message de type authenticated de vv dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:04:29,761", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Diffusion d'un message de vv \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:04:29,761", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140042042313600, "message": "Diffusion d'un message de vv \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:44:18,273", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139976896232320, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 02:44:18,276", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139976896232320, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 02:44:18,277", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139976896232320, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 02:44:18,277", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139976896232320, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 02:44:18,277", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139976896232320, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 02:44:59,147", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:44:59,155", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:44:59,155", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:44:59,155", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:44:59,169", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:44:59,170", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:44:59,170", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:45:08,888", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:45:08,889", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'gg', 'token': 'fd1f37e4-8cd2-4299-b940-4ffb3fc600be', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:45:08,889", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Authentification demand\u00e9e pour gg", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:45:08,889", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Tentative d'authentification avec le token: fd1f37e4-8cd2-4299-b940-4ffb3fc600be pour l'utilisateur: gg", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:45:08,895", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Utilisateur gg authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:45:08,895", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Envoi d'un message de type authenticated de gg dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:45:08,895", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Diffusion d'un message de gg \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:45:08,895", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139976896232320, "message": "Diffusion d'un message de gg \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:46:28,760", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140532491451264, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 02:46:28,763", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140532491451264, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 02:46:28,763", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140532491451264, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 02:46:28,763", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140532491451264, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 02:46:28,764", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140532491451264, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 02:48:11,381", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:48:11,384", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'b', 'token': '4771fa2b-e6e6-479d-91f0-e32b734e2772', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:48:11,384", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Authentification demand\u00e9e pour b", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:48:11,384", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Tentative d'authentification avec le token: 4771fa2b-e6e6-479d-91f0-e32b734e2772 pour l'utilisateur: b", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:48:11,390", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Utilisateur b authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:48:11,390", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Envoi d'un message de type authenticated de b dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:48:11,391", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Diffusion d'un message de b \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:48:18,058", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-107"} +{"asctime": "2024-09-17 02:48:18,059", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'bbb', 'token': '6c177713-0710-44fe-a9a0-a47a0fe2c05d', 'room': 'main_room'}", "taskName": "Task-107"} +{"asctime": "2024-09-17 02:48:18,059", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Authentification demand\u00e9e pour bbb", "taskName": "Task-107"} +{"asctime": "2024-09-17 02:48:18,059", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Tentative d'authentification avec le token: 6c177713-0710-44fe-a9a0-a47a0fe2c05d pour l'utilisateur: bbb", "taskName": "Task-107"} +{"asctime": "2024-09-17 02:48:18,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Utilisateur bbb authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-107"} +{"asctime": "2024-09-17 02:48:18,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Envoi d'un message de type authenticated de bbb dans la room main_room", "taskName": "Task-107"} +{"asctime": "2024-09-17 02:48:18,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Diffusion d'un message de bbb \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:48:18,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140532491451264, "message": "Diffusion d'un message de bbb \u00e0 la room main_room: Authentication successful", "taskName": "Task-107"} +{"asctime": "2024-09-17 02:54:20,920", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140430277794688, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 02:54:20,922", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140430277794688, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 02:54:20,922", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140430277794688, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 02:54:20,922", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140430277794688, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 02:54:20,923", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140430277794688, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 02:55:09,571", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:55:09,572", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'x', 'token': '7dfe4c69-eaf0-49ca-b914-3f69bc9dda57', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:55:09,573", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Authentification demand\u00e9e pour x", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:55:09,573", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Tentative d'authentification avec le token: 7dfe4c69-eaf0-49ca-b914-3f69bc9dda57 pour l'utilisateur: x", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:55:09,579", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Utilisateur x authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:55:09,579", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Envoi d'un message de type authenticated de x dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:55:09,579", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Diffusion d'un message de x \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:55:28,278", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:55:28,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'w', 'token': 'b8c3c3b3-cb7b-47a1-96ea-b711f3261b8f', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:55:28,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Authentification demand\u00e9e pour w", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:55:28,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Tentative d'authentification avec le token: b8c3c3b3-cb7b-47a1-96ea-b711f3261b8f pour l'utilisateur: w", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:55:28,285", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Utilisateur w authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:55:28,286", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Envoi d'un message de type authenticated de w dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 02:55:28,286", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Diffusion d'un message de w \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 02:55:28,286", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140430277794688, "message": "Diffusion d'un message de w \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:06:04,525", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140078757194624, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 03:06:04,528", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140078757194624, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:06:04,528", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140078757194624, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 03:06:04,528", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140078757194624, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:06:04,529", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140078757194624, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 03:06:43,073", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:06:43,075", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '458f5428-2c48-4dbe-b126-815da541e7fb', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:06:43,075", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:06:43,075", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Tentative d'authentification avec le token: 458f5428-2c48-4dbe-b126-815da541e7fb pour l'utilisateur: g", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:06:43,081", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:06:43,081", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:06:43,081", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:06:55,177", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:06:55,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'h', 'token': '27cda257-bf3c-4523-82e3-28bafd5a6ad2', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:06:55,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Authentification demand\u00e9e pour h", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:06:55,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Tentative d'authentification avec le token: 27cda257-bf3c-4523-82e3-28bafd5a6ad2 pour l'utilisateur: h", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:06:55,185", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Utilisateur h authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:06:55,185", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Envoi d'un message de type authenticated de h dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:06:55,185", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:06:55,185", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:07:04,854", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'h', 'message': 'ggg', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:07:04,855", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Message de chat envoy\u00e9 par h: ggg", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:07:04,855", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Envoi d'un message de type chat_message de h dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:07:04,855", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Diffusion d'un message de h \u00e0 la room main_room: ggg", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:07:04,855", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140078757194624, "message": "Diffusion d'un message de h \u00e0 la room main_room: ggg", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:16:39,371", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140181339794304, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 03:16:39,373", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140181339794304, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:16:39,374", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140181339794304, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 03:16:39,374", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140181339794304, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:16:39,374", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140181339794304, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 03:17:11,977", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:17:11,979", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'h', 'token': '27cda257-bf3c-4523-82e3-28bafd5a6ad2', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:17:11,980", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Authentification demand\u00e9e pour h", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:17:11,980", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Tentative d'authentification avec le token: 27cda257-bf3c-4523-82e3-28bafd5a6ad2 pour l'utilisateur: h", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:17:11,985", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Utilisateur h authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:17:11,986", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Envoi d'un message de type authenticated de h dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:17:11,986", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:17:18,652", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:17:18,653", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 't', 'token': 'bc21e611-b859-46dd-b45f-f181913a7689', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:17:18,654", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Authentification demand\u00e9e pour t", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:17:18,654", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Tentative d'authentification avec le token: bc21e611-b859-46dd-b45f-f181913a7689 pour l'utilisateur: t", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:17:18,659", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Utilisateur t authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:17:18,659", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Envoi d'un message de type authenticated de t dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:17:18,659", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Diffusion d'un message de t \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:17:18,659", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140181339794304, "message": "Diffusion d'un message de t \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:20:36,912", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140160577502080, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 03:20:36,914", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140160577502080, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:20:36,915", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140160577502080, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 03:20:36,915", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140160577502080, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:20:36,915", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140160577502080, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 03:21:19,993", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:19,995", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'f', 'token': 'f07626a9-d73e-4dcc-b593-93210b8488c1', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:19,995", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Authentification demand\u00e9e pour f", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:19,995", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Tentative d'authentification avec le token: f07626a9-d73e-4dcc-b593-93210b8488c1 pour l'utilisateur: f", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:20,001", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Utilisateur f authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:20,001", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Envoi d'un message de type authenticated de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:20,001", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:27,698", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:27,699", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'bb', 'token': 'a5baf89c-96e2-424a-81d2-6abebcf89894', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:27,699", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Authentification demand\u00e9e pour bb", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:27,700", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Tentative d'authentification avec le token: a5baf89c-96e2-424a-81d2-6abebcf89894 pour l'utilisateur: bb", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:27,705", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Utilisateur bb authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:27,705", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Envoi d'un message de type authenticated de bb dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:27,706", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Diffusion d'un message de bb \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:27,706", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Diffusion d'un message de bb \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:31,114", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'bb', 'message': 'vfvf', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:31,114", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Message de chat envoy\u00e9 par bb: vfvf", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:31,114", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Envoi d'un message de type chat_message de bb dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:21:31,114", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Diffusion d'un message de bb \u00e0 la room main_room: vfvf", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:21:31,115", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140160577502080, "message": "Diffusion d'un message de bb \u00e0 la room main_room: vfvf", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:23:53,623", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 19, "thread": 140242291706752, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 03:23:53,625", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 19, "thread": 140242291706752, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:23:53,626", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 19, "thread": 140242291706752, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 03:23:53,626", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 19, "thread": 140242291706752, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:23:53,626", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 19, "thread": 140242291706752, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 03:24:28,250", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:24:28,252", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hh', 'token': '05d20ffe-0893-427b-b1a0-4970cb52a315', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:24:28,252", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Authentification demand\u00e9e pour hh", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:24:28,252", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Tentative d'authentification avec le token: 05d20ffe-0893-427b-b1a0-4970cb52a315 pour l'utilisateur: hh", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:24:28,258", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Utilisateur hh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:24:28,258", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Envoi d'un message de type authenticated de hh dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:24:28,258", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Diffusion d'un message de hh \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:24:35,958", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:24:35,959", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hhhh', 'token': '672b6c16-2a2c-4fc3-86c2-48596b860ab0', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:24:35,959", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Authentification demand\u00e9e pour hhhh", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:24:35,959", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Tentative d'authentification avec le token: 672b6c16-2a2c-4fc3-86c2-48596b860ab0 pour l'utilisateur: hhhh", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:24:35,966", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Utilisateur hhhh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:24:35,966", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Envoi d'un message de type authenticated de hhhh dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:24:35,966", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Diffusion d'un message de hhhh \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:24:35,966", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 19, "thread": 140242291706752, "message": "Diffusion d'un message de hhhh \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:27:47,585", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 17, "thread": 139625619098496, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 03:27:47,588", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 17, "thread": 139625619098496, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:27:47,589", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 17, "thread": 139625619098496, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 03:27:47,589", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 17, "thread": 139625619098496, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 03:27:47,590", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 17, "thread": 139625619098496, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 03:28:27,226", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:28:27,230", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hhh', 'token': '56c05ced-8b37-4179-9c9a-8f44db796351', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:28:27,230", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Authentification demand\u00e9e pour hhh", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:28:27,230", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Tentative d'authentification avec le token: 56c05ced-8b37-4179-9c9a-8f44db796351 pour l'utilisateur: hhh", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:28:27,236", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Utilisateur hhh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:28:27,236", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type authenticated de hhh dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:28:27,237", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de hhh \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:28:39,043", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:28:39,045", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'v', 'token': '7ab181bc-7bf7-4ac0-a562-23e1c455ca23', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:28:39,045", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Authentification demand\u00e9e pour v", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:28:39,045", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Tentative d'authentification avec le token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 pour l'utilisateur: v", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:28:39,051", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Utilisateur v authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:28:39,051", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type authenticated de v dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:28:39,052", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de v \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:28:39,052", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de v \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:29:19,140", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:29:19,141", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'er', 'token': '19b3cba8-12e8-40d8-9921-23681df63884', 'room': 'main_room'}", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:29:19,141", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Authentification demand\u00e9e pour er", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:29:19,142", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Tentative d'authentification avec le token: 19b3cba8-12e8-40d8-9921-23681df63884 pour l'utilisateur: er", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:29:19,147", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Utilisateur er authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:29:19,147", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type authenticated de er dans la room main_room", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:29:19,147", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de er \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:29:19,147", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de er \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:29:19,148", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de er \u00e0 la room main_room: Authentication successful", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:29:20,030", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:20,031", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'er', 'token': '19b3cba8-12e8-40d8-9921-23681df63884', 'room': 'tournament'}", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:20,031", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Authentification demand\u00e9e pour er", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:20,032", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Tentative d'authentification avec le token: 19b3cba8-12e8-40d8-9921-23681df63884 pour l'utilisateur: er", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:20,038", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Utilisateur er authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:20,038", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type authenticated de er dans la room tournament", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:20,038", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de er \u00e0 la room tournament: Authentication successful", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:23,489", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:23,491", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'v', 'token': '7ab181bc-7bf7-4ac0-a562-23e1c455ca23', 'room': 'tournament'}", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:23,491", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Authentification demand\u00e9e pour v", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:23,491", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Tentative d'authentification avec le token: 7ab181bc-7bf7-4ac0-a562-23e1c455ca23 pour l'utilisateur: v", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:23,497", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Utilisateur v authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:23,497", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type authenticated de v dans la room tournament", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:23,497", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de v \u00e0 la room tournament: Authentication successful", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:23,497", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de v \u00e0 la room tournament: Authentication successful", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:26,080", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hhh', 'token': '56c05ced-8b37-4179-9c9a-8f44db796351', 'room': 'tournament'}", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Authentification demand\u00e9e pour hhh", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Tentative d'authentification avec le token: 56c05ced-8b37-4179-9c9a-8f44db796351 pour l'utilisateur: hhh", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,088", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Utilisateur hhh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,088", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type authenticated de hhh dans la room tournament", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,089", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de hhh \u00e0 la room tournament: Authentication successful", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:26,089", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de hhh \u00e0 la room tournament: Authentication successful", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:26,089", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de hhh \u00e0 la room tournament: Authentication successful", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,985", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: er contre v', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:26,985", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message de chat envoy\u00e9 par Server: Prochain match: er contre v", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:26,985", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:26,985", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: er contre v", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:26,985", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: er contre v", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:26,985", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: er contre v", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,986", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: er contre v', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,987", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message de chat envoy\u00e9 par Server: Prochain match: er contre v", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,987", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:26,987", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: er contre v", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:26,987", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: er contre v", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:26,987", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: er contre v", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:43,021", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: v contre hhh', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:43,021", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message de chat envoy\u00e9 par Server: Prochain match: v contre hhh", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:43,021", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:29:43,022", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: v contre hhh", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:29:43,022", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: v contre hhh", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:29:43,022", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: v contre hhh", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:30:21,753", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'v', 'message': 'fefe', 'room': 'tournament'}", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:30:21,754", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Message de chat envoy\u00e9 par v: fefe", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:30:21,754", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de v dans la room tournament", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:30:21,754", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de v \u00e0 la room tournament: fefe", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:30:21,754", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de v \u00e0 la room tournament: fefe", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:30:21,754", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Diffusion d'un message de v \u00e0 la room tournament: fefe", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:32:58,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de hhh dans la room tournament", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:32:58,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "hhh d\u00e9connect\u00e9 de la room tournament", "taskName": "Task-205"} +{"asctime": "2024-09-17 03:32:58,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de v dans la room tournament", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:32:58,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "v d\u00e9connect\u00e9 de la room tournament", "taskName": "Task-193"} +{"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de er dans la room main_room", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "er d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-174"} +{"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de v dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "v d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de hhh dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "hhh d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de er dans la room tournament", "taskName": "Task-182"} +{"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "er d\u00e9connect\u00e9 de la room tournament", "taskName": "Task-182"} diff --git a/logs/django.log:Zone.Identifier b/logs/django.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/logs/django_errors.log b/logs/django_errors.log new file mode 100644 index 0000000..e69de29 diff --git a/logs/django_errors.log:Zone.Identifier b/logs/django_errors.log:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/makefile b/makefile new file mode 100644 index 0000000..f225d68 --- /dev/null +++ b/makefile @@ -0,0 +1,56 @@ +COMPOSE_FILE=docker-compose.yml +COMPOSE=docker compose -f $(COMPOSE_FILE) +CONTAINER=$(c) + +up: down + $(COMPOSE) build + $(COMPOSE) up -d $(CONTAINER) || true + +build: + $(COMPOSE) build $(CONTAINER) + +start: + $(COMPOSE) start $(CONTAINER) + +stop: + $(COMPOSE) stop $(CONTAINER) + +down: + $(COMPOSE) down $(CONTAINER) + +destroy: + $(COMPOSE) down -v --rmi all + +kill-pid: + sudo lsof -i :5432 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true + sudo lsof -i :5601 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true + sudo lsof -i :9200 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true + sudo lsof -i :8080 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true + sudo lsof -i :5044 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true + +logs: + $(COMPOSE) logs -f $(CONTAINER) + +ps: + $(COMPOSE) ps + +db-shell: + $(COMPOSE) exec db psql -U 42student players_db + +re: destroy up + +help: + @echo "Usage:" + @echo " make build [c=service] # Build images" + @echo " make up [c=service] # Start containers in detached mode" + @echo " make start [c=service] # Start existing containers" + @echo " make down [c=service] # Stop and remove containers" + @echo " make destroy # Stop and remove containers and volumes" + @echo " make stop [c=service] # Stop containers" + @echo " make logs [c=service] # Tail logs of containers" + @echo " make ps # List containers" + @echo " make help # Show this help" + +.PHONY: up build start stop down destroy logs ps db-shell help + + diff --git a/makefile:Zone.Identifier b/makefile:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..252b26c --- /dev/null +++ b/manage.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pong.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + +if __name__ == '__main__': + main() diff --git a/manage.py:Zone.Identifier b/manage.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/__init__.py b/pong/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pong/__init__.py:Zone.Identifier b/pong/__init__.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/asgi.py b/pong/asgi.py new file mode 100644 index 0000000..903ead5 --- /dev/null +++ b/pong/asgi.py @@ -0,0 +1,31 @@ +# /pong/asgi.py + +""" +ASGI config for pong project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ +""" + +import os +import django + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pong.settings') +django.setup() + +from django.core.asgi import get_asgi_application +from channels.routing import ProtocolTypeRouter, URLRouter +from channels.auth import AuthMiddlewareStack +import pong.game.routing + +application = ProtocolTypeRouter({ + "http": get_asgi_application(), + "websocket": AuthMiddlewareStack( + URLRouter( + pong.game.routing.websocket_urlpatterns + ) + ), +}) + diff --git a/pong/asgi.py:Zone.Identifier b/pong/asgi.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/__init__.py b/pong/game/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/__init__.py:Zone.Identifier b/pong/game/__init__.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/consumers.py b/pong/game/consumers.py new file mode 100644 index 0000000..c5ee4ef --- /dev/null +++ b/pong/game/consumers.py @@ -0,0 +1,363 @@ +import json +from channels.generic.websocket import AsyncWebsocketConsumer +from asgiref.sync import sync_to_async +from django.contrib.auth.models import User +from channels.db import database_sync_to_async +from .matchmaking import match_maker +from .tournament import tournament_match_maker +from .models import Player +import asyncio +import logging + +logger = logging.getLogger(__name__) + +class GameConsumer(AsyncWebsocketConsumer): + async def connect(self): + await self.accept() + self.game = None + print("User connected") + + async def receive(self, text_data): + data = json.loads(text_data) + if data['type'] == 'authenticate': + await self.authenticate(data['token']) + elif data['type'] == 'authenticate2': + await self.authenticate2(data['token_1'], data['token_2']) + elif data['type'] == 'authenticate3': + await self.authenticate3(data['token']) + elif data['type'] == 'key_press': + if self.game: + await self.game.handle_key_press(self, data['key']) + elif data['type'] == 'start_tournament': + print(f"Start TOURNAMENT received by {self.user}") + # Run the tournament in the background + asyncio.create_task(tournament_match_maker.start_tournament()) + + async def authenticate(self, token): + user = await self.get_user_from_token(token) + if user: + self.user = user + await self.send(text_data=json.dumps({'type': 'authenticated'})) + print(f"User {self.user} authenticated") + await self.join_waiting_room() + else: + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) + print("Authentication failed") + + @database_sync_to_async + def get_user_from_token(self, token): + try: + user = User.objects.filter(auth_token=token).first() + return user + except User.DoesNotExist: + return None + + async def join_waiting_room(self): + await self.send(text_data=json.dumps({'type': 'waiting_room'})) + await match_maker.add_player(self) + + async def authenticate2(self, token, token2): + user = await self.get_user_from_token(token) + if user: + self.user = user + await self.send(text_data=json.dumps({'type': 'authenticated'})) + print(f"User {self.user} authenticated") + user2 = await self.get_user_from_token2(token2) + if user2: + self.user2 = user2 + await self.send(text_data=json.dumps({'type': 'authenticated'})) + print(f"User {self.user2} authenticated") + await match_maker.create_game(self, None, True) + else: + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) + print("Authentication failed") + else: + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) + print("Authentication failed") + + @database_sync_to_async + def get_user_from_token2(self, token): + try: + user2 = User.objects.filter(auth_token=token).first() + return user2 + except User.DoesNotExist: + return None + + async def authenticate3(self, token): + user = await self.get_user_from_token(token) + if user: + self.user = user + await self.send(text_data=json.dumps({'type': 'authenticated'})) + print(f"User {self.user.username} authenticated for tournament") + await self.join_tournament_waiting_room() + else: + await self.send(text_data=json.dumps({'type': 'error', 'message': 'Authentication failed'})) + print("Tournament authentication failed") + + async def join_tournament_waiting_room(self): + await tournament_match_maker.add_player(self) + + async def disconnect(self, close_code): + if self.game: + await self.game.end_game(disconnected_player=self) + await match_maker.remove_player(self) + await tournament_match_maker.remove_player(self) + print(f"User {self.user.username if hasattr(self, 'user') else 'Unknown'} disconnected") + + async def set_game(self, game): + print(f"({self.user}) Game set to: {game}") + self.game = game + +###################################################################CHAT################################################################### +class ChatConsumer(AsyncWebsocketConsumer): + async def connect(self): + + try: + # 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 + ) + + 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 (room) + await self.channel_layer.group_discard( + self.room_group_name, + self.channel_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: {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') + message = data.get('message', None) + target_user = data.get('target_user', None) + + logger.info(f"Message reçu: {data}") + + if not username: + 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 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': + logger.info(f"Message de chat envoyé par {username}: {message}") + await self.chat_message('chat_message', username, message, self.room_group_name) + + elif message_type == 'block_user': + logger.info(f"{username} tente de bloquer {target_user}") + await self.handle_block_user(data) + + elif message_type == 'invite': + await self.handle_invite_user(data) + + elif message_type == 'invite_response': + await self.handle_invite_response(data) + + elif message_type == 'get_player_stats': + logger.info(f"receive server get_player_stats{data}") + await self.handle_player_stats(data) + + else: + 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.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: {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'] + target_user = data['target_user'] + + logger.info(f"handle_block_user appelé avec : {data}") + + if target_user == username: + 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'})) + 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}' + })) + + # 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' + } + ) + + # Handle player stats by forwarding the request to the GameConsumer + async def handle_player_stats(self, data): + target_user = data.get('target_user') + logger.info(f"Demande de statistiques pour {target_user}") + + # Envoyer une requête au GameConsumer via Channel Layers + await self.channel_layer.send( + 'game_consumer_channel', # Nom du channel du GameConsumer + { + 'type': 'get_player_stats', + 'username': target_user, # Utilisateur cible + 'reply_channel': self.channel_name # Réponse à envoyer au ChatConsumer + } + ) + + # Méthode appelée pour recevoir les stats du GameConsumer + async def player_stats(self, event): + username = event['username'] + stats = event['stats'] + + # Envoyer les statistiques au client + await self.send(text_data=json.dumps({ + 'type': 'player_stats', + 'username': username, + 'stats': stats + })) + + async def authenticate(self, token, username): + if not token: + 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"Utilisateur {username} authentifié avec succès") + await self.chat_message('authenticated', username, 'Authentication successful', self.room_group_name) + + else: + 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"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"Utilisateur trouvé : {user} pour le token : {token}") + return user + except User.DoesNotExist: + logger.warning(f"Utilisateur non trouvé pour le token : {token}") + return None \ No newline at end of file diff --git a/pong/game/consumers.py:Zone.Identifier b/pong/game/consumers.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/game.py b/pong/game/game.py new file mode 100644 index 0000000..0f30c73 --- /dev/null +++ b/pong/game/game.py @@ -0,0 +1,253 @@ +# /pong/game/game.py + +import json +import asyncio +import random +from datetime import datetime +from .utils import handle_game_data, getlen +from asgiref.sync import sync_to_async +from .models import Tournoi + +class Game: + def __init__(self, game_id, player1, player2, localgame): + self.game_id = game_id + self.player1 = player1 + self.player2 = player2 + self.localgame = localgame + if self.localgame: + self.botgame = False + self.game_state = { + 'player1_name': player1.user.username, + 'player2_name': player1.user2.username, + 'player1_position': 150, + 'player2_position': 150, + 'ball_position': {'x': 390, 'y': 190}, + 'ball_velocity': {'x': random.choice([-5, 5]), 'y': random.choice([-5, 5])}, + 'player1_score': 0, + 'player2_score': 0, + 'game_text': '' + } + else: + # Set botgame to True if either player1 or player2 is None + self.botgame = player1 is None or player2 is None + self.game_state = { + 'player1_name': player1.user.username if player1 else 'BOT', + 'player2_name': player2.user.username if player2 else 'BOT', + 'player1_position': 150, + 'player2_position': 150, + 'ball_position': {'x': 390, 'y': 190}, + 'ball_velocity': {'x': random.choice([-5, 5]), 'y': random.choice([-5, 5])}, + 'player1_score': 0, + 'player2_score': 0, + 'game-text': '' + } + self.speed = 1 + self.game_loop_task = None + self.ended = False + self.p1_mov = 0 + self.p2_mov = 0 + self.bt1 = 0 + self.bt2 = 0 + self.start_time = datetime.now() + + async def start_game(self): + print(f"- Game #{self.game_id} STARTED ({self.game_state['player1_name']} vs {self.game_state['player2_name']}) --- ({self})") + self.game_loop_task = asyncio.create_task(self.game_loop()) + print(f" Begin MATCH at: {self.start_time}") + + async def game_loop(self): + print(" In the game loop..") + x = 0 + while not self.ended: + if self.botgame: + x += 1 + if x == 60: + await self.update_bot_position() + x = 0 + await self.handle_pad_movement() + await self.update_game_state() + await self.send_game_state() + await asyncio.sleep(1/60) # Around 60 FPS + + async def update_bot_position(self): + future_ball_position = self.predict_ball_trajectory() + + target_y = future_ball_position['y'] + player2_position = self.game_state['player2_position'] + + # Adjusts bot position based on expected ball position + if player2_position < target_y < player2_position + 80: + pass #bot already placed + elif player2_position < target_y: + #self.p2_mov = 1 + self.game_state['player2_position'] = min(player2_position + (50 * self.speed), 300) + elif player2_position + 80 > target_y: + #self.p2_mov = -1 + self.game_state['player2_position'] = max(player2_position - (50 * self.speed), 0) + + def predict_ball_trajectory(self, steps=60): + + future_x = self.game_state['ball_position']['x'] + future_y = self.game_state['ball_position']['y'] + velocity_x = self.game_state['ball_velocity']['x'] + velocity_y = self.game_state['ball_velocity']['y'] + + for _ in range(steps): + future_x += velocity_x + if future_x <= 10: + future_x = 10 + velocity_x = -velocity_x + elif future_x >= 790: + future_x = 790 + else: + future_y += velocity_y + + # Dealing with bounces off walls + if future_y <= 10 or future_y >= 390: + velocity_y = -velocity_y # Reverse the direction of vertical movement + + return {'x': future_x, 'y': future_y} + + async def update_game_state(self): + if self.ended: + return + # Update ball position + self.game_state['ball_position']['x'] += self.game_state['ball_velocity']['x'] + self.game_state['ball_position']['y'] += self.game_state['ball_velocity']['y'] + # Check for collisions with top and bottom walls + if self.game_state['ball_position']['y'] <= 10 or self.game_state['ball_position']['y'] >= 390: + self.game_state['ball_velocity']['y'] *= -1 + # Check for collisions with paddles + if self.game_state['ball_position']['x'] <= 20 and \ + self.game_state['player1_position'] - 10 <= self.game_state['ball_position']['y'] <= self.game_state['player1_position'] + 90: + if self.game_state['ball_velocity']['x'] < 0: + self.game_state['ball_velocity']['x'] *= -1 + self.bt1 += 1 + self.update_ball_velocity() + elif self.game_state['ball_position']['x'] >= 760 and \ + self.game_state['player2_position'] - 10 <= self.game_state['ball_position']['y'] <= self.game_state['player2_position'] + 90: + if self.game_state['ball_velocity']['x'] > 0: + self.game_state['ball_velocity']['x'] *= -1 + self.bt2 += 1 + self.update_ball_velocity() + # Check if some player won the game + if self.game_state['ball_position']['x'] <= 10: + self.game_state['player2_score'] += 1 + if self.game_state['player2_score'] > 2: + self.game_state['game_text'] = f"{self.game_state['player2_name']} WINS!" + await self.send_game_state() + await self.end_game() + self.reset_ball() + elif self.game_state['ball_position']['x'] >= 790: + self.game_state['player1_score'] += 1 + if self.game_state['player1_score'] > 2: + self.game_state['game_text'] = f"{self.game_state['player1_name']} WINS!" + await self.send_game_state() + await self.end_game() + self.reset_ball() + + def reset_ball(self): + self.game_state['ball_position'] = {'x': 390, 'y': 190} + self.game_state['ball_velocity'] = {'x': random.choice([-5, 5]), 'y': random.choice([-5, 5])} + self.speed = 1 + + def update_ball_velocity(self): + self.speed += 0.05 + if self.speed > 2: + self.speed = 2 + self.game_state['ball_velocity']['x'] *= self.speed + if self.game_state['ball_velocity']['x'] < -10: + self.game_state['ball_velocity']['x'] = -10 + elif self.game_state['ball_velocity']['x'] > 10: + self.game_state['ball_velocity']['x'] = 10 + self.game_state['ball_velocity']['y'] *= self.speed + if self.game_state['ball_velocity']['y'] < -10: + self.game_state['ball_velocity']['y'] = -10 + elif self.game_state['ball_velocity']['y'] > 10: + self.game_state['ball_velocity']['y'] = 10 + + async def send_game_state(self): + if self.ended: + return + message = json.dumps({ + 'type': 'game_state_update', + 'game_state': self.game_state + }) + await self.player1.send(message) + if not self.botgame: + if not self.localgame: + await self.player2.send(message) + + async def handle_key_press(self, player, key): + if self.ended: + return + if self.localgame: + if key == 'arrowup': + self.p2_mov = -1 + elif key == 'arrowdown': + self.p2_mov = 1 + elif key == 'w': + self.p1_mov = -1 + elif key == 's': + self.p1_mov = 1 + elif player == self.player1: + if key == 'arrowup': + self.p1_mov = -1 + elif key == 'arrowdown': + self.p1_mov = 1 + elif player == self.player2: + if key == 'arrowup': + self.p2_mov = -1 + elif key == 'arrowdown': + self.p2_mov = 1 + + async def handle_pad_movement(self): + if self.ended: + return + if self.p1_mov == -1: + self.game_state['player1_position'] = max(self.game_state['player1_position'] - (5 * self.speed), 0) + elif self.p1_mov == 1: + self.game_state['player1_position'] = min(self.game_state['player1_position'] + (5 * self.speed), 300) + if self.p2_mov == -1: + self.game_state['player2_position'] = max(self.game_state['player2_position'] - (5 * self.speed), 0) + elif self.p2_mov == 1: + self.game_state['player2_position'] = min(self.game_state['player2_position'] + (5 * self.speed), 300) + + async def end_game(self, disconnected_player=None): + if not self.ended: + self.ended = True + if self.game_loop_task: + self.game_loop_task.cancel() + print(f"- Game #{self.game_id} ENDED --- ({self})") + + end_time = datetime.now() + duration = (end_time - self.start_time).total_seconds() / 60 + + # Notify that one player left the game + if disconnected_player: + remaining_player = self.player2 if disconnected_player == self.player1 else self.player1 + disconnected_name = disconnected_player.user.username + message = json.dumps({ + 'type': 'player_disconnected', + 'player': disconnected_name + }) + if not self.botgame: + if not self.localgame: + await remaining_player.send(message) + # Notify both players that the game has ended + end_message = json.dumps({ + 'type': 'game_ended', + 'game_id': self.game_id + }) + await self.player1.send(end_message) + if not self.botgame: + if not self.localgame: + await self.player2.send(end_message) + if hasattr(self, 'tournament'): + await sync_to_async(handle_game_data)(self.game_state['player1_name'], self.game_state['player2_name'], + self.game_state['player1_score'], self.game_state['player2_score'], + self.bt1, self.bt2, duration, True, self.tournament.tournoi_reg) + else: + await sync_to_async(handle_game_data)(self.game_state['player1_name'], self.game_state['player2_name'], + self.game_state['player1_score'], self.game_state['player2_score'], + self.bt1, self.bt2, duration, False, None) diff --git a/pong/game/game.py:Zone.Identifier b/pong/game/game.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/matchmaking.py b/pong/game/matchmaking.py new file mode 100644 index 0000000..6382b95 --- /dev/null +++ b/pong/game/matchmaking.py @@ -0,0 +1,107 @@ +# /pong/game/matchmaking.py + +import json +import asyncio +from .game import Game + +class MatchMaker: + def __init__(self): + self.waiting_players = [] + self.active_games = {} + self.matching_task = None + self.timer = 0 + self.botgame = False + + async def add_player(self, player): + if player not in self.waiting_players: + self.waiting_players.append(player) + print(f"User {player.user.username} joins the WAITING ROOM") + if not self.matching_task or self.matching_task.done(): + self.matching_task = asyncio.create_task(self.match_loop()) + + async def remove_player(self, player): + if player in self.waiting_players: + self.waiting_players.remove(player) + + for game in self.active_games.values(): + if player in [game.player1, game.player2]: + await game.end_game(disconnected_player=player) + if game.game_id in self.active_games: + del self.active_games[game.game_id] + break + + async def match_loop(self): + while True: + if len(self.waiting_players) >= 2: + player1 = self.waiting_players.pop(0) + player2 = self.waiting_players.pop(0) + print(f"*** MATCH FOUND: {player1.user.username} vs {player2.user.username}") + await self.create_game(player1, player2, False) + else: + await asyncio.sleep(1) + self.timer += 1 + # Waiting for more than 30s -> BOT game + if self.timer >= 15 and self.waiting_players: + player1 = self.waiting_players.pop(0) + print(f"*** MATCH FOUND: {player1.user.username} vs BOT") + self.botgame = True + self.timer = 0 + await self.create_bot_game(player1) + if not self.waiting_players: + break + + async def create_game(self, player1, player2, localgame): + game_id = len(self.active_games) + 1 + if localgame: + print(f"- Creating LOCAL game: #{game_id}") + else: + print(f"- Creating MATCH game: #{game_id}") + new_game = Game(game_id, player1, player2, localgame) + self.active_games[game_id] = new_game + await player1.set_game(new_game) + if not localgame: + await player2.set_game(new_game) + await self.notify_players(player1, player2, game_id, localgame) + asyncio.create_task(new_game.start_game()) + + async def create_bot_game(self, player1): + game_id = len(self.active_games) + 1 + print(f"- Creating BOT game: #{game_id}") + new_game = Game(game_id, player1, None, False) + self.active_games[game_id] = new_game + await player1.set_game(new_game) + await self.notify_players(player1, None, game_id, False) + asyncio.create_task(new_game.start_game()) + + async def notify_players(self, player1, player2, game_id, localgame): + if player2: + await player1.send(json.dumps({ + 'type': 'game_start', + 'game_id': game_id, + 'player1': player1.user.username, + 'player2': player2.user.username + })) + await player2.send(json.dumps({ + 'type': 'game_start', + 'game_id': game_id, + 'player1': player1.user.username, + 'player2': player2.user.username + })) + else: + if localgame: + await player1.send(json.dumps({ + 'type': 'game_start', + 'game_id': game_id, + 'player1': player1.user.username, + 'player2': player1.user2.username + })) + else: + await player1.send(json.dumps({ + 'type': 'game_start', + 'game_id': game_id, + 'player1': player1.user.username, + 'player2': 'BOT' + })) + +# Instance of the class +match_maker = MatchMaker() diff --git a/pong/game/matchmaking.py:Zone.Identifier b/pong/game/matchmaking.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/migrations/0001_initial.py b/pong/game/migrations/0001_initial.py new file mode 100644 index 0000000..2f03168 --- /dev/null +++ b/pong/game/migrations/0001_initial.py @@ -0,0 +1,60 @@ +# Generated by Django 5.0.7 on 2024-07-31 16:01 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Player', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('total_match', models.PositiveSmallIntegerField(default=0)), + ('total_win', models.PositiveSmallIntegerField(default=0)), + ('p_win', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)), + ('m_score_match', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)), + ('m_score_adv_match', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)), + ('best_score', models.PositiveSmallIntegerField(default=0)), + ('m_nbr_ball_touch', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)), + ('total_duration', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)), + ('m_duration', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)), + ('num_participated_tournaments', models.PositiveSmallIntegerField(default=0)), + ('num_won_tournaments', models.PositiveSmallIntegerField(default=0)), + ], + ), + migrations.CreateModel( + name='Tournoi', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('nbr_player', models.PositiveSmallIntegerField()), + ('date', models.DateField()), + ('winner', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='game.player')), + ], + ), + migrations.CreateModel( + name='Match', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('score_player1', models.PositiveSmallIntegerField()), + ('score_player2', models.PositiveSmallIntegerField()), + ('nbr_ball_touch_p1', models.PositiveIntegerField()), + ('nbr_ball_touch_p2', models.PositiveIntegerField()), + ('duration', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)), + ('date', models.DateField(auto_now_add=True)), + ('is_tournoi', models.BooleanField()), + ('player1', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='match_as_player1', to='game.player')), + ('player2', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='match_as_player2', to='game.player')), + ('winner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='won_matches', to='game.player')), + ('tournoi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='matches', to='game.tournoi')), + ], + ), + ] diff --git a/pong/game/migrations/0001_initial.py:Zone.Identifier b/pong/game/migrations/0001_initial.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/migrations/0002_alter_match_winner.py b/pong/game/migrations/0002_alter_match_winner.py new file mode 100644 index 0000000..fe0f120 --- /dev/null +++ b/pong/game/migrations/0002_alter_match_winner.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.7 on 2024-07-31 16:04 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('game', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='match', + name='winner', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='won_matches', to='game.player'), + ), + ] diff --git a/pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier b/pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/migrations/0003_alter_tournoi_date.py b/pong/game/migrations/0003_alter_tournoi_date.py new file mode 100644 index 0000000..6bfda6c --- /dev/null +++ b/pong/game/migrations/0003_alter_tournoi_date.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.1 on 2024-09-10 14:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('game', '0002_alter_match_winner'), + ] + + operations = [ + migrations.AlterField( + model_name='tournoi', + name='date', + field=models.DateField(auto_now_add=True), + ), + ] diff --git a/pong/game/migrations/0003_alter_tournoi_date.py:Zone.Identifier b/pong/game/migrations/0003_alter_tournoi_date.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/migrations/__init__.py b/pong/game/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/migrations/__init__.py:Zone.Identifier b/pong/game/migrations/__init__.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/models.py b/pong/game/models.py new file mode 100644 index 0000000..4f63102 --- /dev/null +++ b/pong/game/models.py @@ -0,0 +1,61 @@ +# /pong/game/models.py + +from django.db import models +from django.contrib.auth.models import User + +User.add_to_class('auth_token', models.CharField(max_length=100, null=True, blank=True, unique=True)) + +class Player(models.Model): + name = models.CharField(max_length=100) + total_match = models.PositiveSmallIntegerField(default=0) + total_win = models.PositiveSmallIntegerField(default=0) + p_win = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) + m_score_match = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) + m_score_adv_match = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) + best_score = models.PositiveSmallIntegerField(default=0) + m_nbr_ball_touch = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) + total_duration = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True) + m_duration = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) + num_participated_tournaments = models.PositiveSmallIntegerField(default=0) + num_won_tournaments = models.PositiveSmallIntegerField(default=0) + + def __str__(self): + return self.name + +class Tournoi(models.Model): + name = models.CharField(max_length=200) + nbr_player = models.PositiveSmallIntegerField() + date = models.DateField(auto_now_add=True) + winner = models.ForeignKey('Player', on_delete=models.SET_NULL, null=True) + + def __str__(self): + return self.name + +class Match(models.Model): + player1 = models.ForeignKey('Player', related_name='match_as_player1', on_delete=models.CASCADE) + player2 = models.ForeignKey('Player', related_name='match_as_player2', on_delete=models.CASCADE) + score_player1 = models.PositiveSmallIntegerField() + score_player2 = models.PositiveSmallIntegerField() + winner = models.ForeignKey('Player', related_name='won_matches',on_delete=models.CASCADE, null=True) + nbr_ball_touch_p1 = models.PositiveIntegerField() + nbr_ball_touch_p2 = models.PositiveIntegerField() + duration = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) + date = models.DateField(auto_now_add=True) + is_tournoi = models.BooleanField() + tournoi = models.ForeignKey('Tournoi', related_name='matches', on_delete=models.SET_NULL, null=True) + + def clean(self): + if self.score_player1 < 0 or self.score_player2 < 0: + raise ValidationError('Les scores doivent être positifs.') + if self.score_player1 > self.score_player2 and self.winner != self.player1: + raise ValidationError('Le gagnant ne correspond pas aux scores.') + if self.score_player2 > self.score_player1 and self.winner != self.player2: + raise ValidationError('Le gagnant ne correspond pas aux scores.') + super().clean() + + def save(self, *args, **kwargs): + self.clean() + super().save(*args, **kwargs) + + def __str__(self): + return f"{self.player1.name} vs {self.player2.name}" \ No newline at end of file diff --git a/pong/game/models.py:Zone.Identifier b/pong/game/models.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/routing.py b/pong/game/routing.py new file mode 100644 index 0000000..3c631ff --- /dev/null +++ b/pong/game/routing.py @@ -0,0 +1,15 @@ +# /pong/game/routing.py +from django.urls import re_path +from . import consumers +import logging + +logger = logging.getLogger(__name__) + +logger.debug("Configuring WebSocket routing patterns") + +websocket_urlpatterns = [ + re_path(r'ws/game/$', consumers.GameConsumer.as_asgi(), name='game_ws'), + re_path(r'ws/chat/(?P\w+)/$', consumers.ChatConsumer.as_asgi()), +] + +logger.info("WebSocket routing patterns configured successfully") diff --git a/pong/game/routing.py:Zone.Identifier b/pong/game/routing.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/templates/pong/tournament_brackets.html b/pong/game/templates/pong/tournament_brackets.html new file mode 100644 index 0000000..ca65553 --- /dev/null +++ b/pong/game/templates/pong/tournament_brackets.html @@ -0,0 +1,60 @@ + + + + + + Tournament Brackets + + + +
+ {% for round in tournament_rounds %} +
+ {% for match in round %} +
+
+ {{ match.player1 }} +
+
+ {{ match.player2|default:"BYE" }} +
+
+ {% endfor %} +
+ {% endfor %} +
+ + \ No newline at end of file diff --git a/pong/game/templates/pong/tournament_brackets.html:Zone.Identifier b/pong/game/templates/pong/tournament_brackets.html:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/templates/pong/tournament_waiting_room.html b/pong/game/templates/pong/tournament_waiting_room.html new file mode 100644 index 0000000..cb77338 --- /dev/null +++ b/pong/game/templates/pong/tournament_waiting_room.html @@ -0,0 +1,20 @@ + +
+

Tournament Waiting Room

+ +

Players currently waiting: {{ players_count }}

+

Minimum players needed to start: {{ min_players_to_start }}

+ +

Players:

+
    + {% for player in players %} +
  • {{ player }}
  • + {% endfor %} +
+ + {% if players_count >= min_players_to_start %} + + {% else %} +

Waiting for more players to join...

+ {% endif %} +
\ No newline at end of file diff --git a/pong/game/templates/pong/tournament_waiting_room.html:Zone.Identifier b/pong/game/templates/pong/tournament_waiting_room.html:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/tournament.py b/pong/game/tournament.py new file mode 100644 index 0000000..9108046 --- /dev/null +++ b/pong/game/tournament.py @@ -0,0 +1,227 @@ +# /pong/game/tournament.py + +import json +import asyncio +from django.template.loader import render_to_string +import random +from .matchmaking import match_maker +from .game import Game +from .models import Tournoi +from .utils import create_tournament, update_tournament, getlen +from asgiref.sync import sync_to_async + + +TOURNAMENT_NAMES = [ + "Champions Clash", "Ultimate Showdown", "Battle Royale", + "Victory Cup", "Legends Tournament", "Elite Series", "Clash of 42", + "Shibuya incident", "Cunning Game", "Elite of the Stars" +] + +TOURNAMENT_NAMES = [ + "Champion's Clash", "Ultimate Showdown", "Battle Royale", + "Victory's Cup", "Legends Tournament", "Elite Series", "Clash of 42", + "Shibuya Incident", "Cunning Game", "Elite of the Stars", "Chaku's Disciples" +] + +class TournamentMatch(Game): + def __init__(self, game_id, player1, player2, tournament): + # Initialize the parent Game class with the provided parameters + super().__init__(game_id, player1, player2, False) + # Store the current game instance in active games + match_maker.active_games[game_id] = self + # Store the tournament instance + self.tournament = tournament + + async def end_game(self, disconnected_player=None): + # Call the parent class's end_game method + await super().end_game(disconnected_player) + # Handle the end of the match in the tournament context + await self.tournament.handle_match_end(self) + if self.game_id in match_maker.active_games: + del match_maker.active_games[self.game_id] + +class TournamentMatchMaker: + def __init__(self): + self.waiting_players = [] + self.matches = [] + self.rounds = [] + self.current_round = 0 + self.games = 0 + self.tournament_state = "waiting" #Can be "waiting", "in_progress", or "ended" + self.name = random.choice(TOURNAMENT_NAMES) + self.final_name = "" + self.tournoi_reg = None + + async def add_player(self, player): + if self.tournament_state == "waiting" and player not in self.waiting_players: + self.waiting_players.append(player) + if player: + print(f"User {player.user.username} joins the TOURNAMENT WAITING ROOM") + else: + print("BOT joins the TOURNAMENT WAITING ROOM") + await self.update_waiting_room() + + async def update_waiting_room(self): + html = self.generate_waiting_room_html() + for player in self.waiting_players: + await self.send_to_player(player, { + 'type': 'update_tournament_waiting_room', + 'html': html + }) + + def generate_waiting_room_html(self): + context = { + 'players': [player.user.username if player else 'BYE' for player in self.waiting_players], + 'tournament_state': self.tournament_state, + 'players_count': len(self.waiting_players), + 'min_players_to_start': 3 # You can adjust this number as needed + } + return render_to_string('pong/tournament_waiting_room.html', context) + + async def send_to_player(self, player, data): + if player: + await player.send(json.dumps(data)) + + async def remove_player(self, player): + if player in self.waiting_players: + self.waiting_players.remove(player) + await self.update_waiting_room() + + # Tournament start method + async def start_tournament(self): + + if len(self.waiting_players) < 2: + return False + if len(self.waiting_players) % 2 == 0: + await self.add_player(None) + self.tournament_state = "in_progress" + random.shuffle(self.waiting_players) + self.current_round = 0 + len_tournament = await sync_to_async(getlen)() + self.final_name = self.name + " #" + str(len_tournament + 1) + self.tournoi_reg = await sync_to_async(create_tournament)(self.final_name, len(self.waiting_players)) + await self.advance_tournament() + return True + + async def advance_tournament(self): + players = self.waiting_players + while len(players) > 1: + self.current_round += 1 + print(f"Starting round {self.current_round} with {len(players)} players") + await self.create_matches(players) + await self.update_brackets() + await self.start_round_matches() + # Wait for all matches in the current round to finish + current_round_matches = self.rounds[-1] + while not all(match.ended for match in current_round_matches): + await asyncio.sleep(1) # Wait for 1 second before checking again + # Get winners for the next round + players = self.get_round_winners() + print(f"Round {self.current_round} finished. {len(players)} players advancing.") + # Tournament has ended + await self.update_brackets() + await self.end_tournament(players[0] if players else None) + + async def create_matches(self, players): + matches = [] + for i in range(0, len(players), 2): + self.games += 1 + if i + 1 < len(players): + # Create a new instance of TournamentMatch for this round + match = TournamentMatch(self.games, players[i], players[i + 1], self) + matches.append(match) + else: + # Create a BYE match where the second player is None + match = TournamentMatch(self.games, players[i], None, self) # BYE match + matches.append(match) + + # Assign the new match instance to the players + if players[i]: + await players[i].set_game(match) + if i + 1 < len(players): + if players[i + 1]: + await players[i + 1].set_game(match) + + self.rounds.append(matches) + self.matches.extend(matches) + + async def update_brackets(self): + html = self.generate_bracket_html() + for player in self.waiting_players: + await self.send_to_player(player, { + 'type': 'update_brackets', + 'html': html + }) + + def generate_bracket_html(self): + context = { + 'tournament_rounds': self.get_tournament_data() + } + return render_to_string('pong/tournament_brackets.html', context) + + def get_tournament_data(self): + return [ + [ + { + 'player1': match.player1.user.username if match.player1 else 'BYE', + 'player2': match.player2.user.username if match.player2 else 'BYE', + 'winner': match.game_state['player1_name'] if match.game_state['player1_score'] > match.game_state['player2_score'] else match.game_state['player2_name'] if match.ended else None, + 'score1': match.game_state['player1_score'], + 'score2': match.game_state['player2_score'] + } + for match in round_matches + ] + for round_matches in self.rounds + ] + + async def start_round_matches(self): + print(f"Starting TOURNAMENT round #{self.current_round}") + for match in self.rounds[-1]: + if match.player1 and match.player2: + # Envoyer un message pour indiquer les prochains joueurs du tournoi + message = f"Prochain match: {match.player1.user.username} contre {match.player2.user.username}" + await self.send_to_player(match.player2, {'type': 'tournament_match', 'message': message}) + await match_maker.notify_players(match.player1, match.player2, match.game_id, False) + asyncio.create_task(match.start_game()) + elif match.player1: + # Gestion du BYE + match_message = f"Prochain match: {match.player1.user.username} contre Bot" + await self.send_to_player(match.player1, {'type': 'tournament_match', 'message': message}) + await match_maker.notify_players(match.player1, match.player2, match.game_id, False) + match.game_state['player1_score'] = 3 + match.game_state['player2_score'] = 0 + await match.end_game() + + + def get_round_winners(self): + winners = [] + for match in self.rounds[-1]: + if match.ended: + winner = match.player1 if match.game_state['player1_score'] > match.game_state['player2_score'] else match.player2 + #if winner: + winners.append(winner) + return winners + + async def end_tournament(self, winner): + self.tournament_state = "ended" + winner_username = winner.user.username if winner else "No winner" + print(f"The TOURNAMENT winner is {winner_username}") + for player in self.waiting_players: + await self.send_to_player(player, { + 'type': 'tournament_end', + 'winner': winner_username + }) + + await sync_to_async(update_tournament)(self.final_name, winner_username) + # Reset tournament state + self.waiting_players = [] + self.matches = [] + self.rounds = [] + self.current_round = 0 + self.games = 0 + + async def handle_match_end(self, match): + await self.update_brackets() + +# Instance of the class +tournament_match_maker = TournamentMatchMaker() \ No newline at end of file diff --git a/pong/game/tournament.py:Zone.Identifier b/pong/game/tournament.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/urls.py b/pong/game/urls.py new file mode 100644 index 0000000..df150f0 --- /dev/null +++ b/pong/game/urls.py @@ -0,0 +1,18 @@ +# /pong/game/urls.py + +from django.urls import path, include +from . import views +from rest_framework.routers import DefaultRouter +from .views import match_list_json, player_list_json, tournoi_list_json + + +urlpatterns = [ + path('', views.index, name='index'), + path('check_user_exists/', views.check_user_exists, name='check_user_exists'), + path('register_user/', views.register_user, name='register_user'), + path('authenticate_user/', views.authenticate_user, name='authenticate_user'), + path('web3/', views.read_data, name='read_data'), + path('api/match_list/', match_list_json, name='match_list_json'), + path('api/player_list/', player_list_json, name='player_list_json'), + path('api/tournoi_list/', tournoi_list_json, name='tournoi_list_json') +] diff --git a/pong/game/urls.py:Zone.Identifier b/pong/game/urls.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/utils.py b/pong/game/utils.py new file mode 100644 index 0000000..16921d0 --- /dev/null +++ b/pong/game/utils.py @@ -0,0 +1,196 @@ +from .models import Player, Tournoi, Match +from django.core.exceptions import ValidationError +from django.shortcuts import get_object_or_404 +from django.db.models import Max, Sum, F +from datetime import timedelta +from channels.db import database_sync_to_async + +def handle_game_data(p1, p2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_tournament): + try: + player_1 = get_or_create_player(p1) + player_2 = get_or_create_player(p2) + + create_match(player_1, player_2, s_p1, s_p2, bt_p1, bt_2, dur, is_tournoi, name_tournament) + + update_player_statistics(p1) + update_player_statistics(p2) + + except Exception as e: + print(f"Error in endfortheouche: {e}") + +def get_player_by_name(name): + exists = Player.objects.filter(name=name).exists() + return exists + + +def get_player(name): + return Player.objects.get(name=name) + + +def get_or_create_player(name): + player_exists = get_player_by_name(name) + if not player_exists: + player = create_player(name) + return player + else: + player = get_player(name) + return player + + +def create_player( + name, + total_match=0, + total_win=0, + p_win= None, + m_score_match= None, + m_score_adv_match= None, + best_score=0, + m_nbr_ball_touch= None, + total_duration= None, + m_duration= None, + num_participated_tournaments=0, + num_won_tournaments=0 +): + + player = Player( + name=name, + total_match=total_match, + total_win=total_win, + p_win=p_win, + m_score_match=m_score_match, + m_score_adv_match=m_score_adv_match, + best_score=best_score, + m_nbr_ball_touch=m_nbr_ball_touch, + total_duration=total_duration, + m_duration=m_duration, + num_participated_tournaments=num_participated_tournaments, + num_won_tournaments=num_won_tournaments + ) + player.save() + return player + +def create_tournoi(name, nbr_player, date, winner): + tournoi = Tournoi(name=name, nbr_player=nbr_player, date=date, winner=winner) + tournoi.save() + return tournoi + +def create_match(player1, player2, score_player1, score_player2, nbr_ball_touch_p1, nbr_ball_touch_p2, duration, is_tournoi, tournoi): + match = Match( + player1=player1, + player2=player2, + score_player1=score_player1, + score_player2=score_player2, + nbr_ball_touch_p1=nbr_ball_touch_p1, + nbr_ball_touch_p2=nbr_ball_touch_p2, + duration=duration, + is_tournoi=is_tournoi, + tournoi=tournoi + ) + + if score_player1 > score_player2: + match.winner = match.player1 + elif score_player2 > score_player1: + match.winner = match.player2 + else: + match.winner = None + + match.save() + return match + +def update_player_statistics(player_name): + player = get_object_or_404(Player, name=player_name) + + matches_as_player1 = Match.objects.filter(player1=player) + matches_as_player2 = Match.objects.filter(player2=player) + + total_match = matches_as_player1.count() + matches_as_player2.count() + + # avoid dividing by 0 + if total_match == 0: + player.total_match = total_match + player.total_win = 0 + player.p_win = 0 + player.m_score_match = 0 + player.m_score_adv_match = 0 + player.best_score = 0 + player.m_nbr_ball_touch = 0 + player.total_duration = 0 + player.m_duration = 0 + player.num_participated_tournaments = 0 + player.num_won_tournaments = 0 + player.save() + return + + won_matches = Match.objects.filter(winner=player) + #part_tourn_as_p1 = Tournoi.objects.filter(matches__is_tournoi=True, matches__matches_as_player1=player) + #part_tourn_as_p2 = Tournoi.objects.filter(matches__is_tournoi=True, matches__matches_as_player2=player) + #won_tourn = Tournoi.objects.filter(winner=player) + + total_score = matches_as_player1.aggregate(Sum('score_player1'))['score_player1__sum'] or 0 + total_score += matches_as_player2.aggregate(Sum('score_player2'))['score_player2__sum'] or 0 + + total_score_adv = matches_as_player1.aggregate(Sum('score_player2'))['score_player2__sum'] or 0 + total_score_adv += matches_as_player2.aggregate(Sum('score_player1'))['score_player1__sum'] or 0 + + total_win = won_matches.count() + p_win = (total_win / total_match) * 100 + + m_score_match = total_score / total_match + m_score_adv_match = total_score_adv / total_match + + nbr_ball_touch = matches_as_player1.aggregate(Sum('nbr_ball_touch_p1'))['nbr_ball_touch_p1__sum'] or 0 + nbr_ball_touch += matches_as_player2.aggregate(Sum('nbr_ball_touch_p2'))['nbr_ball_touch_p2__sum'] or 0 + m_nbr_ball_touch = nbr_ball_touch / total_match + + total_duration = matches_as_player1.aggregate(Sum('duration'))['duration__sum'] or 0 + total_duration += matches_as_player2.aggregate(Sum('duration'))['duration__sum'] or 0 + m_duration = total_duration / total_match + + #total_tourn_p = part_tourn_as_p1.count() + part_tourn_as_p2.count() + #total_win_tourn = won_tourn.count() + #p_win_tourn = (total_win_tourn / total_tourn_p) * 100 if total_tourn_p else 0 + + best_score_as_player1 = matches_as_player1.aggregate(Max('score_player1'))['score_player1__max'] or 0 + best_score_as_player2 = matches_as_player2.aggregate(Max('score_player2'))['score_player2__max'] or 0 + best_score = max(best_score_as_player1, best_score_as_player2) + + player.total_match = total_match + player.total_win = total_win + player.p_win = p_win + player.m_score_match = m_score_match + player.m_score_adv_match = m_score_adv_match + player.best_score = best_score + player.m_nbr_ball_touch = m_nbr_ball_touch + player.total_duration = total_duration + player.m_duration = m_duration + # player.num_participated_tournaments = total_tourn_p + #player.num_won_tournaments = total_win_tourn + + player.save() + +def get_player_p_win(player_name): + player = get_object_or_404(Player, name=player_name) + return player.p_win + +def create_tournament(name, nbr_player): + print("tournoi created!!!") + tournoi=Tournoi(name=name, nbr_player=nbr_player, winner=None) + tournoi.save() + print(f"tournoi name : {tournoi.name} *******!*!*!*!**!*!**!*!*!*!*!*!*!*!*!*") + return tournoi + +def update_tournament(name_tournoi, winner_name): + tournoi = get_object_or_404(Tournoi, name=name_tournoi) + winner_p = get_object_or_404(Player, name=winner_name) + print(f"in update tourna - tournoi name : {tournoi.name} *******!*!*!*!**!*!**!*!*!*!*!*!*!*!*!*") + print(f"in update tourna - winner is : {winner_p.name} *******!*!*!*!**!*!**!*!*!*!*!*!*!*!*!*") + + tournoi.winner = winner_p + print(f"in update tourna - TOURNOI winner is : {tournoi.winner.name} *******!*!*!*!**!*!**!*!*!*!*!*!*!*!*!*") + tournoi.save() + + + + +def getlen(): + return Tournoi.objects.count() diff --git a/pong/game/utils.py:Zone.Identifier b/pong/game/utils.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/game/views.py b/pong/game/views.py new file mode 100644 index 0000000..8ff352e --- /dev/null +++ b/pong/game/views.py @@ -0,0 +1,169 @@ +# /pong/game/views.py + +from django.shortcuts import render +from django.core.exceptions import ObjectDoesNotExist +from .models import Player, Tournoi, Match +from .utils import create_player, create_tournoi, create_match +from django.http import JsonResponse +from django.contrib.auth.models import User +from django.contrib.auth import authenticate +from django.views.decorators.csrf import csrf_exempt +from rest_framework import viewsets + +import json +import uuid + +def index(request): + return render(request, 'index.html') + +@csrf_exempt +def check_user_exists(request): + if request.method == 'POST': + data = json.loads(request.body) + username = data.get('username') + if User.objects.filter(username=username).exists(): + return JsonResponse({'exists': True}) + return JsonResponse({'exists': False}) + return JsonResponse({'error': 'Invalid request method'}, status=400) + +@csrf_exempt +def register_user(request): + if request.method == 'POST': + data = json.loads(request.body) + username = data.get('username') + password = data.get('password') + if not User.objects.filter(username=username).exists(): + user = User.objects.create_user(username=username, password=password) + token = get_or_create_token(user) + return JsonResponse({'registered': True, 'token': token}) + return JsonResponse({'registered': False, 'error': 'User already exists'}) + return JsonResponse({'error': 'Invalid request method'}, status=400) + +@csrf_exempt +def authenticate_user(request): + if request.method == 'POST': + try: + data = json.loads(request.body) + username = data.get('username', '') + password = data.get('password', '') + user = authenticate(username=username, password=password) + if user is not None: + token = get_or_create_token(user) + return JsonResponse({'authenticated': True, 'token': token, 'user_id': user.id}) + else: + return JsonResponse({'authenticated': False}, status=401) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + else: + return JsonResponse({'error': 'Method not allowed'}, status=405) + +def get_or_create_token(user): + if not user.auth_token: + while True: + token = str(uuid.uuid4()) + if not User.objects.filter(auth_token=token).exists(): + user.auth_token = token + user.save() + break + return user.auth_token + +def match_list_json(request): + matches = Match.objects.all() + data = { + 'matches': list(matches.values( + 'id', 'player1__name', 'player2__name', 'score_player1', 'score_player2', + 'winner__name', 'nbr_ball_touch_p1', 'nbr_ball_touch_p2', 'duration', 'date', + 'is_tournoi', 'tournoi__name' + )) + } + return JsonResponse(data) + +def player_list_json(request): + players = Player.objects.all() + + data = { + 'players': list(players.values( + 'id', 'name', 'total_match', 'total_win', 'p_win', + 'm_score_match', 'm_score_adv_match', 'best_score', + 'm_nbr_ball_touch', 'total_duration', 'm_duration', + 'num_participated_tournaments', 'num_won_tournaments' + )) + } + return JsonResponse(data) + +def tournoi_list_json(request): + tournois = Tournoi.objects.all() + + data = { + 'tournois': list(tournois.values( + 'id', 'name', 'nbr_player', 'date', 'winner' + )) + } + return JsonResponse(data) + + +from web3 import Web3 + +provider = Web3.HTTPProvider("https://sepolia.infura.io/v3/60e51df7c97c4f4c8ab41605a4eb9907") +web3 = Web3(provider) +eth_gas_price = web3.eth.gas_price/1000000000 +print(eth_gas_price) + +contract_address = "0x078D04Eb6fb97Cd863361FC86000647DC876441B" +contract_abi = [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_timecode","type":"uint256"},{"internalType":"uint256","name":"_participantCount","type":"uint256"},{"internalType":"string[]","name":"_playerPseudonyms","type":"string[]"},{"internalType":"string[]","name":"_finalOrder","type":"string[]"}],"name":"addTournament","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllTournaments","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"timecode","type":"uint256"},{"internalType":"uint256","name":"participantCount","type":"uint256"},{"internalType":"string[]","name":"playerPseudonyms","type":"string[]"},{"internalType":"string[]","name":"finalOrder","type":"string[]"}],"internalType":"struct PongTournament.Tournament[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getTournament","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"timecode","type":"uint256"},{"internalType":"uint256","name":"participantCount","type":"uint256"},{"internalType":"string[]","name":"playerPseudonyms","type":"string[]"},{"internalType":"string[]","name":"finalOrder","type":"string[]"}],"internalType":"struct PongTournament.Tournament","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tournamentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tournaments","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"timecode","type":"uint256"},{"internalType":"uint256","name":"participantCount","type":"uint256"}],"stateMutability":"view","type":"function"}] + +contract = web3.eth.contract(address=contract_address, abi=contract_abi) + +def read_data(request): + # Créer une instance du contrat + + # Appeler une fonction du contrat pour obtenir tous les tournois + tournaments = contract.functions.getAllTournaments().call() + + # Afficher les résultats + json_data = [] + for tournament in tournaments: + tournament_data = [] + for item in tournament: + print(f"{item}") + tournament_data.append(item) + json_data.append(tournament_data) + + # Retourner le JSON comme réponse HTTP + # print(f"Tournament ID: {tournament[0]}") + # print(f"Name: {tournament[1]}") + # print(f"Timecode: {tournament[2]}") + # print(f"Participant Count: {tournament[3]}") + # print(f"Player Pseudonyms: {', '.join(tournament[4])}") + # print(f"Final Order: {', '.join(tournament[5])}") + print("-----------------------------") + return JsonResponse(json_data, safe=False) + + +def write_data(request): + # addTournament(string,uint256,uint256,string[],string[]) + + # # Configuration de la transaction pour la fonction store + # account = "0x66CeBE2A1F7dae0F6AdBAad2c15A56A9121abfEf" + # private_key = "beb16ee3434ec5abec8b799549846cc04443c967b8d3643b943e2e969e7d25be" + + # nonce = web3.eth.get_transaction_count(account) + # transaction = contract.functions.addTournament("test",1721830559,6,["aaudeber", "tlorne", "ocassany", "yestello", "jcheca", "toto"],["toto", "jcheca", "yestello", "tlorne", "ocassany", "aaudeber"]).build_transaction({ + # 'chainId': 11155111, # ID de la chaîne Sepolia + # 'gas': 2000000, + # 'gasPrice': web3.to_wei(eth_gas_price, 'gwei'), + # 'nonce': nonce + # }) + + # # Signature de la transaction + # signed_txn = web3.eth.account.sign_transaction(transaction, private_key) + + # # Envoi de la transaction + # tx_hash = web3.eth.send_raw_transaction(signed_txn.rawTransaction) + # print("Transaction hash:", web3.to_hex(tx_hash)) + + # # Attente de la confirmation de la transaction + # tx_receipt = web3.eth.wait_for_transaction_receipt(tx_hash) + # print("Transaction receipt:", tx_receipt) + print("-----------------------------") + diff --git a/pong/game/views.py:Zone.Identifier b/pong/game/views.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/settings.py b/pong/settings.py new file mode 100644 index 0000000..50e9172 --- /dev/null +++ b/pong/settings.py @@ -0,0 +1,212 @@ +# /pong/settings.py + +""" +Django settings for pong project. + +Generated by 'django-admin startproject' using Django 3.2. +""" + +import os +import logging.config +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '12345678' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['*'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'channels', + 'pong.game', + 'rest_framework' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'pong.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, 'pong', 'static')], # Ensure templates are found + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +ASGI_APPLICATION = 'pong.asgi.application' + +# Database +# https://docs.djangoproject.com/en/3.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': os.getenv('DB_NAME'), + 'USER': os.getenv('DB_USER'), + 'PASSWORD': os.getenv('DB_PASSWORD'), + 'HOST': os.getenv('DB_HOST'), + 'PORT': '5432', + } +} + +# Password validation +# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +# Internationalization +# https://docs.djangoproject.com/en/3.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + +STATIC_URL = '/static/' +STATICFILES_DIRS = [os.path.join(BASE_DIR, 'pong/static')] +STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') + +# Default primary key field type +# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +# Channels +# Define the channel layers for WebSockets +# Define the channel layers for WebSockets +CHANNEL_LAYERS = { + 'default': { + 'BACKEND': 'channels.layers.InMemoryChannelLayer', + }, +} + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'json': { + '()': 'pythonjsonlogger.jsonlogger.JsonFormatter', + 'format': '%(asctime)s %(levelname)s %(name)s %(module)s %(process)d %(thread)d %(message)s', + }, + 'default': { + 'format': '[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s', + }, + 'verbose': { + 'format': '[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s [%(process)d:%(thread)d]', + }, + 'simple': { + 'format': '%(levelname)s %(message)s', + }, + }, + 'filters': { + 'require_debug_true': { + '()': 'django.utils.log.RequireDebugTrue', + }, + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse', + }, + }, + 'handlers': { + 'file': { + 'level': 'INFO', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(BASE_DIR, 'logs/django.log'), + 'formatter': 'json', + 'maxBytes': 1024 * 1024 * 5, # 5 MB + 'backupCount': 5, + }, + 'error_file': { + 'level': 'ERROR', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(BASE_DIR, 'logs/django_errors.log'), + 'formatter': 'json', + 'maxBytes': 1024 * 1024 * 5, # 5 MB + 'backupCount': 5, + }, + 'console': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'verbose', + 'filters': ['require_debug_true'], + }, + 'mail_admins': { + 'level': 'ERROR', + 'class': 'django.utils.log.AdminEmailHandler', + 'filters': ['require_debug_false'], + }, + }, + 'loggers': { + 'django': { + 'handlers': ['file', 'console', 'mail_admins'], + 'level': 'DEBUG', + 'propagate': True, + }, + 'django.request': { + 'handlers': ['error_file', 'mail_admins'], + 'level': 'ERROR', + 'propagate': False, + }, + 'django.security': { + 'handlers': ['error_file', 'mail_admins'], + 'level': 'ERROR', + 'propagate': False, + }, + }, + 'root': { + 'handlers': ['console', 'file'], + 'level': 'INFO', + }, +} \ No newline at end of file diff --git a/pong/settings.py:Zone.Identifier b/pong/settings.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/burger.js b/pong/static/burger.js new file mode 100644 index 0000000..6467591 --- /dev/null +++ b/pong/static/burger.js @@ -0,0 +1,409 @@ +document.addEventListener('DOMContentLoaded', () => { + + const menuButton = document.querySelector('.burger-menu'); + const dropdownMenu = document.getElementById('dropdown-menu'); + + const playerList = document.getElementById('player-list'); + const matchList = document.getElementById('match-list'); + const tournoiList = document.getElementById('tournoi-list'); + const blockchainList = document.getElementById('blockchain-list'); + + const logo = document.querySelector('.logo'); + + menuButton.addEventListener('click', toggleMenu); + + function toggleMenu() { + console.log('Menu toggled'); + if (dropdownMenu.style.display === "block") { + dropdownMenu.style.display = "none"; + hideAllTables(); + } else { + dropdownMenu.style.display = "block"; + } + } + + function hideAllTables(){ + if (playerList) playerList.style.display = 'none'; + if (matchList) matchList.style.display = 'none'; + if (tournoiList) tournoiList.style.display = 'none'; + if (blockchainList) blockchainList.style.display = 'none'; + logo.style.display = 'block'; + } + + const links = document.querySelectorAll('#dropdown-menu a'); + + links.forEach(link => { + link.addEventListener('click', (event) => { + event.preventDefault(); + const tableId = link.getAttribute('data-table'); + showTable(tableId); + }); + }); + + function showTable(tableId) { + hideAllTables(); + logo.style.display = 'none'; + + if (tableId === 'player-list') { + playerList.style.display = 'block'; + fetchPlayers(); + } else if (tableId === 'match-list') { + matchList.style.display = 'block'; + fetchMatches(); + } else if (tableId === 'tournoi-list') { + tournoiList.style.display = 'block'; + fetchTournois(); + } else if (tableId === 'blockchain-list') { + console.log('Opening external page in a new tab'); + window.open('https://sepolia.etherscan.io/address/0x078d04eb6fb97cd863361fc86000647dc876441b', '_blank'); + } + + if (dropdownMenu) { + dropdownMenu.style.display = 'none'; + } + } + + function fetchMatches() { + console.log('Fetching matches...'); + fetch('/api/match_list/') + .then(response => response.json()) + .then(data => { + if (data.matches) { + displayMatches(data.matches); + } + }) + .catch(error => console.error('Error fetching match data:', error)); + } + + function fetchPlayers() { + console.log('Fetching players...'); + // Retourner la promesse pour permettre l'utilisation de .then() plus tard + return fetch('/api/player_list/') + .then(response => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.json(); + }) + .then(data => { + if (data.players) { + displayPlayers(data.players); // Affiche les joueurs récupérés + return data.players; // Retourne les joueurs pour permettre de les traiter dans un .then + } else { + throw new Error('No players found.'); + } + }) + .catch(error => { + console.error('Error fetching match data:', error); + return null; // En cas d'erreur, retourne null + }); + } + + function fetchTournois(){ + console.log('Fetching tournois...'); + fetch('/api/tournoi_list/') + .then(response => response.json()) + .then(data => { + if (data.tournois) { + displayTournois(data.tournois); + } + }) + .catch(error => console.error('Error fetching match data:', error)); + } + + function displayMatches(matches) { + console.log('Displaying matches:'); + const matchListBody = document.querySelector('#match-list tbody'); + matchListBody.innerHTML = ''; + const row = document.createElement('tr'); + + if (matches.length != 0) { + matches.forEach(match => { + row.innerHTML = ` + ${match.id} + ${match.player1__name} + ${match.player2__name} + ${match.score_player1} + ${match.score_player2} + ${match.winner__name} + ${match.nbr_ball_touch_p1} + ${match.nbr_ball_touch_p2} + ${match.duration} + ${match.date} + ${match.is_tournoi} + ${match.tournoi__name} + `; + matchListBody.appendChild(row); + }); + } else { + row.innerHTML = ` + No matches found. + `; + matchListBody.appendChild(row); + } + } + + function displayPlayers(players) { + console.log('Displaying players:'); + const playersListBody = document.querySelector('#player-list tbody'); + playersListBody.innerHTML = ''; + const row = document.createElement('tr'); + + if (players.length != 0) { + players.forEach(player => { + row.innerHTML = ` + ${player.id} + ${player.name} + ${player.total_match} + ${player.total_win} + ${player.p_win} + ${player.m_score_match} + ${player.m_score_adv_match} + ${player.best_score} + ${player.m_nbr_ball_touch} + ${player.total_duration} + ${player.m_duration} + ${player.num_participated_tournaments} + ${player.num_won_tournaments} + `; + playersListBody.appendChild(row); + }); + } else { + row.innerHTML = ` + No matches found. + ` + playersListBody.appendChild(row); + } + } + + function displayTournois(tournois) { + console.log('Displaying tournois:'); + const tournoisListBody = document.querySelector('#tournoi-list tbody'); + tournoisListBody.innerHTML = ''; + const row = document.createElement('tr'); + + if (tournois.length != 0) { + tournois.forEach(tournoi => { + row.innerHTML = ` + ${tournoi.id} + ${tournoi.name} + ${tournoi.nbr_player} + ${tournoi.date} + ${tournoi.winner ? tournoi.winner.name : 'None'} + `; + tournoisListBody.appendChild(row); + }); + } else { + row.innerHTML = ` + No matches found. + ` + tournoisListBody.appendChild(row); + } + + } + + document.getElementById('search-player').addEventListener('input', filterPlayers); + document.getElementById('search-match-player').addEventListener('input', filterMatches); + document.getElementById('search-match-date').addEventListener('input', filterMatches); + + function filterPlayers() { + const searchValue = document.getElementById('search-player').value.toLowerCase(); + const playersListBody = document.querySelector('#player-list tbody'); + const rows = playersListBody.getElementsByTagName('tr'); + + for (let i = 0; i < rows.length; i++) { + const nameCell = rows[i].getElementsByTagName('td')[1]; + if (nameCell) { + const nameValue = nameCell.textContent || nameCell.innerText; + if (nameValue.toLowerCase().indexOf(searchValue) > -1 ) { + rows[i].style.display = ''; + } else { + rows[i].style.display = 'none'; + } + } + } + } + + function filterMatches() { + const playerSearchValue = document.getElementById('search-match-player').value.toLowerCase(); + const dateSearchValue = document.getElementById('search-match-date').value; + const matchListBody = document.querySelector('#match-list tbody'); + const rows = matchListBody.getElementsByTagName('tr'); + + for (let i = 0; i < rows.length; i++) { + const player1Cell = rows[i].getElementsByTagName('td')[1]; + const player2Cell = rows[i].getElementsByTagName('td')[2]; + const dateCell = rows[i].getElementsByTagName('td')[9]; + + let playerMatch = true; + if (playerSearchValue) { + const player1Value = player1Cell.textContent || player1Cell.innerText; + const player2Value = player2Cell.textContent || player2Cell.innerText; + playerMatch = player1Value.toLowerCase().indexOf(playerSearchValue) > -1 || + player2Value.toLowerCase().indexOf(playerSearchValue) > -1; + } + + let dateMatch = true; + if (dateSearchValue) { + const dateValue = dateCell.textContent || dateCell.innerText; + dateMatch = dateValue.startsWith(dateSearchValue); + } + + if (playerMatch && dateMatch) { + rows[i].style.display = ''; + } else { + rows[i].style.display = 'none'; + } + } + } + + document.getElementById('generate-player-chart').addEventListener('click', generatePlayerChart); + document.getElementById('generate-match-chart').addEventListener('click', generateMatchLinePlot); + + function generatePlayerChart() { + + if (document.getElementById('player-chart').style.display === 'block'){ + document.getElementById('player-chart').style.display = 'none'; + return ; + } + + if (logo.style.display === 'block'){ + logo.style.display = 'none'; + } + const rows = document.querySelectorAll('#player-list tbody tr'); + const playerNames = []; + const totalMatches = []; + const totalWins = []; + + rows.forEach(row => { + const cells = row.getElementsByTagName('td'); + playerNames.push(cells[1].innerText); + totalMatches.push(parseInt(cells[2].innerText)); + totalWins.push(parseInt(cells[3].innerText)); + }); + + const ctx = document.getElementById('player-chart').getContext('2d'); + document.getElementById('player-chart').style.display = 'block'; + new Chart(ctx, { + type: 'bar', + data: { + labels: playerNames, + datasets: [ + { label: 'Total Matches', data: totalMatches, backgroundColor: 'rgba(75, 192, 192, 0.6)' }, + { label: 'Total Wins', data: totalWins, backgroundColor: 'rgba(54, 162, 235, 0.6)' }, + ] + }, + options: { + scales: { + x: { + ticks: { + color: '#00ffff' + } + }, + y: { + beginAtZero: true, + ticks: { + color: '#00ffff' + } + } + } + } + }); + } + + function generateMatchLinePlot() { + + if (document.getElementById('match-chart').style.display === 'block'){ + document.getElementById('match-chart').style.display = 'none'; + return ; + } + + const rows = document.querySelectorAll('#match-list tbody tr'); + const playerWins = {}; + const dates = []; + + rows.forEach(row => { + const cells = row.getElementsByTagName('td'); + const winner = cells[5].innerText; + const date = cells[9].innerText; + + if (!dates.includes(date)) { + dates.push(date); + } + + if (!playerWins[winner]) { + playerWins[winner] = []; + } + + let existingEntry = playerWins[winner].find(entry => entry.date === date); + + if (existingEntry) { + existingEntry.wins += 1; + } + + else { + let lastWinCount = playerWins[winner].length > 0 ? playerWins[winner][playerWins[winner].length - 1].wins : 0; + playerWins[winner].push({ date: date, wins: lastWinCount + 1 }); + } + }); + + const datasets = Object.keys(playerWins).map(player => { + return { + label: player, + data: playerWins[player].map(entry => ({ x: entry.date, y: entry.wins })), + fill: false, + borderColor: getRandomColor(), + tension: 0.1 + }; + }); + + const ctx = document.getElementById('match-chart').getContext('2d'); + document.getElementById('match-chart').style.display = 'block'; + new Chart(ctx, { + type: 'line', + data: { + labels: dates.sort(), + datasets: datasets + }, + options: { + scales: { + x: { + type: 'time', + time: { + parser: 'YYYY-MM-DD', + unit: 'day', + tooltipFormat: 'll' + }, + title: { + display: true, + text: 'Date' + }, + ticks: { + color: '#00ffff' + } + }, + y: { + beginAtZero: true, + title: { + display: true, + text: 'Nombre de Victoires Cumulées' + }, + ticks: { + color: '#00ffff' + } + } + } + } + }); + } + + function getRandomColor() { + const letters = '0123456789ABCDEF'; + let color = '#'; + for (let i = 0; i < 6; i++) { + color += letters[Math.floor(Math.random() * 16)]; + } + return color; + } + +}); \ No newline at end of file diff --git a/pong/static/burger.js:Zone.Identifier b/pong/static/burger.js:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/flags/de.svg b/pong/static/flags/de.svg new file mode 100644 index 0000000..61e64d0 --- /dev/null +++ b/pong/static/flags/de.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pong/static/flags/de.svg:Zone.Identifier b/pong/static/flags/de.svg:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/flags/es.svg b/pong/static/flags/es.svg new file mode 100644 index 0000000..ce2e1a8 --- /dev/null +++ b/pong/static/flags/es.svg @@ -0,0 +1,712 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pong/static/flags/es.svg:Zone.Identifier b/pong/static/flags/es.svg:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/flags/fr.svg b/pong/static/flags/fr.svg new file mode 100644 index 0000000..240e789 --- /dev/null +++ b/pong/static/flags/fr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pong/static/flags/fr.svg:Zone.Identifier b/pong/static/flags/fr.svg:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/flags/it.svg b/pong/static/flags/it.svg new file mode 100644 index 0000000..038afd9 --- /dev/null +++ b/pong/static/flags/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pong/static/flags/it.svg:Zone.Identifier b/pong/static/flags/it.svg:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/flags/us.svg b/pong/static/flags/us.svg new file mode 100644 index 0000000..8a8fb5c --- /dev/null +++ b/pong/static/flags/us.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pong/static/flags/us.svg:Zone.Identifier b/pong/static/flags/us.svg:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/game.js b/pong/static/game.js new file mode 100644 index 0000000..b90dae0 --- /dev/null +++ b/pong/static/game.js @@ -0,0 +1,1101 @@ + +document.addEventListener('DOMContentLoaded', () => { + console.log("DOM fully loaded and parsed"); + const formBlock = document.getElementById('block-form'); + + const authForm = document.getElementById('auth-form'); + const nicknameInput = document.getElementById('nickname'); + const checkNicknameButton = document.getElementById('check-nickname'); + + const registerForm = document.getElementById('register-form'); + const passwordInput = document.getElementById('password'); + const confirmPasswordInput = document.getElementById('confirm-password'); + const registerButton = document.getElementById('register'); + + const loginForm = document.getElementById('login-form'); + const loginPasswordInput = document.getElementById('login-password'); + const loginButton = document.getElementById('login'); + + const authForm2 = document.getElementById('auth-form2'); + const nicknameInput2 = document.getElementById('nickname2'); + const checkNicknameButton2 = document.getElementById('check-nickname2'); + + const registerForm2 = document.getElementById('register-form2'); + const passwordInput2 = document.getElementById('password2'); + const confirmPasswordInput2 = document.getElementById('confirm-password2'); + const registerButton2 = document.getElementById('register2'); + + const loginForm2 = document.getElementById('login-form2'); + const loginPasswordInput2 = document.getElementById('login-password2'); + const loginButton2 = document.getElementById('login2'); + + const gameContainer = document.getElementById('game1'); + const tournamentContainer = document.getElementById('tournament-bracket'); + + const pongElements = document.getElementById('pong-elements'); + const logo = document.querySelector('.logo'); + + const postFormButtons = document.getElementById('post-form-buttons'); + const localGameButton = document.getElementById('local-game'); + const quickMatchButton = document.getElementById('quick-match'); + const tournamentButton = document.getElementById('tournament'); + + console.log("DOM elements initialized"); + + // Auto-focus and key handling for AUTH-FORM + nicknameInput.focus(); + nicknameInput.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + handleCheckNickname(); // Appeler directement la fonction au lieu de simuler un clic + } + }); + + checkNicknameButton.addEventListener('click', handleCheckNickname); + registerButton.addEventListener('click', handleRegister); + loginButton.addEventListener('click', handleLogin); + + checkNicknameButton2.addEventListener('click', handleCheckNickname2); + registerButton2.addEventListener('click', handleRegister2); + loginButton2.addEventListener('click', handleLogin2); + + localGameButton.addEventListener('click', startLocalGame); + quickMatchButton.addEventListener('click', startQuickMatch); + tournamentButton.addEventListener('click', startTournament); + + let socket; + let gameState; + let activeRoom = null; // Stocker la room active + let roomSockets = {}; // Stocker les connexions WebSocket par room + let token = null; + let username = null; + let saveData = null; + let roomName = null; + let chatManager = null; + + + async function handleCheckNickname() { + const nickname = nicknameInput.value.trim(); + if (nickname) { + window.firstPlayerName = 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 checkUserExists(username) { + console.log("checkUserExists called with username:", username); + try { + const response = await fetch('/check_user_exists/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username }) + }); + + if (!response.ok) { + console.error(`HTTP error! Status: ${response.status}`); + return false; + } + + const data = await response.json(); + console.log("User existence check response:", data); + return data.exists; + } catch (error) { + console.error('Error during user existence check:', error); + return false; + } + } + + async function handleRegister() { + console.log("handleRegister called"); + const nickname = nicknameInput.value.trim(); + const password = passwordInput.value.trim(); + const confirmPassword = confirmPasswordInput.value.trim(); + + console.log("Nickname:", nickname); + console.log("Password:", password); + console.log("Confirm Password:", confirmPassword); + + if (password === confirmPassword) { + try { + console.log("Attempting to register user:", nickname); + const result = await registerUser(nickname, password); + console.log("Register result:", result); + + if (result.registered) { // Vérifiez que result contient bien un champ registered + token = result.token; // Assurez-vous que le token est bien stocké ici + console.log("Token stored:", token); + console.log("User registered successfully"); + registerForm.style.display = 'none'; + document.getElementById("post-form-buttons").style.display = 'block'; + username = nickname; + roomName = 'main_room'; // Nom de la room principale + console.log("ChatManager initialized:", chatManager); + + console.log("Initializing ChatManager with username:", username, "and token:", token); + chatManager = new ChatManager(username, token); // Initialiser ChatManager + console.log("ChatManager initialized:", chatManager); + // Ajoutez un log pour vérifier si chatManager est défini + if (chatManager) { + console.log("chatManager is defined:", chatManager); + } else { + console.error("chatManager is not defined"); + } + + console.log("Joining room:", roomName); + chatManager.joinRoom(roomName); // Utilisez ChatManager pour rejoindre la room + } else { + console.error('Registration failed. No token received.'); + alert('Registration failed. Please try again.'); + } + } catch (error) { + console.error('Error registering user:', error); + } + } else { + alert('Passwords do not match.'); + console.error('Passwords do not match.'); + } + } + + async function registerUser(username, password) { + const response = await fetch('/register_user/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username, password }) + }); + const data = await response.json(); + if (data.registered) { + return { registered: true, token: data.token }; + } else { + return { registered: false }; + } + } + + async function handleLogin() { + const nickname = nicknameInput.value.trim(); + const password = loginPasswordInput.value.trim(); + try { + const result = await authenticateUser(nickname, password); + if (result) { + loginForm.style.display = 'none'; + document.getElementById("post-form-buttons").style.display = 'block'; + + // Gérer la connexion WebSocket de chat + if (chatManager && chatManager.roomSockets['main_room'] && chatManager.roomSockets['main_room'].readyState !== WebSocket.OPEN) { + console.log('Rejoining chat room...'); + chatManager.startChatWebSocket('main_room'); // Relance la connexion WebSocket si nécessaire + } else if (!chatManager) { + username = nickname; + console.log('Initializing ChatManager...'); + chatManager = new ChatManager(username, token); // Réinitialisation du ChatManager si nécessaire + chatManager.joinRoom('main_room'); + } + } else { + alert('Authentication failed. Please try again.'); + } + } catch (error) { + console.error('Error authenticating user:', error); + } + } + + async function authenticateUser(username, password) { + const response = await fetch('/authenticate_user/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username, password }) + }); + const data = await response.json(); + if (data.authenticated) { + token = data.token; + } + return data.authenticated; + } + + async function handleCheckNickname2() { + const nickname2 = nicknameInput2.value.trim(); + if (nickname2) { + try { + const exists = await checkUserExists2(nickname2); + if (exists) { + authForm2.style.display = 'none'; + loginForm2.style.display = 'block'; + loginPasswordInput2.focus(); + loginPasswordInput2.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + loginButton2.click(); + } + }); + } else { + authForm2.style.display = 'none'; + registerForm2.style.display = 'block'; + passwordInput2.focus(); + passwordInput2.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + confirmPasswordInput2.focus(); + confirmPasswordInput2.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + registerButton2.click(); + } + }); + } + }); + } + } catch (error) { + console.error('Error checking user existence:', error); + } + } else { + alert('Please enter a nickname.'); + } + } + + async function checkUserExists2(username) { + console.log("checkUserExists2 called with username:", username); + try { + const response = await fetch('/check_user_exists/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username }) + }); + + if (!response.ok) { + console.error(`HTTP error! Status: ${response.status}`); + return false; + } + + const data = await response.json(); + console.log("User existence check response (checkUserExists2):", data); + return data.exists; + } catch (error) { + console.error('Error during user existence check (checkUserExists2):', error); + return false; + } + } + + async function handleRegister2() { + console.log("handleRegister2 called"); + const nickname2 = nicknameInput2.value.trim(); + const password2 = passwordInput2.value.trim(); + const confirmPassword2 = confirmPasswordInput2.value.trim(); + + if (password2 === confirmPassword2) { + try { + console.log("Attempting to register user (handleRegister2):", nickname2); + const result = await registerUser2(nickname2, password2); + if (result) { + console.log("User registered successfully (handleRegister2)"); + registerForm2.style.display = 'none'; + startLocalGame2(); + } else { + console.error('Registration failed (handleRegister2).'); + alert('Registration failed. Please try again.'); + } + } catch (error) { + console.error('Error registering user (handleRegister2):', error); + } + } else { + alert('Passwords do not match.'); + console.error('Passwords do not match (handleRegister2).'); + } + } + + async function registerUser2(username, password) { + const response = await fetch('/register_user/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username, password }) + }); + const data = await response.json(); + if (data.registered) { + token2 = data.token; + } + return data.registered; + } + + async function handleLogin2() { + const nickname2 = nicknameInput2.value.trim(); + const password2 = loginPasswordInput2.value.trim(); + try { + const result = await authenticateUser2(nickname2, password2); + if (result) { + loginForm2.style.display = 'none'; + startLocalGame2(); + } else { + alert('Authentication failed. Please try again.'); + } + } catch (error) { + console.error('Error authenticating user:', error); + } + } + + async function authenticateUser2(username, password) { + const response = await fetch('/authenticate_user/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ username, password }) + }); + const data = await response.json(); + if (data.authenticated) { + token2 = data.token; + } + return data.authenticated; + } + + function startLocalGame() { + console.log("starting a Local Game.."); + document.getElementById("post-form-buttons").style.display = 'none'; + authForm2.style.display = 'block'; + nicknameInput2.focus(); + nicknameInput2.addEventListener('keypress', function (event) { + if (event.key === 'Enter') { + event.preventDefault(); + checkNicknameButton2.click(); + } + }); + } + + function startLocalGame2() { + nickname = nicknameInput.value.trim(); + nickname2 = nicknameInput2.value.trim(); + saveData = { + type: 'local', + player1_name: nickname, + player2_name: nickname2 + }; + gameContainer.style.display = 'flex'; + logo.style.display = 'none'; + pongElements.style.display = 'none'; + formBlock.style.display = 'none'; + startWebSocketConnection(token, 2); + } + + function startQuickMatch() { + saveData = { + type: 'quick' + } + console.log("Starting quick match...(fonction startquickmatch)"); + // Masquer les éléments inutiles et afficher le conteneur de jeu + gameContainer.style.display = 'flex'; + logo.style.display = 'none'; + pongElements.style.display = 'none'; + formBlock.style.display = 'none'; + + // Log pour vérifier le token avant l'authentification WebSocket + console.log("Token before WebSocket authentication:", token); + + if (!token) { + console.error("Token is not defined or is null. WebSocket connection aborted."); + return; + } + + // Vérification si une connexion WebSocket est déjà active avant d'initialiser + if (roomSockets["quick_match"] && roomSockets["quick_match"].readyState === WebSocket.OPEN) { + console.warn("WebSocket for quick_match already open."); + return; + } + 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() { + saveData = { + type: 'tournoi' + } + // Masquer les éléments inutiles et afficher le conteneur du tournoi + tournamentContainer.style.display = 'flex'; + logo.style.display = 'none'; + pongElements.style.display = 'none'; + formBlock.style.display = 'none'; + + // Log pour vérifier le token avant l'authentification WebSocket + console.log("Token before WebSocket authentication:", token); + + if (!token) { + console.error("Token is not defined or is null. WebSocket connection aborted."); + return; + } + + // Vérification si une connexion WebSocket est déjà active avant d'initialiser + if (roomSockets["tournament"] && roomSockets["tournament"].readyState === WebSocket.OPEN) { + console.warn("WebSocket for tournament already open."); + return; + } + 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 + } + + + function startWebSocketConnection(token, players) { + if (socket && socket.readyState === WebSocket.OPEN) { + console.warn('WebSocket connection already open.'); + return; + } + socket = new WebSocket(`ws://${window.location.host}/ws/game/`); + + socket.onopen = function (event) { + console.log('WebSocket connection established'); + if (players === 1) { + console.log("Sending token for a quick match game"); + socket.send(JSON.stringify({ type: 'authenticate', token: token })); + } else if (players === 2) { + console.log("Sending tokens for a local game"); + socket.send(JSON.stringify({ type: 'authenticate2', token_1: token, token_2: token2 })); + } else { + console.log("Sending token for a tournament game"); + socket.send(JSON.stringify({ type: 'authenticate3', token: token })); + } + }; + + socket.onmessage = function (event) { + const data = JSON.parse(event.data); + if (data.type === 'authenticated') { + console.log('Authentication successful'); + } else if (data.type === 'waiting_room') { + console.log('Entered the WAITING ROOM'); + } else if (data.type === 'game_start') { + console.log('Game started:', data.game_id, '(', data.player1, 'vs', data.player2, ')'); + gameContainer.style.display = 'flex'; + document.addEventListener('keydown', handleKeyDown); + } else if (data.type === 'game_state_update') { + updateGameState(data.game_state); + } else if (data.type === 'player_disconnected') { + console.log('Player disconnected:', data.player); + } else if (data.type === 'game_ended') { + console.log('Game ended:', data.game_id); + } else if (data.type === 'error') { + console.error(data.message); + } else if (data.type === 'update_tournament_waiting_room') { + // Update the HTML content of the tournament bracket + document.getElementById('tournament-bracket').innerHTML = data.html; + // Reattach the event listener to the "Start Tournament" button + const startButton = document.getElementById('start-tournament-btn'); + if (startButton) { + startButton.addEventListener('click', function() { + if (typeof socket !== 'undefined' && socket.readyState === WebSocket.OPEN) { + console.log('Start TOURNAMENT sent..'); + socket.send(JSON.stringify({type: 'start_tournament'})); + } else { + console.error('WebSocket is not open or undefined'); + } + }); + } + } else if (data.type === 'update_brackets') { + // Update the HTML content of the tournament bracket + document.getElementById('tournament-bracket').innerHTML = data.html; + } else if (data.type === 'tournament_end') { + console.log('Tournament ended, the winner is:', data.winner); + // Nouveau cas pour gérer les prochains matchs du tournoi + } else if (data.type === 'tournament_match') { + console.log('Prochain match du tournoi:', data.message); + // Transmettre le message au chat via WebSocket du chat + if (chatManager.chatSocket && chatManager.chatSocket.readyState === WebSocket.OPEN) { + chatManager.chatSocket.send(JSON.stringify({ + type: 'chat_message', + message: data.message, + username: 'Server', // Ou le nom d'utilisateur si pertinent + room: 'tournament' // Ou la room appropriée + })); + } + } else { + console.log('Message from server:', data.type, data.message); + } + }; + + // Gestion des fermetures de connexion + socket.onclose = function (event) { + console.log('WebSocket connection closed'); + }; + + socket.onerror = function (error) { + console.error('WebSocket error:', error); + }; + } + + // Gestion des événements de touche + function handleKeyDown(event) { + console.log("Key pressed:", event.key); + if (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'w' || event.key === 's') { + sendKeyPress(event.key.toLowerCase()); + } + } + + function sendKeyPress(key) { + console.log("Sending key press:", key); + if (socket.readyState === WebSocket.OPEN) { + socket.send(JSON.stringify({ type: 'key_press', key })); + } else { + console.warn("WebSocket is not open. Key press not sent."); + } + } + + function updateGameState(newState) { + gameState = newState; + renderGame(); + checkForWinner(); + } + + // Fonction pour rendre l'état du jeu à l'écran + function renderGame() { + console.log("Rendering game state..."); + document.getElementById('player1-name').textContent = `${gameState.player1_name}`; + document.getElementById('player2-name').textContent = `${gameState.player2_name}`; + + document.getElementById('player1-pad').style.top = `${gameState.player1_position}px`; + document.getElementById('player2-pad').style.top = `${gameState.player2_position}px`; + + document.getElementById('ball').style.left = `${gameState.ball_position.x}px`; + document.getElementById('ball').style.top = `${gameState.ball_position.y}px`; + + document.getElementById('player1-score').textContent = gameState.player1_score; + document.getElementById('player2-score').textContent = gameState.player2_score; + + document.getElementById('game-text').textContent = gameState.game_text; + } + + // Détection de la commande /s username + function sendStatsCommand(targetUser) { + console.log(`Detected stats command for user: ${targetUser}`); + + // Appelle fetchPlayers et utilise .then() pour traiter les résultats + fetchPlayers().then((players) => { + if (!players) { + console.log('No players found.'); + return; + } + + console.log('Players received in sendStatsCommand:', players); // Affiche les joueurs récupérés + + // Filtrer et récupérer les informations du joueur spécifique + const playerStats = filterPlayers(targetUser); + if (playerStats) { + // Si les stats sont trouvées, afficher la popup avec les données + displayPlayerStats(playerStats); + } else { + console.log(`Player with username ${targetUser} not found.`); + } + }).catch(error => { + console.error('Error fetching players:', error); + }); + } + + // Modification de filterPlayers pour renvoyer les données du joueur trouvé + function filterPlayers(targetUser) { + const searchValue = targetUser.toLowerCase(); // Utiliser le nom d'utilisateur comme valeur de recherche + const playersListBody = document.querySelector('#player-list tbody'); + const rows = playersListBody.getElementsByTagName('tr'); + + for (let i = 0; i < rows.length; i++) { + const nameCell = rows[i].getElementsByTagName('td')[1]; // Colonne du nom de l'utilisateur + if (nameCell) { + const nameValue = nameCell.textContent || nameCell.innerText; + if (nameValue.toLowerCase().indexOf(searchValue) > -1) { + rows[i].style.display = ''; // Affiche uniquement la ligne correspondant au joueur + + // Récupérer les statistiques du joueur à partir des cellules de la ligne + const playerStats = { + username: nameValue, + total_matches: rows[i].getElementsByTagName('td')[2].textContent, + total_wins: rows[i].getElementsByTagName('td')[3].textContent, + win_percentage: rows[i].getElementsByTagName('td')[4].textContent, + best_score: rows[i].getElementsByTagName('td')[5].textContent + }; + return playerStats; // Retourne les stats du joueur + } + } + } + + return null; // Retourne null si le joueur n'est pas trouvé + } + + function displayPlayerStats(stats) { + console.log('Displaying player stats:', stats); // Vérifie que la fonction est bien appelée + + // Créer ou récupérer l'élément popup + let statsPopup = document.getElementById('player-stats-popup'); + + if (!statsPopup) { + console.log('Creating stats popup element'); // Vérifie si l'élément est bien créé + statsPopup = document.createElement('div'); + statsPopup.id = 'player-stats-popup'; + statsPopup.classList.add('player-stats-popup'); + document.body.appendChild(statsPopup); + } + + // Mettre à jour le contenu de la popup avec les statistiques + statsPopup.innerHTML = ` +

Player Stats

+

Username: ${stats.username}

+

Total Matches: ${stats.total_matches}

+

Total Wins: ${stats.total_wins}

+

Win Percentage: ${stats.win_percentage}%

+

Best Score: ${stats.best_score}

+ `; + + // Afficher la popup avec une animation + statsPopup.classList.add('show'); + statsPopup.classList.remove('hide'); + + // Masquer la popup après 5 secondes + setTimeout(() => { + statsPopup.classList.remove('show'); + statsPopup.classList.add('hide'); + }, 3000); + } + + + +////////////////////////////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 + this.chatSocket = null; // Le WebSocket de chat actif + + console.log(`ChatManager initialized for user: ${username}`); + this.initializeEventListeners(); // Initialiser les gestionnaires d'événements + } + initializeEventListeners() { + const quitButton = document.getElementById('quit-room-btn'); + if (quitButton) { + quitButton.addEventListener('click', () => { + if (this.activeRoom) { + this.leaveRoom(this.activeRoom); + console.log(`User ${this.username} has left the room ${this.activeRoom}`); + } else { + console.warn('No active room to leave.'); + } + }); + } + } + + 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 { + this.chatSocket = new WebSocket(`ws://${window.location.host}/ws/chat/${roomName}/`); + this.roomSockets[roomName] = this.chatSocket; // Stockage du WebSocket + console.log(`startChatWebSocket: ${roomName} with username: ${this.username} and token: ${this.token}`); + + const chatInputInstance = new ChatInput(roomName, this.username, this.chatSocket, this); // On passe l'instance du manager + + // Gestion de l'ouverture du WebSocket + this.chatSocket.onopen = () => { + console.log(`WebSocket ouvert pour l'utilisateur ${this.username} dans la room ${roomName}`); + + this.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 + this.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': + // 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 + this.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(() => { + console.log("Appel de startQuickMatch(invite)..."); + startQuickMatch(); // Lancer le jeu après 2 secondes + console.log("startQuickMatch appelé."); + }, 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..."); + console.log("Appel de startQuickMatch...(invite response)"); + startQuickMatch(); + console.log("startQuickMatch appelé."); + } + } + break; + + case 'player_stats': + console.log('Player stats received:', data); + displayPlayerStats(data.stats); + 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 + this.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 + this.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); + // Activer l'affichage du conteneur de chat + document.getElementById('chat-container').style.display = 'flex'; + } + + leaveRoom(roomName) { + if (this.roomSockets[roomName]) { + console.log(`Leaving room: ${roomName}`); + this.roomSockets[roomName].close(); + delete this.roomSockets[roomName]; + if (this.activeRoom === roomName) { + this.activeRoom = null; + this.chatSocket = null; + } + } else { + console.warn(`No active WebSocket found for room: ${roomName}`); + } + } +} + + class ChatInput { + constructor(roomName, username, chatSocket, chatManager) { + this.roomName = roomName; + 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: ${username}`); + this.initEventListeners(); + } + + initEventListeners() { + this.messageInput.addEventListener('keypress', (event) => { + if (event.key === 'Enter') { + console.log("Enter key pressed, attempting to send message..."); + this.sendMessage(); + } + }); + + this.chatButton.addEventListener('click', () => { + console.log("Send button clicked, attempting to send message..."); + this.sendMessage(); + }); + } + + 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(); + console.log(`Detected block command for user: ${targetUser}`); + this.sendBlockCommand(targetUser); + } else if (message.startsWith('/i ')) { + const targetUser = message.slice(3).trim(); + console.log(`Detected invite command for user: ${targetUser}`); + this.sendInviteCommand(targetUser); + } else if (message.startsWith('/s ')) { + const targetUser = message.slice(3).trim(); + console.log(`Detected stats command for user: ${targetUser}`); + sendStatsCommand(targetUser); + } else { + console.log(`Sending chat message to WebSocket...`); + this.chatSocket.send(JSON.stringify({ + 'type': 'chat_message', + 'username': this.username, + 'message': message, + 'room': this.roomName + })); + } + this.messageInput.value = ''; + console.log("Message input cleared."); + } else { + console.warn('Cannot send an empty message.'); + } + } + + 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', + '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', + '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 + })); + } + } + }); \ No newline at end of file diff --git a/pong/static/game.js:Zone.Identifier b/pong/static/game.js:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/index.html b/pong/static/index.html new file mode 100644 index 0000000..6203e94 --- /dev/null +++ b/pong/static/index.html @@ -0,0 +1,339 @@ +{% load static %} + + + + + + + Pong Game + + + + +
+ Français + English + Italiano + Español + Deutsch +
+
+
+
+
+
+
+
+
+ + + + +
+

BIENVENUE DANS LE PONG 42

+
+
+ + + +
+ + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Main Room
+
Tournament
+
Quick Match
+
+
+ + + + + + + + \ No newline at end of file diff --git a/pong/static/index.html:Zone.Identifier b/pong/static/index.html:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/language.js b/pong/static/language.js new file mode 100644 index 0000000..dd5b518 --- /dev/null +++ b/pong/static/language.js @@ -0,0 +1,113 @@ +document.addEventListener('DOMContentLoaded', () => { + const translations = { + fr: { + welcome: "BIENVENUE DANS LE PONG 42", + labelNickname: "Entrez votre surnom:", + labelPassword: "Entrez votre mot de passe:", + labelConfirmPassword: "Confirmez votre mot de passe:", + labelLoginPassword: "Entrez votre mot de passe:" + }, + en: { + welcome: "WELCOME TO PONG 42", + labelNickname: "Enter your nickname:", + labelPassword: "Enter your password:", + labelConfirmPassword: "Confirm your password:", + labelLoginPassword: "Enter your password:" + }, + it: { + welcome: "BENVENUTO A PONG 42", + labelNickname: "Inserisci il tuo soprannome:", + labelPassword: "Inserisci la tua password:", + labelConfirmPassword: "Conferma la tua password:", + labelLoginPassword: "Inserisci la tua password:" + }, + es: { + welcome: "BIENVENIDO A PONG 42", + labelNickname: "Introduce tu apodo:", + labelPassword: "Introduce tu contraseña:", + labelConfirmPassword: "Confirma tu contraseña:", + labelLoginPassword: "Introduce tu contraseña:" + }, + de: { + welcome: "WILLKOMMEN BEI PONG 42", + labelNickname: "Geben Sie Ihren Spitznamen ein:", + labelPassword: "Geben Sie Ihr Passwort ein:", + labelConfirmPassword: "Bestätigen Sie Ihr Passwort:", + labelLoginPassword: "Geben Sie Ihr Passwort ein:" + } + }; + + function setCookie(name, value, days) { + const d = new Date(); + d.setTime(d.getTime() + (days*24*60*60*1000)); + const expires = "expires=" + d.toUTCString(); + document.cookie = name + "=" + value + ";" + expires + ";path=/"; + } + + function getCookie(name) { + const cname = name + "="; + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(';'); + for(let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1); + } + if (c.indexOf(cname) === 0) { + return c.substring(cname.length, c.length); + } + } + return ""; + } + + function changeLanguage(lang) { + setCookie('preferredLanguage', lang, 365); + document.getElementById('welcome').innerText = translations[lang].welcome; + document.getElementById('label-nickname').innerText = translations[lang].labelNickname; + document.getElementById('label-password').innerText = translations[lang].labelPassword; + document.getElementById('label-confirm-password').innerText = translations[lang].labelConfirmPassword; + document.getElementById('label-login-password').innerText = translations[lang].labelLoginPassword; + } + + function setLanguageFromCookie() { + const preferredLanguage = getCookie('preferredLanguage'); + if (preferredLanguage && translations[preferredLanguage]) { + changeLanguage(preferredLanguage); + } else { + changeLanguage('fr'); // Default to French if no cookie is found + } + } + + document.getElementById('lang-fr').addEventListener('click', () => changeLanguage('fr')); + document.getElementById('lang-en').addEventListener('click', () => changeLanguage('en')); + document.getElementById('lang-it').addEventListener('click', () => changeLanguage('it')); + document.getElementById('lang-es').addEventListener('click', () => changeLanguage('es')); + document.getElementById('lang-de').addEventListener('click', () => changeLanguage('de')); + + window.onload = setLanguageFromCookie; + + document.getElementById('settings-btn').addEventListener('click', function() { + document.getElementById('settings-menu').style.display = 'block'; + }); + + document.getElementById('close-settings').addEventListener('click', function() { + document.getElementById('settings-menu').style.display = 'none'; + }); + + + document.getElementById('color-picker').addEventListener('input', function() { + document.body.style.color = this.value; + document.querySelectorAll('button').forEach(function(button) { + button.style.backgroundColor = this.value; + }, this); + }); + + document.getElementById('font-selector').addEventListener('change', function() { + document.body.style.fontFamily = this.value; + }); + + document.getElementById('font-size-slider').addEventListener('input', function() { + document.body.style.fontSize = this.value + 'px'; + }); + +}); \ No newline at end of file diff --git a/pong/static/language.js:Zone.Identifier b/pong/static/language.js:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/logo-42-perpignan.png b/pong/static/logo-42-perpignan.png new file mode 100644 index 0000000000000000000000000000000000000000..d91cd1fdf1da6f33dbc52a7600762b165c1424f3 GIT binary patch literal 5912 zcmeHL_d6U+wARb&tX@}_5WOV2)h*U;1krn4J)(wSm5^u=QNyZ92%-z?vtgA)FDrT{ zy68f3H}~JTcYc^>&O9^kdFMSd&&-@;sEHm8fCE54KtN-luMHz0AjII?xfI0sI^}Zk zf`EXS01A1iqvsF#`~T(t75KlZfa}_!3jS~q1j9_=1kzu6yT8sur7&ZaxqWG}XMf)V z^fjkWG{kz);=f)T-%UBXC-dr5QX(}y^TVuz*K(p4Dwj6$ovH>y*zAM{Nr_02 zWWeb4gIX5<0Oty}sKcE6KL*pXu8a&8jxV>? zt+hqaL~UsEs(qWJ8g8s-pA96l+vck_ulc0a@FYask&d5$fU(a&Tk~OP!M?4h1G5g} z0fkcx1-ltN4N1IltTxe|w^bfQN#uOp=0MFP5gzR}M#==zHgiit9Zd#F=sJZi4eH}| zEZ?0vejWx_W(GQv4*Fn=g~AU9MQerG7j`0H;Ar*5VBEuz$?q5KU#_{ZPATyMJCj1o z{o#676%auopHZn~)T5Szv6oIaE{RkeBAjwu6FrJQ>l@?yrbHG?JdIVNZv^Vuk8jEP z`TMdM72HMW{Q{iM)Y0VWj_|fzL!GQsl^7U z=OOU`OvT`>p?F78pA68M9MUk|#8t{trym1-JBuBk0DjOQYBCjmSZSdTVDiDE6EzwL zp{KIIwn9LpC+)uuC_A+s9g!AvhQGI@QY`g;722a;yk86Yc7D1XZ_C3>P@Q9S&g$Kw zK5q`DCxBSCNwwTjq$nQ+lGgq;7|v!bNdMaz&;#I1>ct~CLV8+0y2QFM3dB;dYnxUOU%gNRy2;a`@Dpfcl*bpHnK#$k z#UMs>75E;?s<8A?RLe4|PKWP*Nm7-;qs&kuasIHkT-89=Jj~me*#<=Lhe300pxf2O zz|1I6H*K>gT&n-|l7l~#t?{3>rMeHAc&b;&`SUSu|HK{R&$=Z0Swl%^;22YcV3k9f zq0FmwLvQ&+Ayfw`f%pl;P3~U?!=SLYESP^(b@9wqBx1bPG3F#WVH-9{^GiI%X6g<7NpVKaY`PM7gepnWr0s4HXe?da zmZ3czW=-*3fCCj}#w#ZhF2nj>AwG|^A>w_r;P7a^<%>H{U8*Fmp(mzvM$oyq9risF z7ibR3H$BR1;|+b(nA&VcK&k8$tGOM69i#z_i&Nuk5$5MwDUaJ3#QT0ZJAoPz;K(eW zO%Ek*vTv;Q0#}9AnWDXnR;eb#p<$prJwYj}2pM0f`^|J7OBC<^K&$3ZT#jf<{GbCm z5I-u%PB$W8r*AvCh7u$G=POn29xb2H}%_7&5c~+s#?mt%_Xp&`54=k+N zIto1W(O%$HYSrYk;*5{8jK3)GURP-*!(^H&?q?L%&SqX>%5OamCGgru3o*{<;N1rc zzd^NqpeZp49vrmz7mD`U$2Fc~-u9E^5A7eS#%bF(ju33T>0zxpE52q?t>>RSE2gUo zn(`XjhUG*~CG@aY6{QB0dl^+pgyVTh`_muyPUWewtL`q+1lB%Ao+xG# zWlv8FLlxoe?ZfiYy-nzZbtam&SCC=SJS}Q+6berXxuszsUShxduZUZJC zJ56BMbu?eJkkGa**Cy4owFhfG11>zbHb~3XUifeK(bv`*L&@s%?tGvyJJx^p#2X-x z00aEySTCfPM>2pxNDEX^1ymjg>&Ks@4<)ZKHlHl+ig8H?PNu)Lp9}(?Gl!2sXF`G* zP?zTr&;S=4CMXqN&EDmlI;u2*5)6>D5JSuB=o_XOy)eYy8sDMjir(rm$f|_wOAVnX zwo#d@U-q^adWD2~FJ_Ld-GIzPbxx$RDJj_71;;IB9i6p*bb;Kj2USFIX5NbI~Z~I0dHwo^EFg< zcFY@S=kikryuvWdsYa5S$Q>)~*3l(^ju8p($=%jUUmmrZ)l#t@?+bhUETfvh*}_V3 zSk`$U&1$Ug_>@T|{DG;@h47TLvwK)7#>N`YCcpjQQZNXonDW*%=f(*V{K`mS;jkqu?2Pr(Q#+5v(0b`veq zNtcQ@e8N=wvSkI4cR7xl8gD_RFGar|8J0YB+bm=P9f{jW>s3hPJl{GpL4>-XT=u~p-0C0s{2|s;S0_vKyY!;+?Rny0RM-a)rS7grC zFD(=e{>55hh(Q=+XPE;_kjmp{{O=FvwoG5AM@04v_&w-zCOM$@tR9*7S=kK$Bk1`^({Lw{CM3>h`$5+Q_c}uS~lJ|VB!K{Wkf`|5Y zC`d^f&~>G}r&O!1vV> zbH$A^hnVJO^8Np?%hGx(QVKvV2M=Ng&+W*Ols+O{ncsCc+{wa?7K@MgqdWV>s!wyr zpK>|F_t;Dn-)^cz`w}Lh{Y7>LXYMIY=hXf&>Nx-S2IC`aGpL2F6GeY$1 z=-gxP{K|M`^LaI+NVT!EcS-b$RvI+)F##TvtM$i|l7rNJUpKv4!feM^Cv7U`&3DJd zD#{2+I1B+@S~b&euy9DD7&b4OqvM(4O=S|gC{2Utp1;URYgC)g3eK4AHyKeStrbNg zzaMl)EZuG$7!qW+xyvZbJ#ipQMMafT7xC@D=jubY{su(OgG;~eHA2jENUMfPoO`<^ z4io5VDjW0ijq%c=AfuE5GwV;mO70#P?khyG z7ZhVMS$WA?cCIYCx6MJVE&E^ehJD_S=#8NQ?+fGV#pR8zHRv14o55_V<#&xNT60kA zkS2C@nqvZF_bGqn5xM@KLU=4qFYlhx0~J+E!fVwvg!1{d)wH`>)`C2C+Sx3U>w%h7 zg%Zi*!^6OhcjXIG;g&lWa_R1zU5#8)V;40tGg<`)IZ`Q6q}KZ!oC@zuRbu8+4Zh7p1; z)JXW=$Ca4nN2cZ{t?A4N-MKr_geiBG!L@%1y0=!oHMpr23dE^N9*9vtV&E8qCLvz* znj|-rP;md~(ja(%IlvxpvX%CACvDl{2nP~XEFTOY=0UGlNkY6?68L(lqa=yXpKRu# z9~zy6*1-(JSTWepN+}O9FKsYL*nUHVf$h6?m;8e&do9t38cRmlI;4?KFmP#|*VaA* zok!KDsnly2gRTUT=e`PAx}{0zlo^@9y`xxt5@1r|H_}XH1`9>Li+84n#KjPjt$arL zvpBbW4QQ8T_|(Der?b?kd!`-+O?sT4@#j&q6Z5FJ+zf?JwZ^-2g3VJ__Bp@S%_mw(S~>TDg9Q`Ta4XV9;4Ln ztORR6l&EibhMV7?SgY#@O1iNz?#`F;S?j#&`#$A4@ym5W|2f(kh9}`K_gCfyN2s! z20+f=KG%Ka-idHXA6t2%NO(`*j)d|6OHfXF=CB_|2gdK#UT6{LW; zYlA!@Kz<3ZFOF6gd>ZSpvEWvfQ(&w_wSKZrGQrtvd2toF$bpjm9neMbY?kg>tvfaR z@XppaC*Zr$4IyYg!ObiWVs#$Tq~5^9Q!GVDQP!S5_orUgzn4ps*VcW>NEH;RpGh<J3u67pe$QLbAv`1g3Xo=E0P`K|pDh-nqXkFmyG(uuyrM%cwWz*0 zlzr_BPs*o4#NJ0LeYw2M3lH6-1Vrl*F9qsji(N7-pDWO5KTU2Kd5U}d*#_4CGCD|PP_tLX}Wmmpq4T6i}Nt+SoA86IdULl z{=|2MlmrmHA#zdx#JHLKroDz*9z0WZC7n8{e!ffyuo7rIqOguR_U<*Y35*Xl&?7=R z^(nI=-3sr7>;yrRBF+&D=xlGef({K3rw|L!Y+p$E z-*d961>k?5i6q5!TumbDe?{Fo6UyjWz1(w$$9}Eoo_E*y;g%;NVzs7)fAq}>7u~|Qlzj~lPp!ZoWQH}Rb8zE0gy7_@W+n0$vVtLzVVUa{Vk5%tD>7{gD zgiDz?%1pa@3ngwj80UPQ2?=niEsczsu_NvhzeGoMl@XAc^LA)~oI4*-!bOGx^o?rw z$v?++oVf8`1e?gry%16NA_}ofbdFN34E4MIATO5ipe1Z=!_lb@yU=2e11X|Z>G_#`~dq@d4lC*9lKwM0jn*c f6A9sDf61#)A~#d%>Phh#Zvq1y6YWo04zd3OsHB2+ literal 0 HcmV?d00001 diff --git a/pong/static/logo-42-perpignan.png:Zone.Identifier b/pong/static/logo-42-perpignan.png:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/static/styles.css b/pong/static/styles.css new file mode 100644 index 0000000..c17813c --- /dev/null +++ b/pong/static/styles.css @@ -0,0 +1,721 @@ +/* General styles */ + +html { + font-family: Arial, sans-serif; + color: #00ffff; + background-color: #0a0a2a; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + overflow: auto; +} + + +label { + margin: 10px 0 5px; +} + +input { + padding: 10px; + margin: 5px 0 20px; + width: 200px; +} + +button { + background-color: #00ffff; + color: #000033; + border: none; + padding: 1rem 2rem; + font-size: 1.5rem; + cursor: pointer; + transition: all 0.3s ease; + border-radius: 10px; + margin-top: 1rem; + text-transform: uppercase; + letter-spacing: 2px; +} + +button:hover { + background-color: #000033; + color: #00ffff; + box-shadow: 0 0 20px #00ffff; +} + +#game1 { + width: 810px; + height: 500px; + position: relative; + background-color: #000; + border: 3px solid #00ffff; + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; +} + +.name { + font-size: 24px; + position: absolute; + top: 20px; +} + +#player1-name { + left: 10px; + /* Adjust player score position */ +} + +#player2-name { + right: 10px; + /* Adjust bot score position */ +} + +#game2 { + top: 60px; + width: 800px; + height: 400px; + position: absolute; + background-color: #000; + overflow: hidden; + border: 2px solid white; + /* Add red border */ + display: flex; + justify-content: center; + align-items: center; +} + +.score { + font-size: 24px; + position: absolute; + top: 10px; +} + +#player1-score { + left: 50px; + /* Adjust player score position */ +} + +#player2-score { + right: 50px; + /* Adjust bot score position */ +} + +.pad { + width: 10px; + height: 100px; + background-color: #ffffff; + position: absolute; +} + +#player1-pad { + left: 10px; + background-color: #00ffff; + border-radius: 10px; + box-shadow: 0 0 15px #00ffff; +} + +#player2-pad { + right: 10px; + background-color: #00ffff; + border-radius: 10px; + box-shadow: 0 0 15px #00ffff; +} + +#ball { + width: 20px; + height: 20px; + background-color: #00ffff; + border-radius: 50%; + position: absolute; +} + +#game-text { + font-size: 64px; + color: #00ffff; + position: absolute; + top: 150px; +} + +.logo { + position: absolute; + top: 20px; + left: 20px; + z-index: 20; +} + +.logo img { + max-width: 100%; + height: auto; +} + +.stars { + position: absolute; + width: 100%; + height: 100%; +} + +.star { + position: absolute; + background-color: #ffffff; + border-radius: 50%; + animation: twinkle 2s infinite alternate; +} + +.background { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 0; + pointer-events: none; +} + +.pong-elements { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 5; + pointer-events: none; +} + +.paddle { + position: absolute; + width: 20px; + height: 100px; + background-color: #00ffff; + border-radius: 10px; + box-shadow: 0 0 15px #00ffff; +} + +.paddle-left { + left: 50px; + animation: paddleMove 5s infinite alternate ease-in-out; +} + +.paddle-right { + right: 50px; + animation: paddleMove 4s infinite alternate-reverse ease-in-out; +} + +.ball_anim { + position: absolute; + width: 30px; + height: 30px; + background-color: #00ffff; + border-radius: 50%; + box-shadow: 0 0 20px #00ffff; + left: 80px; + top: 50%; + transform-style: preserve-3d; + animation: ballMove 3s linear infinite; +} + +@keyframes paddleMove { + 0% { + transform: translateY(10vh); + } + + 100% { + transform: translateY(70vh); + } +} + +@keyframes ballMove { + 0% { + transform: translateZ(0) scale(1); + } + + 50% { + transform: translateZ(-500px) scale(0.5); + } + + 100% { + transform: translateZ(0) scale(1); + } +} + +.input-container { + margin-bottom: 2rem; +} + +.container { + text-align: center; + background-color: rgba(0, 0, 40, 0.8); + padding: 3rem; + border-radius: 15px; + border: 3px solid #00ffff; + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + position: relative; + z-index: 10; + max-width: 80%; + overflow: auto; +} + + +.navbar { + position: absolute; + top: 30px; + right: 10px; + padding: 10px; +} + +.burger-menu { + font-size: 24px; + background: none; + border: none; + color: #00ffff; + cursor: pointer; + transition: color 0.3s ease; +} + +.burger-menu:hover { + color: #ffffff; +} + +.dropdown-content { + display: none; + position: absolute; + top: 100%; + right: 0; + margin-top: 10px; + background-color: #1a1a2e; + color: #ffffff; + box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.3); + border-radius: 5px; + z-index: 1; + width: max-content; +} + +.dropdown-content.show { + display: block; +} + +.dropdown-content a { + color: #ffffff; + padding: 12px 16px; + text-decoration: none; + display: block; + border-bottom: 1px solid rgba(255, 255, 255, 0.2); + transition: background-color 0.3s ease; +} + +.dropdown-content a:hover { + background-color: #333; + color: #00ffff; +} + +.language-switcher { + position: absolute; + top: 10px; + right: 10px; + display: flex; + gap: 10px; +} + +.language-switcher img { + width: 30px; + height: 20px; + cursor: pointer; +} + +#settings-btn { + position: fixed; + bottom: 10px; + right: 10px; + cursor: pointer; + z-index: 1000; + border: none; + border-radius: 50%; + padding: 10px; + font-size: 18px; +} + +#settings-menu { + position: fixed; + bottom: 50px; + right: 10px; + padding: 20px; + background-color: rgb(66, 63, 63); + border: 1px solid #ccc; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + width: 250px; + z-index: 1000; +} + +#close-settings { + position: absolute; + top: 10px; + right: 10px; + background: none; + border: none; + cursor: pointer; + font-size: 16px; +} + +.modal { + display: none; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgb(0, 0, 0); + background-color: rgba(0, 0, 0, 0.4); + padding-top: 60px; +} + +.modal-content { + background-color: #fefefe; + margin: 5% auto; + padding: 20px; + border: 5px solid #888; + width: 80%; + max-height: 70vh; + overflow-y: auto; +} + +.close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; +} + +.close:hover, +.close:focus { + color: black; + text-decoration: none; + cursor: pointer; +} + +pre { + white-space: pre-wrap; + word-wrap: break-word; +} +/* +.tournament-waiting-room { + background-color: rgba(0, 0, 0, 0.6); + padding: 20px; + border-radius: 15px; + color: #00ffff; + width: 50%; + margin: auto; + text-align: center; + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + +} + +.tournament-waiting-room h2 { + font-family: 'Arial', sans-serif; + font-size: 2em; + margin-bottom: 15px; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7); +} + +.tournament-waiting-room p { + font-family: 'Verdana', sans-serif; + font-size: 1.2em; + margin-bottom: 20px; + text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6); +} + +.tournament-waiting-room ul { + list-style-type: none; + padding: 0; +} +*/ +body { + color: rgb(0, 255, 255); /* Valeur par défaut */ + font-family: Arial, sans-serif; + font-size: 16px; +} + +canvas { + max-width: 100%; + height: auto; + margin-top: 20px; +} + +#game-controls { + display: flex; + justify-content: center; + gap: 20px; + margin-bottom: 10px; +} + +#game-controls button { + background-color: #00ffff; + color: #000033; + border: none; + padding: 1rem 2rem; + font-size: 1rem; + cursor: pointer; + transition: all 0.3s ease; + border-radius: 10px; + text-transform: uppercase; + letter-spacing: 2px; +} + +#game-controls button:hover { + background-color: #000033; + color: #00ffff; + box-shadow: 0 0 20px #00ffff; +} + +/**************************CHAT*************************************/ +@keyframes borderGlow { + 0% { + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + } + 50% { + box-shadow: 0 0 60px #0099ff, inset 0 0 40px #0099ff; + } + 100% { + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + } +} + +#chat-container { + display: none; /* Masquer par défaut */ + position: fixed; + bottom: 10px; + left: 10px; + width: 300px; + background-color: rgba(0, 0, 0, 0.7); /* Couleur de fond semi-transparente par défaut */ + border-radius: 10px; + padding: 10px; + box-shadow: 0 0 30px #00ffff, inset 0 0 20px #00ffff; + z-index: 1000; + box-sizing: border-box; + flex-direction: column; + animation: borderGlow 3s infinite; /* Ajouter l'animation */ + transition: background-color 0.3s, transform 0.3s; /* Ajouter des transitions */ +} + +#chat-container:hover { + background-color: rgba(0, 0, 0, 1); /* Couleur de fond opaque au survol */ + transform: scale(1.05); /* Agrandir légèrement au survol */ +} + +.chat-log { + max-height: 150px; + overflow-y: auto; + margin-bottom: 10px; + box-sizing: border-box; + background-color: transparent; + display: none; +} + +.chat-input { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + margin-bottom: 5px; + position: relative; /* Assurez-vous que le conteneur parent est positionné */ +} + +.chat-input.active { + display: flex; /* Afficher uniquement l'élément actif */ +} + +.chat-input input[type="text"] { + flex: 1; + padding: 5px; + font-size: 13px; + border: none; + border-radius: 5px; + box-sizing: border-box; + height: 28px; + width: 250px; /* Réduire la largeur */ + align-items: center; + justify-content: center; +} + +.chat-button { + height: 50px; + width: 50px; /* Réduire la taille du bouton */ + border: none; + border-radius: 50%; + background: linear-gradient(45deg, #00ffff, #0099ff); + color: #000033; + cursor: pointer; + position: absolute; /* Positionner le bouton de manière absolue */ + right: 10px; /* Ajuster la position à droite */ + top: 10%; /* Centrer verticalement */ + transform: translateY(-50%); /* Centrer verticalement */ + display: flex; + align-items: center; + justify-content: center; + text-align: center; + font-size: 20px; + padding: 0; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); + transition: background 0.3s, transform 0.3s; + animation: buttonGlow 3s infinite; /* Ajouter l'animation */ +} + +.chat-button:hover { + background: linear-gradient(45deg, #0099ff, #00ffff); + transform: translateY(-50%) scale(1.1); /* Agrandir légèrement au survol */ +} + +.chat-button:active { + transform: translateY(-50%) scale(0.95); /* Réduire légèrement à l'activation */ +} + +@keyframes buttonGlow { + 0% { + box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; + } + 50% { + box-shadow: 0 0 20px #0099ff, inset 0 0 10px #0099ff; + } + 100% { + box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; + } +} + +#room-tabs-container { + display: flex; + justify-content: space-between; + margin-top: 5px; +} + +.room-tab { + font-size: 14px; + padding: 5px 10px; + margin-right: 5px; + cursor: pointer; + border: 1px solid #00ffff; + background-color: #000033; + color: #00ffff; + border-radius: 5px; + box-sizing: border-box; + opacity: 0.1; + transition: background 0.3s, transform 0.3s; /* Ajouter des transitions */ + animation: tabGlow 3s infinite; /* Ajouter l'animation */ +} + +.room-tab:hover { + background-color: #00ffff; + color: #000033; + transform: scale(1.1); /* Agrandir légèrement au survol */ +} + +.room-tab:active { + transform: scale(0.95); /* Réduire légèrement à l'activation */ +} + +.room-tab.active { + background-color: #00ffff; + color: #000033; + opacity: 1; +} + +@keyframes tabGlow { + 0% { + box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; + } + 50% { + box-shadow: 0 0 20px #0099ff, inset 0 0 10px #0099ff; + } + 100% { + box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; + } +} + +#chat-controls { + position: fixed; + bottom: 10px; + left: 320px; /* Correspondre à la position à côté du conteneur de chat */ + display: flex; + flex-direction: column; + gap: 5px; /* Espacement entre les boutons */ +} + +#chat-controls button { + width: 100px; /* Correspondre à la taille des boutons */ + height: 30px; /* Correspondre à la taille des boutons */ + font-size: 12px; /* Correspondre à la taille de la police */ + padding: 5px; + border-radius: 5px; + cursor: pointer; + background-color: #00ffff; + color: #000033; + border: none; + transition: background-color 0.3s, transform 0.3s; + animation: buttonGlow 3s infinite; /* Ajouter l'animation */ +} + +#chat-controls button:hover { + background-color: #0099ff; + transform: scale(1.05); +} + +#chat-controls button:active { + transform: scale(0.95); +} + +@keyframes buttonGlow { + 0% { + box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; + } + 50% { + box-shadow: 0 0 20px #0099ff, inset 0 0 10px #0099ff; + } + 100% { + box-shadow: 0 0 10px #00ffff, inset 0 0 5px #00ffff; + } +} + +.player-stats-popup { + position: fixed; + bottom: 20px; + left: 320px; /* Adjust to appear above the chat */ + width: 300px; + background-color: rgba(0, 0, 40, 0.9); + color: #00ffff; + border-radius: 10px; + padding: 15px; + box-shadow: 0 0 20px #00ffff, inset 0 0 10px #00ffff; + z-index: 2000; + transition: transform 0.3s ease-out, opacity 0.3s ease-out; +} + +.player-stats-popup.show { + display: block; + transform: translateY(0); + opacity: 1; +} + +.player-stats-popup.hide { + transform: translateY(20px); + opacity: 0; +} + +#quit-room-btn, #show-chat-btn { + display: inline-block; + padding: 5px 10px; + margin: 5px; + background-color: #007bff; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + text-align: center; + font-size: 14px; +} + +#quit-room-btn:hover, #show-chat-btn:hover { + background-color: #0056b3; +} \ No newline at end of file diff --git a/pong/static/styles.css:Zone.Identifier b/pong/static/styles.css:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/pong/urls.py b/pong/urls.py new file mode 100644 index 0000000..dae9bf6 --- /dev/null +++ b/pong/urls.py @@ -0,0 +1,16 @@ +# /pong/urls.py + +from django.contrib import admin +from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static + +urlpatterns = [ + # Disable the admin page + # path('admin/', admin.site.urls), + # path('api/', include('pong.game.urls')), + path('', include('pong.game.urls')), +] + +if settings.DEBUG: + urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) \ No newline at end of file diff --git a/pong/urls.py:Zone.Identifier b/pong/urls.py:Zone.Identifier new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..15069d9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,8 @@ +django +psycopg2 +python-dotenv +channels +daphne +djangorestframework +web3 +python-json-logger==2.0.7 diff --git a/requirements.txt:Zone.Identifier b/requirements.txt:Zone.Identifier new file mode 100644 index 0000000..e69de29 From e57f0eebf09ad70cebcf0dace1770d822b8c31d8 Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Tue, 17 Sep 2024 12:25:08 +0200 Subject: [PATCH 07/11] modiffernand --- pong/__init__.py:Zone.Identifier | 0 pong/asgi.py:Zone.Identifier | 0 pong/game/__init__.py:Zone.Identifier | 0 pong/game/consumers.py | 33 +------------------ pong/game/consumers.py:Zone.Identifier | 0 pong/game/game.py:Zone.Identifier | 0 pong/game/matchmaking.py:Zone.Identifier | 0 .../0001_initial.py:Zone.Identifier | 0 ...0002_alter_match_winner.py:Zone.Identifier | 0 ...0003_alter_tournoi_date.py:Zone.Identifier | 0 .../migrations/__init__.py:Zone.Identifier | 0 pong/game/models.py:Zone.Identifier | 0 pong/game/routing.py:Zone.Identifier | 0 .../tournament_brackets.html:Zone.Identifier | 0 ...urnament_waiting_room.html:Zone.Identifier | 0 pong/game/tournament.py:Zone.Identifier | 0 pong/game/urls.py:Zone.Identifier | 0 pong/game/utils.py:Zone.Identifier | 0 pong/game/views.py:Zone.Identifier | 0 pong/settings.py:Zone.Identifier | 0 pong/static/burger.js:Zone.Identifier | 0 pong/static/flags/de.svg:Zone.Identifier | 0 pong/static/flags/es.svg:Zone.Identifier | 0 pong/static/flags/fr.svg:Zone.Identifier | 0 pong/static/flags/it.svg:Zone.Identifier | 0 pong/static/flags/us.svg:Zone.Identifier | 0 pong/static/game.js:Zone.Identifier | 0 pong/static/index.html:Zone.Identifier | 0 pong/static/language.js:Zone.Identifier | 0 .../logo-42-perpignan.png:Zone.Identifier | 0 pong/static/styles.css:Zone.Identifier | 0 pong/urls.py:Zone.Identifier | 0 32 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 pong/__init__.py:Zone.Identifier delete mode 100644 pong/asgi.py:Zone.Identifier delete mode 100644 pong/game/__init__.py:Zone.Identifier delete mode 100644 pong/game/consumers.py:Zone.Identifier delete mode 100644 pong/game/game.py:Zone.Identifier delete mode 100644 pong/game/matchmaking.py:Zone.Identifier delete mode 100644 pong/game/migrations/0001_initial.py:Zone.Identifier delete mode 100644 pong/game/migrations/0002_alter_match_winner.py:Zone.Identifier delete mode 100644 pong/game/migrations/0003_alter_tournoi_date.py:Zone.Identifier delete mode 100644 pong/game/migrations/__init__.py:Zone.Identifier delete mode 100644 pong/game/models.py:Zone.Identifier delete mode 100644 pong/game/routing.py:Zone.Identifier delete mode 100644 pong/game/templates/pong/tournament_brackets.html:Zone.Identifier delete mode 100644 pong/game/templates/pong/tournament_waiting_room.html:Zone.Identifier delete mode 100644 pong/game/tournament.py:Zone.Identifier delete mode 100644 pong/game/urls.py:Zone.Identifier delete mode 100644 pong/game/utils.py:Zone.Identifier delete mode 100644 pong/game/views.py:Zone.Identifier delete mode 100644 pong/settings.py:Zone.Identifier delete mode 100644 pong/static/burger.js:Zone.Identifier delete mode 100644 pong/static/flags/de.svg:Zone.Identifier delete mode 100644 pong/static/flags/es.svg:Zone.Identifier delete mode 100644 pong/static/flags/fr.svg:Zone.Identifier delete mode 100644 pong/static/flags/it.svg:Zone.Identifier delete mode 100644 pong/static/flags/us.svg:Zone.Identifier delete mode 100644 pong/static/game.js:Zone.Identifier delete mode 100644 pong/static/index.html:Zone.Identifier delete mode 100644 pong/static/language.js:Zone.Identifier delete mode 100644 pong/static/logo-42-perpignan.png:Zone.Identifier delete mode 100644 pong/static/styles.css:Zone.Identifier delete mode 100644 pong/urls.py:Zone.Identifier diff --git a/pong/__init__.py:Zone.Identifier b/pong/__init__.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/asgi.py:Zone.Identifier b/pong/asgi.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/__init__.py:Zone.Identifier b/pong/game/__init__.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/consumers.py b/pong/game/consumers.py index c5ee4ef..cae1a84 100644 --- a/pong/game/consumers.py +++ b/pong/game/consumers.py @@ -193,11 +193,7 @@ class ChatConsumer(AsyncWebsocketConsumer): elif message_type == 'invite_response': await self.handle_invite_response(data) - - elif message_type == 'get_player_stats': - logger.info(f"receive server get_player_stats{data}") - await self.handle_player_stats(data) - + else: 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) @@ -302,33 +298,6 @@ class ChatConsumer(AsyncWebsocketConsumer): 'response': response # Ajout de la réponse 'yes' ou 'no' } ) - - # Handle player stats by forwarding the request to the GameConsumer - async def handle_player_stats(self, data): - target_user = data.get('target_user') - logger.info(f"Demande de statistiques pour {target_user}") - - # Envoyer une requête au GameConsumer via Channel Layers - await self.channel_layer.send( - 'game_consumer_channel', # Nom du channel du GameConsumer - { - 'type': 'get_player_stats', - 'username': target_user, # Utilisateur cible - 'reply_channel': self.channel_name # Réponse à envoyer au ChatConsumer - } - ) - - # Méthode appelée pour recevoir les stats du GameConsumer - async def player_stats(self, event): - username = event['username'] - stats = event['stats'] - - # Envoyer les statistiques au client - await self.send(text_data=json.dumps({ - 'type': 'player_stats', - 'username': username, - 'stats': stats - })) async def authenticate(self, token, username): if not token: diff --git a/pong/game/consumers.py:Zone.Identifier b/pong/game/consumers.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/game.py:Zone.Identifier b/pong/game/game.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/matchmaking.py:Zone.Identifier b/pong/game/matchmaking.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 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/game/migrations/0003_alter_tournoi_date.py:Zone.Identifier b/pong/game/migrations/0003_alter_tournoi_date.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/migrations/__init__.py:Zone.Identifier b/pong/game/migrations/__init__.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/models.py:Zone.Identifier b/pong/game/models.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/routing.py:Zone.Identifier b/pong/game/routing.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/templates/pong/tournament_brackets.html:Zone.Identifier b/pong/game/templates/pong/tournament_brackets.html:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/templates/pong/tournament_waiting_room.html:Zone.Identifier b/pong/game/templates/pong/tournament_waiting_room.html:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/tournament.py:Zone.Identifier b/pong/game/tournament.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/urls.py:Zone.Identifier b/pong/game/urls.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/utils.py:Zone.Identifier b/pong/game/utils.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/game/views.py:Zone.Identifier b/pong/game/views.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/settings.py:Zone.Identifier b/pong/settings.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/burger.js:Zone.Identifier b/pong/static/burger.js:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/flags/de.svg:Zone.Identifier b/pong/static/flags/de.svg:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/flags/es.svg:Zone.Identifier b/pong/static/flags/es.svg:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/flags/fr.svg:Zone.Identifier b/pong/static/flags/fr.svg:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/flags/it.svg:Zone.Identifier b/pong/static/flags/it.svg:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/flags/us.svg:Zone.Identifier b/pong/static/flags/us.svg:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/game.js:Zone.Identifier b/pong/static/game.js:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/index.html:Zone.Identifier b/pong/static/index.html:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/language.js:Zone.Identifier b/pong/static/language.js:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/logo-42-perpignan.png:Zone.Identifier b/pong/static/logo-42-perpignan.png:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/static/styles.css:Zone.Identifier b/pong/static/styles.css:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/pong/urls.py:Zone.Identifier b/pong/urls.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 From 7de2664167e8506f4bec5d05ed2e7b80237e8bef Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Tue, 17 Sep 2024 12:28:48 +0200 Subject: [PATCH 08/11] fernandmodif2 --- .env:Zone.Identifier | 0 .gitignore:Zone.Identifier | 0 Dockerfile:Zone.Identifier | 0 config/logstash.conf:Zone.Identifier | 0 docker-compose.yml:Zone.Identifier | 0 env_template:Zone.Identifier | 0 logs/172.31.141.12-1726534356068.log:Zone.Identifier | 0 logs/172.31.141.12-1726534693901.log:Zone.Identifier | 0 logs/172.31.141.12-1726536620868.log:Zone.Identifier | 0 logs/172.31.141.12-1726538690438.log:Zone.Identifier | 0 logs/172.31.141.12-1726541943958.log:Zone.Identifier | 0 logs/172.31.141.12-1726542449903.log:Zone.Identifier | 0 logs/172.31.141.12-1726543072083.log:Zone.Identifier | 0 logs/172.31.141.12-1726543851799.log:Zone.Identifier | 0 logs/django.log:Zone.Identifier | 0 logs/django_errors.log:Zone.Identifier | 0 makefile:Zone.Identifier | 0 manage.py:Zone.Identifier | 0 requirements.txt:Zone.Identifier | 0 19 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .env:Zone.Identifier delete mode 100644 .gitignore:Zone.Identifier delete mode 100644 Dockerfile:Zone.Identifier delete mode 100644 config/logstash.conf:Zone.Identifier delete mode 100644 docker-compose.yml:Zone.Identifier delete mode 100644 env_template:Zone.Identifier delete mode 100644 logs/172.31.141.12-1726534356068.log:Zone.Identifier delete mode 100644 logs/172.31.141.12-1726534693901.log:Zone.Identifier delete mode 100644 logs/172.31.141.12-1726536620868.log:Zone.Identifier delete mode 100644 logs/172.31.141.12-1726538690438.log:Zone.Identifier delete mode 100644 logs/172.31.141.12-1726541943958.log:Zone.Identifier delete mode 100644 logs/172.31.141.12-1726542449903.log:Zone.Identifier delete mode 100644 logs/172.31.141.12-1726543072083.log:Zone.Identifier delete mode 100644 logs/172.31.141.12-1726543851799.log:Zone.Identifier delete mode 100644 logs/django.log:Zone.Identifier delete mode 100644 logs/django_errors.log:Zone.Identifier delete mode 100644 makefile:Zone.Identifier delete mode 100644 manage.py:Zone.Identifier delete mode 100644 requirements.txt:Zone.Identifier diff --git a/.env:Zone.Identifier b/.env:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/.gitignore:Zone.Identifier b/.gitignore:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/Dockerfile:Zone.Identifier b/Dockerfile:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/config/logstash.conf:Zone.Identifier b/config/logstash.conf:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/docker-compose.yml:Zone.Identifier b/docker-compose.yml:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/env_template:Zone.Identifier b/env_template:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/172.31.141.12-1726534356068.log:Zone.Identifier b/logs/172.31.141.12-1726534356068.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/172.31.141.12-1726534693901.log:Zone.Identifier b/logs/172.31.141.12-1726534693901.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/172.31.141.12-1726536620868.log:Zone.Identifier b/logs/172.31.141.12-1726536620868.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/172.31.141.12-1726538690438.log:Zone.Identifier b/logs/172.31.141.12-1726538690438.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/172.31.141.12-1726541943958.log:Zone.Identifier b/logs/172.31.141.12-1726541943958.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/172.31.141.12-1726542449903.log:Zone.Identifier b/logs/172.31.141.12-1726542449903.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/172.31.141.12-1726543072083.log:Zone.Identifier b/logs/172.31.141.12-1726543072083.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/172.31.141.12-1726543851799.log:Zone.Identifier b/logs/172.31.141.12-1726543851799.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/django.log:Zone.Identifier b/logs/django.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/logs/django_errors.log:Zone.Identifier b/logs/django_errors.log:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/makefile:Zone.Identifier b/makefile:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/manage.py:Zone.Identifier b/manage.py:Zone.Identifier deleted file mode 100644 index e69de29..0000000 diff --git a/requirements.txt:Zone.Identifier b/requirements.txt:Zone.Identifier deleted file mode 100644 index e69de29..0000000 From c78b3a43ace107926fbe3ee5b3e078fcac51908f Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Tue, 17 Sep 2024 13:46:05 +0200 Subject: [PATCH 09/11] trashfernand --- logs/django.log | 82 +++++++++++++++++++++++++++++++++++++++++++++ pong/static/game.js | 14 +++++++- 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/logs/django.log b/logs/django.log index 44e02ca..154fc8c 100644 --- a/logs/django.log +++ b/logs/django.log @@ -644,3 +644,85 @@ {"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "hhh d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-53"} {"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "Envoi d'un message de type chat_message de er dans la room tournament", "taskName": "Task-182"} {"asctime": "2024-09-17 03:32:58,992", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 17, "thread": 139625619098496, "message": "er d\u00e9connect\u00e9 de la room tournament", "taskName": "Task-182"} +{"asctime": "2024-09-17 10:37:26,092", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 27, "thread": 139716377381760, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 10:37:26,097", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 27, "thread": 139716377381760, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 10:37:26,098", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 27, "thread": 139716377381760, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 10:37:26,098", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 27, "thread": 139716377381760, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 10:37:26,098", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 27, "thread": 139716377381760, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 10:39:31,933", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:31,936", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'f', 'token': '78c64ead-8e6d-4442-aa6d-4079443f6042', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:31,936", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Authentification demand\u00e9e pour f", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:31,936", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Tentative d'authentification avec le token: 78c64ead-8e6d-4442-aa6d-4079443f6042 pour l'utilisateur: f", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:31,943", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Utilisateur f authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:31,943", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type authenticated de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:31,944", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:35,162", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'f', 'message': 'fedfedfedef', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:35,162", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message de chat envoy\u00e9 par f: fedfedfedef", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:35,162", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type chat_message de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:35,162", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: fedfedfedef", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:37,235", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'f', 'message': 'fdfdfdf', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:37,235", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message de chat envoy\u00e9 par f: fdfdfdf", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:37,235", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type chat_message de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:39:37,236", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: fdfdfdf", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:09,455", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:09,458", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'gh', 'token': '620ffae7-a30c-470e-817a-1ef63591694f', 'room': 'main_room'}", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:09,459", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Authentification demand\u00e9e pour gh", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:09,459", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Tentative d'authentification avec le token: 620ffae7-a30c-470e-817a-1ef63591694f pour l'utilisateur: gh", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:09,465", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Utilisateur gh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:09,466", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type authenticated de gh dans la room main_room", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:09,466", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de gh \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:09,466", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de gh \u00e0 la room main_room: Authentication successful", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:22,825", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:40:22,828", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'i', 'token': '264b4648-67e8-4555-a469-501b1bab855e', 'room': 'main_room'}", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:40:22,828", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Authentification demand\u00e9e pour i", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:40:22,828", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Tentative d'authentification avec le token: 264b4648-67e8-4555-a469-501b1bab855e pour l'utilisateur: i", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:40:22,835", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Utilisateur i authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:40:22,835", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type authenticated de i dans la room main_room", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:40:22,835", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de i \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:22,836", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de i \u00e0 la room main_room: Authentication successful", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:22,836", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de i \u00e0 la room main_room: Authentication successful", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:40:49,726", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'f', 'message': 'salut', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:49,726", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message de chat envoy\u00e9 par f: salut", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:49,726", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type chat_message de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:49,727", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: salut", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:49,727", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: salut", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:49,727", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: salut", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:40:53,669", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'f', 'message': 'hello', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:53,669", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message de chat envoy\u00e9 par f: hello", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:53,669", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type chat_message de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:53,670", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: hello", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:40:53,670", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: hello", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:40:53,670", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: hello", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:41:06,506", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'block_user', 'username': 'gh', 'target_user': 'i', 'room': 'main_room'}", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:41:06,506", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "gh tente de bloquer i", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:41:06,507", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "handle_block_user appel\u00e9 avec : {'type': 'block_user', 'username': 'gh', 'target_user': 'i', 'room': 'main_room'}", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:41:06,507", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "gh a bloqu\u00e9 i", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:41:12,783", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'f', 'message': 'feefef', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:12,784", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message de chat envoy\u00e9 par f: feefef", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:12,784", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type chat_message de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:12,784", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: feefef", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:12,784", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: feefef", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:41:12,784", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: feefef", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:41:22,532", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'i', 'message': 'salut fer', 'room': 'main_room'}", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:41:22,532", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message de chat envoy\u00e9 par i: salut fer", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:41:22,532", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type chat_message de i dans la room main_room", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:41:22,533", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de i \u00e0 la room main_room: salut fer", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:22,533", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de i \u00e0 la room main_room: salut fer", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:41:22,533", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de i \u00e0 la room main_room: salut fer", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:41:40,183", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'f', 'message': 'youhou', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:40,183", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message de chat envoy\u00e9 par f: youhou", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:40,183", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type chat_message de f dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:40,184", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: youhou", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:40,184", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: youhou", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:41:40,184", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de f \u00e0 la room main_room: youhou", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:41:49,218", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'f', 'target_user': 'i', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:49,218", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Erreur lors de la r\u00e9ception du message: 'ChatConsumer' object has no attribute 'handle_invite_user'", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:49,218", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:49,218", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:41:49,219", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-115"} +{"asctime": "2024-09-17 10:41:49,219", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-174"} +{"asctime": "2024-09-17 10:42:11,402", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'f', 'target_user': 'i', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:42:11,402", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Erreur lors de la r\u00e9ception du message: 'ChatConsumer' object has no attribute 'handle_invite_user'", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:42:11,402", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:42:11,402", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-53"} +{"asctime": "2024-09-17 10:42:11,403", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-115"} diff --git a/pong/static/game.js b/pong/static/game.js index b90dae0..247250f 100644 --- a/pong/static/game.js +++ b/pong/static/game.js @@ -601,7 +601,19 @@ document.addEventListener('DOMContentLoaded', () => { document.getElementById('game-text').textContent = gameState.game_text; } - + + const starsContainer = document.getElementById('stars'); + for (let i = 0; i < 500; i++) { + const star = document.createElement('div'); + star.className = 'star'; + star.style.width = `${Math.random() * 3}px`; + star.style.height = star.style.width; + star.style.left = `${Math.random() * 100}%`; + star.style.top = `${Math.random() * 100}%`; + star.style.animationDuration = `${Math.random() * 2 + 1}s`; + starsContainer.appendChild(star); + } + // Détection de la commande /s username function sendStatsCommand(targetUser) { console.log(`Detected stats command for user: ${targetUser}`); From 6392d247a56e82b11945b265a68030e227932473 Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Tue, 17 Sep 2024 15:37:26 +0200 Subject: [PATCH 10/11] thrashfer --- logs/django.log | 499 ++++++++++++++++++++++++++++++++++++++++ pong/game/consumers.py | 42 +++- pong/game/tournament.py | 2 +- pong/static/game.js | 41 ++++ pong/static/index.html | 16 -- pong/static/styles.css | 17 -- 6 files changed, 578 insertions(+), 39 deletions(-) diff --git a/logs/django.log b/logs/django.log index 154fc8c..0072578 100644 --- a/logs/django.log +++ b/logs/django.log @@ -726,3 +726,502 @@ {"asctime": "2024-09-17 10:42:11,402", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} {"asctime": "2024-09-17 10:42:11,402", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-53"} {"asctime": "2024-09-17 10:42:11,403", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 27, "thread": 139716377381760, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-115"} +{"asctime": "2024-09-17 11:55:24,682", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 25, "thread": 140398789532544, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 11:55:24,689", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 25, "thread": 140398789532544, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 11:55:24,689", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140398789532544, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 11:55:24,690", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140398789532544, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 11:55:24,690", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140398789532544, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 11:56:41,909", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:41,911", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'k', 'token': '2cd94301-2877-4f0f-91e0-66f2a6b5b49e', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:41,911", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Authentification demand\u00e9e pour k", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:41,911", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Tentative d'authentification avec le token: 2cd94301-2877-4f0f-91e0-66f2a6b5b49e pour l'utilisateur: k", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:41,919", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Utilisateur k authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:41,919", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Envoi d'un message de type authenticated de k dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:41,920", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Diffusion d'un message de k \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:44,660", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'k', 'message': 'jyjyj', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:44,660", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Message de chat envoy\u00e9 par k: jyjyj", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:44,660", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Envoi d'un message de type chat_message de k dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:44,660", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Diffusion d'un message de k \u00e0 la room main_room: jyjyj", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:51,016", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:51,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'j', 'token': 'e1feb4d7-45e5-4c4e-aace-05447b969c37', 'room': 'main_room'}", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:51,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Authentification demand\u00e9e pour j", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:51,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Tentative d'authentification avec le token: e1feb4d7-45e5-4c4e-aace-05447b969c37 pour l'utilisateur: j", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:51,027", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Utilisateur j authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:51,027", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Envoi d'un message de type authenticated de j dans la room main_room", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:51,027", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Diffusion d'un message de j \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:51,027", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Diffusion d'un message de j \u00e0 la room main_room: Authentication successful", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:53,279", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'j', 'message': 'juju', 'room': 'main_room'}", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:53,279", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Message de chat envoy\u00e9 par j: juju", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:53,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Envoi d'un message de type chat_message de j dans la room main_room", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:56:53,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Diffusion d'un message de j \u00e0 la room main_room: juju", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:56:53,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Diffusion d'un message de j \u00e0 la room main_room: juju", "taskName": "Task-113"} +{"asctime": "2024-09-17 11:57:06,977", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'k', 'target_user': 'j', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:57:06,978", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Erreur lors de la r\u00e9ception du message: 'ChatConsumer' object has no attribute 'handle_invite_user'", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:57:06,978", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:57:06,978", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-53"} +{"asctime": "2024-09-17 11:57:06,978", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140398789532544, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-113"} +{"asctime": "2024-09-17 12:04:06,316", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140138008816512, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:04:06,320", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140138008816512, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:04:06,320", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140138008816512, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:04:06,321", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140138008816512, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:04:06,321", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140138008816512, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:06:02,819", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139709893680000, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:06:02,824", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139709893680000, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:06:02,824", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139709893680000, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:06:02,824", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139709893680000, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:06:02,825", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139709893680000, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:06:44,125", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:44,129", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'uuu', 'token': 'd63d0ed2-20d7-4c5f-8793-18a5b38d2503', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:44,129", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Authentification demand\u00e9e pour uuu", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:44,129", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Tentative d'authentification avec le token: d63d0ed2-20d7-4c5f-8793-18a5b38d2503 pour l'utilisateur: uuu", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:44,139", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Utilisateur uuu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:44,139", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Envoi d'un message de type authenticated de uuu dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:44,139", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Diffusion d'un message de uuu \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:51,567", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:51,569", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'iii', 'token': '1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:51,569", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Authentification demand\u00e9e pour iii", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:51,569", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Tentative d'authentification avec le token: 1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326 pour l'utilisateur: iii", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:51,576", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Utilisateur iii authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:51,577", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Envoi d'un message de type authenticated de iii dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:51,577", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Diffusion d'un message de iii \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:51,577", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Diffusion d'un message de iii \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:53,654", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'iii', 'message': 'ytytyty', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:53,654", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Message de chat envoy\u00e9 par iii: ytytyty", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:53,655", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Envoi d'un message de type chat_message de iii dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:06:53,655", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Diffusion d'un message de iii \u00e0 la room main_room: ytytyty", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:06:53,655", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Diffusion d'un message de iii \u00e0 la room main_room: ytytyty", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:07:01,268", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'uuu', 'target_user': 'iii', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:07:01,268", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Invitation envoy\u00e9e de uuu \u00e0 iii dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:07:01,269", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:07:01,269", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Diffusion d'un message de server \u00e0 la room main_room: uuu a invit\u00e9 iii \u00e0 rejoindre une partie main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:07:01,269", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139709893680000, "message": "Diffusion d'un message de server \u00e0 la room main_room: uuu a invit\u00e9 iii \u00e0 rejoindre une partie main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:07:01,757", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 18, "thread": 139709893680000, "message": "Exception inside application: No handler for message type invite", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite", "taskName": null} +{"asctime": "2024-09-17 12:07:01,774", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 18, "thread": 139709893680000, "message": "Exception inside application: No handler for message type invite", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite", "taskName": null} +{"asctime": "2024-09-17 12:09:36,822", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139743151291264, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:09:36,825", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139743151291264, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:09:36,826", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139743151291264, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:09:36,826", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139743151291264, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:09:36,826", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139743151291264, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:10:27,333", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:27,336", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'iii', 'token': '1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:27,336", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Authentification demand\u00e9e pour iii", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:27,336", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Tentative d'authentification avec le token: 1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326 pour l'utilisateur: iii", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:27,345", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Utilisateur iii authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:27,345", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Envoi d'un message de type authenticated de iii dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:27,345", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Diffusion d'un message de iii \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:34,224", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:10:34,226", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ooo', 'token': 'd1e37420-0d1e-4972-80fd-25dc47616e88', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:10:34,226", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Authentification demand\u00e9e pour ooo", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:10:34,226", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Tentative d'authentification avec le token: d1e37420-0d1e-4972-80fd-25dc47616e88 pour l'utilisateur: ooo", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:10:34,235", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Utilisateur ooo authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:10:34,235", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Envoi d'un message de type authenticated de ooo dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:10:34,236", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Diffusion d'un message de ooo \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:34,236", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Diffusion d'un message de ooo \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:10:39,542", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'iii', 'target_user': 'o', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:39,543", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Invitation envoy\u00e9e de iii \u00e0 o dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:39,543", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:39,543", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Diffusion d'un message de server \u00e0 la room main_room: iii a invit\u00e9 o \u00e0 rejoindre une partie main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:39,543", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "Diffusion d'un message de server \u00e0 la room main_room: iii a invit\u00e9 o \u00e0 rejoindre une partie main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:10:39,543", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=iii, Room=main_room, Message=iii vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:10:39,544", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139743151291264, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=iii, Room=main_room, Message=iii vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:14:14,467", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140328238513024, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:14:14,471", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140328238513024, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:14:14,472", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140328238513024, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:14:14,472", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140328238513024, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:14:14,472", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140328238513024, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:16:13,528", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:13,531", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hhhh', 'token': 'a537abb7-e08f-450e-9224-96fe3d84a840', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:13,531", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Authentification demand\u00e9e pour hhhh", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:13,532", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Tentative d'authentification avec le token: a537abb7-e08f-450e-9224-96fe3d84a840 pour l'utilisateur: hhhh", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:13,540", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Utilisateur hhhh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:13,540", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Envoi d'un message de type authenticated de hhhh dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:13,540", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Diffusion d'un message de hhhh \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:19,580", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:16:19,582", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'yyy', 'token': 'b10f48f1-6166-4b33-85eb-9c83667b4c46', 'room': 'main_room'}", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:16:19,582", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Authentification demand\u00e9e pour yyy", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:16:19,582", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Tentative d'authentification avec le token: b10f48f1-6166-4b33-85eb-9c83667b4c46 pour l'utilisateur: yyy", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:16:19,590", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Utilisateur yyy authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:16:19,590", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Envoi d'un message de type authenticated de yyy dans la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:16:19,590", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Diffusion d'un message de yyy \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:19,590", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Diffusion d'un message de yyy \u00e0 la room main_room: Authentication successful", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:16:26,140", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'hhhh', 'target_user': 'yyy', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:26,140", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Erreur lors de la r\u00e9ception du message: 'inviter'", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:26,140", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:26,140", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:16:26,140", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140328238513024, "message": "Diffusion d'un message de server \u00e0 la room main_room: Internal server error", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:27:53,285", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 26, "thread": 140129929452416, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:27:53,290", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 26, "thread": 140129929452416, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:27:53,290", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 26, "thread": 140129929452416, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:27:53,291", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 26, "thread": 140129929452416, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:27:53,291", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 26, "thread": 140129929452416, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:29:41,396", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:41,399", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'juj', 'token': '46b17734-3212-414b-8101-5ea27b1e7d9c', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:41,399", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Authentification demand\u00e9e pour juj", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:41,399", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Tentative d'authentification avec le token: 46b17734-3212-414b-8101-5ea27b1e7d9c pour l'utilisateur: juj", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:41,409", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Utilisateur juj authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:41,409", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Envoi d'un message de type authenticated de juj dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:41,409", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Diffusion d'un message de juj \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:47,258", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:29:47,262", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'uuuu', 'token': '13160592-87a5-4a1a-bc5e-b20651c85c0e', 'room': 'main_room'}", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:29:47,263", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Authentification demand\u00e9e pour uuuu", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:29:47,263", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Tentative d'authentification avec le token: 13160592-87a5-4a1a-bc5e-b20651c85c0e pour l'utilisateur: uuuu", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:29:47,270", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Utilisateur uuuu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:29:47,270", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Envoi d'un message de type authenticated de uuuu dans la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:29:47,271", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Diffusion d'un message de uuuu \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:47,271", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Diffusion d'un message de uuuu \u00e0 la room main_room: Authentication successful", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:29:56,017", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Message re\u00e7u: {'type': 'invite', 'inviter': 'juj', 'target_user': 'uuuu', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:56,017", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Username manquant dans le message: {'type': 'invite', 'inviter': 'juj', 'target_user': 'uuuu', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:56,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:56,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Diffusion d'un message de server \u00e0 la room main_room: Username is missing", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:29:56,018", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140129929452416, "message": "Diffusion d'un message de server \u00e0 la room main_room: Username is missing", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:31:25,168", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 25, "thread": 140643526908800, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:31:25,174", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 25, "thread": 140643526908800, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:31:25,175", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140643526908800, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:31:25,175", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140643526908800, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:31:25,176", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140643526908800, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:32:15,750", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:15,753", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'iii', 'token': '1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:15,753", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Authentification demand\u00e9e pour iii", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:15,753", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Tentative d'authentification avec le token: 1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326 pour l'utilisateur: iii", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:15,762", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Utilisateur iii authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:15,762", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Envoi d'un message de type authenticated de iii dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:15,762", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Diffusion d'un message de iii \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:22,169", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:32:22,171", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'mmm', 'token': 'c4775767-2044-4ab9-8619-4d59336e8798', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:32:22,171", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Authentification demand\u00e9e pour mmm", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:32:22,171", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Tentative d'authentification avec le token: c4775767-2044-4ab9-8619-4d59336e8798 pour l'utilisateur: mmm", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:32:22,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Utilisateur mmm authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:32:22,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Envoi d'un message de type authenticated de mmm dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:32:22,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Diffusion d'un message de mmm \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:22,180", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Diffusion d'un message de mmm \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:32:29,036", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Message re\u00e7u: {'type': 'invite', 'inviter': 'iii', 'target_user': 'mmm', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:29,036", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Username manquant dans le message: {'type': 'invite', 'inviter': 'iii', 'target_user': 'mmm', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:29,036", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:29,037", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Diffusion d'un message de server \u00e0 la room main_room: Username is missing", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:32:29,037", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140643526908800, "message": "Diffusion d'un message de server \u00e0 la room main_room: Username is missing", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:39:38,551", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 25, "thread": 139967344884608, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:39:38,559", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 25, "thread": 139967344884608, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:39:38,560", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 139967344884608, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:39:38,560", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 139967344884608, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:39:38,561", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 139967344884608, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:40:16,472", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:16,475", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'iii', 'token': '1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:16,475", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Authentification demand\u00e9e pour iii", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:16,475", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Tentative d'authentification avec le token: 1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326 pour l'utilisateur: iii", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:16,484", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Utilisateur iii authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:16,485", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Envoi d'un message de type authenticated de iii dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:16,485", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Diffusion d'un message de iii \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:22,184", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:40:22,186", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ooo', 'token': 'd1e37420-0d1e-4972-80fd-25dc47616e88', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:40:22,187", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Authentification demand\u00e9e pour ooo", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:40:22,187", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Tentative d'authentification avec le token: d1e37420-0d1e-4972-80fd-25dc47616e88 pour l'utilisateur: ooo", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:40:22,194", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Utilisateur ooo authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:40:22,194", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Envoi d'un message de type authenticated de ooo dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:40:22,195", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Diffusion d'un message de ooo \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:22,195", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Diffusion d'un message de ooo \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:40:34,383", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Message re\u00e7u: {'type': 'invite', 'inviter': 'iii', 'target_user': 'ooo', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:34,383", "levelname": "ERROR", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Invitant manquant dans le message d'invitation", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:34,383", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Envoi d'un message de type error de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:34,384", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Diffusion d'un message de server \u00e0 la room main_room: Invitant manquant", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:40:34,384", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139967344884608, "message": "Diffusion d'un message de server \u00e0 la room main_room: Invitant manquant", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:03,973", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 26, "thread": 140320034872192, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:42:03,979", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 26, "thread": 140320034872192, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:42:03,980", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 26, "thread": 140320034872192, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:42:03,981", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 26, "thread": 140320034872192, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:42:03,981", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 26, "thread": 140320034872192, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:42:42,276", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:42,279", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'pp', 'token': '770d5448-2126-4e6d-8735-a87ebdec254c', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:42,279", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Authentification demand\u00e9e pour pp", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:42,279", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Tentative d'authentification avec le token: 770d5448-2126-4e6d-8735-a87ebdec254c pour l'utilisateur: pp", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:42,288", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Utilisateur pp authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:42,288", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Envoi d'un message de type authenticated de pp dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:42,288", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Diffusion d'un message de pp \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:50,352", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:50,354", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'lll', 'token': '6b67162b-2302-4da1-8b39-2d3c719e5a8f', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:50,354", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Authentification demand\u00e9e pour lll", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:50,354", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Tentative d'authentification avec le token: 6b67162b-2302-4da1-8b39-2d3c719e5a8f pour l'utilisateur: lll", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:50,361", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Utilisateur lll authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:50,361", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Envoi d'un message de type authenticated de lll dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:50,362", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Diffusion d'un message de lll \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:50,362", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Diffusion d'un message de lll \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:58,322", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Message re\u00e7u: {'type': 'invite', 'inviter': 'pp', 'target_user': 'lll', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:58,322", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Invitation envoy\u00e9e de pp \u00e0 lll dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:58,323", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:58,323", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Diffusion d'un message de server \u00e0 la room main_room: pp a invit\u00e9 lll \u00e0 rejoindre une partie main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:58,323", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Diffusion d'un message de server \u00e0 la room main_room: pp a invit\u00e9 lll \u00e0 rejoindre une partie main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:58,323", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=pp, Room=main_room, Message=pp vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:58,324", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=pp, Room=main_room, Message=pp vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:58,368", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'lll', 'response': 'no', 'inviter': 'pp', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:58,369", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "None a r\u00e9pondu 'no' \u00e0 l'invitation de pp", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:58,369", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:58,369", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Diffusion d'un message de server \u00e0 la room main_room: None a r\u00e9pondu no \u00e0 l'invitation.", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:42:58,369", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 26, "thread": 140320034872192, "message": "Diffusion d'un message de server \u00e0 la room main_room: None a r\u00e9pondu no \u00e0 l'invitation.", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:42:58,598", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 26, "thread": 140320034872192, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 12:42:58,603", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 26, "thread": 140320034872192, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 12:45:59,846", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 25, "thread": 140406961761152, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:45:59,850", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 25, "thread": 140406961761152, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:45:59,851", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140406961761152, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:45:59,851", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140406961761152, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:45:59,852", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 140406961761152, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:46:57,019", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:46:57,024", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'eee', 'token': '85b7d04b-c6a8-4456-97d0-1e8016404ca9', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:46:57,024", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Authentification demand\u00e9e pour eee", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:46:57,024", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Tentative d'authentification avec le token: 85b7d04b-c6a8-4456-97d0-1e8016404ca9 pour l'utilisateur: eee", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:46:57,035", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Utilisateur eee authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:46:57,035", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Envoi d'un message de type authenticated de eee dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:46:57,036", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Diffusion d'un message de eee \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:47:02,717", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:02,720", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ttt', 'token': 'f3c507d4-1013-4c80-a0dd-07fc4ae5e801', 'room': 'main_room'}", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:02,720", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Authentification demand\u00e9e pour ttt", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:02,720", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Tentative d'authentification avec le token: f3c507d4-1013-4c80-a0dd-07fc4ae5e801 pour l'utilisateur: ttt", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:02,729", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Utilisateur ttt authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:02,729", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Envoi d'un message de type authenticated de ttt dans la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:02,730", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Diffusion d'un message de ttt \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:47:02,730", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Diffusion d'un message de ttt \u00e0 la room main_room: Authentication successful", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:08,710", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'eee', 'target_user': 'ttt', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:47:08,710", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Invitation envoy\u00e9e de eee \u00e0 ttt dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:47:08,710", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:47:08,710", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Diffusion d'un message de server \u00e0 la room main_room: eee a invit\u00e9 ttt \u00e0 rejoindre une partie main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:47:08,721", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Diffusion d'un message de server \u00e0 la room main_room: eee a invit\u00e9 ttt \u00e0 rejoindre une partie main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:08,722", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=eee, Room=main_room, Message=eee vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:47:08,722", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=eee, Room=main_room, Message=eee vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:14,981", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'ttt', 'response': 'yes', 'inviter': 'eee', 'room': 'main_room'}", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:14,981", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "None a r\u00e9pondu 'yes' \u00e0 l'invitation de eee", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:14,982", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:14,982", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Diffusion d'un message de server \u00e0 la room main_room: None a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:47:14,982", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Diffusion d'un message de server \u00e0 la room main_room: None a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:47:14,990", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 25, "thread": 140406961761152, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 12:47:15,009", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 25, "thread": 140406961761152, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 12:47:16,988", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:47:16,990", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ttt', 'token': 'f3c507d4-1013-4c80-a0dd-07fc4ae5e801', 'room': 'quick_match'}", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:47:16,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Authentification demand\u00e9e pour ttt", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:47:16,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Tentative d'authentification avec le token: f3c507d4-1013-4c80-a0dd-07fc4ae5e801 pour l'utilisateur: ttt", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:47:16,999", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Utilisateur ttt authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:47:16,999", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Envoi d'un message de type authenticated de ttt dans la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:47:16,999", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 140406961761152, "message": "Diffusion d'un message de ttt \u00e0 la room quick_match: Authentication successful", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:52:43,425", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140208355797888, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:52:43,429", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140208355797888, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:52:43,430", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140208355797888, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:52:43,430", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140208355797888, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:52:43,431", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140208355797888, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:53:23,978", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:23,983", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'iiii', 'token': '2eda5ef2-d3df-4d24-8a94-eb93e5ab1295', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:23,983", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Authentification demand\u00e9e pour iiii", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:23,983", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Tentative d'authentification avec le token: 2eda5ef2-d3df-4d24-8a94-eb93e5ab1295 pour l'utilisateur: iiii", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:23,996", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Utilisateur iiii authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:23,997", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Envoi d'un message de type authenticated de iiii dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:23,997", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Diffusion d'un message de iiii \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:30,170", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:53:30,172", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'pppp', 'token': '9e5664e6-717b-4365-a011-cc3023595153', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:53:30,173", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Authentification demand\u00e9e pour pppp", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:53:30,173", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Tentative d'authentification avec le token: 9e5664e6-717b-4365-a011-cc3023595153 pour l'utilisateur: pppp", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:53:30,180", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Utilisateur pppp authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:53:30,180", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Envoi d'un message de type authenticated de pppp dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:53:30,180", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Diffusion d'un message de pppp \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:30,181", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Diffusion d'un message de pppp \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:53:38,781", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'iiii', 'target_user': 'pppp', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:38,781", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Invitation envoy\u00e9e de iiii \u00e0 pppp dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:38,781", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:38,782", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Diffusion d'un message de server \u00e0 la room main_room: iiii a invit\u00e9 pppp \u00e0 rejoindre une partie main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:53:38,782", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140208355797888, "message": "Diffusion d'un message de server \u00e0 la room main_room: iiii a invit\u00e9 pppp \u00e0 rejoindre une partie main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 12:53:39,753", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 18, "thread": 140208355797888, "message": "Exception inside application: No handler for message type invite", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite", "taskName": null} +{"asctime": "2024-09-17 12:53:39,757", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 18, "thread": 140208355797888, "message": "Exception inside application: No handler for message type invite", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite", "taskName": null} +{"asctime": "2024-09-17 12:55:53,635", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 25, "thread": 139909496044416, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 12:55:53,640", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 25, "thread": 139909496044416, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:55:53,640", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 139909496044416, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 12:55:53,641", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 139909496044416, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 12:55:53,641", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 25, "thread": 139909496044416, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 12:57:11,654", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:11,657", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ttt', 'token': 'f3c507d4-1013-4c80-a0dd-07fc4ae5e801', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:11,658", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Authentification demand\u00e9e pour ttt", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:11,658", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Tentative d'authentification avec le token: f3c507d4-1013-4c80-a0dd-07fc4ae5e801 pour l'utilisateur: ttt", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:11,666", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Utilisateur ttt authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:11,666", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Envoi d'un message de type authenticated de ttt dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:11,666", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Diffusion d'un message de ttt \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:17,374", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:17,375", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'rrrr', 'token': 'af059c7b-1911-4d92-9af1-405527001c85', 'room': 'main_room'}", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:17,376", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Authentification demand\u00e9e pour rrrr", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:17,376", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Tentative d'authentification avec le token: af059c7b-1911-4d92-9af1-405527001c85 pour l'utilisateur: rrrr", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:17,383", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Utilisateur rrrr authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:17,384", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Envoi d'un message de type authenticated de rrrr dans la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:17,384", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Diffusion d'un message de rrrr \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:17,384", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Diffusion d'un message de rrrr \u00e0 la room main_room: Authentication successful", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:26,931", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'ttt', 'target_user': 'rrrr', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:26,931", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Invitation envoy\u00e9e de ttt \u00e0 rrrr dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:26,932", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:26,932", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Diffusion d'un message de server \u00e0 la room main_room: ttt a invit\u00e9 rrrr \u00e0 rejoindre une partie main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:26,932", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Diffusion d'un message de server \u00e0 la room main_room: ttt a invit\u00e9 rrrr \u00e0 rejoindre une partie main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:26,932", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=ttt, Room=main_room, Message=ttt vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:26,933", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=ttt, Room=main_room, Message=ttt vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:30,136", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'rrrr', 'response': 'yes', 'inviter': 'ttt', 'room': 'main_room'}", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:30,136", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "None a r\u00e9pondu 'yes' \u00e0 l'invitation de ttt", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:30,136", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:30,136", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Diffusion d'un message de server \u00e0 la room main_room: None a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-53"} +{"asctime": "2024-09-17 12:57:30,136", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Diffusion d'un message de server \u00e0 la room main_room: None a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-71"} +{"asctime": "2024-09-17 12:57:31,027", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 25, "thread": 139909496044416, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 12:57:31,030", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 25, "thread": 139909496044416, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 12:57:32,145", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:57:32,148", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'rrrr', 'token': 'af059c7b-1911-4d92-9af1-405527001c85', 'room': 'quick_match'}", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:57:32,148", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Authentification demand\u00e9e pour rrrr", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:57:32,148", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Tentative d'authentification avec le token: af059c7b-1911-4d92-9af1-405527001c85 pour l'utilisateur: rrrr", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:57:32,156", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Utilisateur rrrr authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:57:32,157", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Envoi d'un message de type authenticated de rrrr dans la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 12:57:32,157", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 25, "thread": 139909496044416, "message": "Diffusion d'un message de rrrr \u00e0 la room quick_match: Authentication successful", "taskName": "Task-86"} +{"asctime": "2024-09-17 13:08:01,593", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139968256703360, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 13:08:01,597", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139968256703360, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 13:08:01,597", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139968256703360, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 13:08:01,598", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139968256703360, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 13:08:01,598", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139968256703360, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 13:08:46,281", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:46,286", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'uuu', 'token': 'd63d0ed2-20d7-4c5f-8793-18a5b38d2503', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:46,287", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour uuu", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:46,287", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: d63d0ed2-20d7-4c5f-8793-18a5b38d2503 pour l'utilisateur: uuu", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:46,296", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur uuu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:46,296", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de uuu dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:46,296", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de uuu \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:51,250", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:08:51,252", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'iiii', 'token': '2eda5ef2-d3df-4d24-8a94-eb93e5ab1295', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:08:51,252", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour iiii", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:08:51,253", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: 2eda5ef2-d3df-4d24-8a94-eb93e5ab1295 pour l'utilisateur: iiii", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:08:51,260", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur iiii authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:08:51,260", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de iiii dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:08:51,260", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de iiii \u00e0 la room main_room: Authentication successful", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:51,261", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de iiii \u00e0 la room main_room: Authentication successful", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:08:59,916", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'uuu', 'target_user': 'iiii', 'room': 'main_room'}", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:59,916", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Invitation envoy\u00e9e de uuu \u00e0 iiii dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:59,916", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:59,917", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de server \u00e0 la room main_room: uuu a invit\u00e9 iiii \u00e0 rejoindre une partie main_room", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:59,917", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de server \u00e0 la room main_room: uuu a invit\u00e9 iiii \u00e0 rejoindre une partie main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:08:59,917", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=uuu, Room=main_room, Message=uuu vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:08:59,917", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=uuu, Room=main_room, Message=uuu vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:09:06,046", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'iiii', 'response': 'yes', 'inviter': 'uuu', 'room': 'main_room'}", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:09:06,047", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "iiii a r\u00e9pondu 'yes' \u00e0 l'invitation de uuu", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:09:06,047", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:09:06,047", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de server \u00e0 la room main_room: iiii a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-53"} +{"asctime": "2024-09-17 13:09:06,047", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de server \u00e0 la room main_room: iiii a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-111"} +{"asctime": "2024-09-17 13:09:06,148", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 18, "thread": 139968256703360, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 13:09:06,151", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 18, "thread": 139968256703360, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 13:09:08,054", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:09:08,056", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'iiii', 'token': '2eda5ef2-d3df-4d24-8a94-eb93e5ab1295', 'room': 'quick_match'}", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:09:08,057", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour iiii", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:09:08,057", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: 2eda5ef2-d3df-4d24-8a94-eb93e5ab1295 pour l'utilisateur: iiii", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:09:08,064", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur iiii authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:09:08,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de iiii dans la room quick_match", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:09:08,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de iiii \u00e0 la room quick_match: Authentication successful", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:13:22,159", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de iiii dans la room quick_match", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:13:22,160", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "iiii d\u00e9connect\u00e9 de la room quick_match", "taskName": "Task-126"} +{"asctime": "2024-09-17 13:13:27,573", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:27,576", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'iii', 'token': '1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326', 'room': 'main_room'}", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:27,576", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour iii", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:27,576", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: 1bc84fd5-c8fe-4ea7-b0ca-f6c423cf9326 pour l'utilisateur: iii", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:27,585", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur iii authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:27,585", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de iii dans la room main_room", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:27,585", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de iii \u00e0 la room main_room: Authentication successful", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:34,477", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:34,479", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'lllol', 'token': '8c732487-1992-4801-aa17-61c7be3ce3ae', 'room': 'main_room'}", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:34,479", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour lllol", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:34,480", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: 8c732487-1992-4801-aa17-61c7be3ce3ae pour l'utilisateur: lllol", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:34,487", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur lllol authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:34,487", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de lllol dans la room main_room", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:34,487", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de lllol \u00e0 la room main_room: Authentication successful", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:34,487", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de lllol \u00e0 la room main_room: Authentication successful", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:46,695", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'iii', 'target_user': 'lllol', 'room': 'main_room'}", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:46,695", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Invitation envoy\u00e9e de iii \u00e0 lllol dans la room main_room", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:46,696", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:46,696", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de server \u00e0 la room main_room: iii a invit\u00e9 lllol \u00e0 rejoindre une partie main_room", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:46,696", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de server \u00e0 la room main_room: iii a invit\u00e9 lllol \u00e0 rejoindre une partie main_room", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:46,697", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=iii, Room=main_room, Message=iii vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:46,697", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=iii, Room=main_room, Message=iii vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:52,955", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'lllol', 'response': 'yes', 'inviter': 'iii', 'room': 'main_room'}", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:52,956", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "lllol a r\u00e9pondu 'yes' \u00e0 l'invitation de iii", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:52,956", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:52,956", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de server \u00e0 la room main_room: lllol a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-192"} +{"asctime": "2024-09-17 13:13:52,956", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de server \u00e0 la room main_room: lllol a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-210"} +{"asctime": "2024-09-17 13:13:53,418", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 18, "thread": 139968256703360, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 13:13:53,420", "levelname": "ERROR", "name": "daphne.server", "module": "server", "process": 18, "thread": 139968256703360, "message": "Exception inside application: No handler for message type invite_response", "exc_info": "Traceback (most recent call last):\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 62, in __call__\n return await application(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 47, in __call__\n return await self.inner(dict(scope, cookies=cookies), receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/sessions.py\", line 263, in __call__\n return await self.inner(wrapper.scope, receive, wrapper.send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/auth.py\", line 185, in __call__\n return await super().__call__(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/middleware.py\", line 24, in __call__\n return await self.inner(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/routing.py\", line 132, in __call__\n return await application(\n ^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 94, in app\n return await consumer(scope, receive, send)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 58, in __call__\n await await_many_dispatch(\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/utils.py\", line 50, in await_many_dispatch\n await dispatch(result)\n File \"/transcendence/venv/lib/python3.12/site-packages/channels/consumer.py\", line 75, in dispatch\n raise ValueError(\"No handler for message type %s\" % message[\"type\"])\nValueError: No handler for message type invite_response", "taskName": null} +{"asctime": "2024-09-17 13:13:54,961", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:13:54,964", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'lllol', 'token': '8c732487-1992-4801-aa17-61c7be3ce3ae', 'room': 'quick_match'}", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:13:54,964", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour lllol", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:13:54,964", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: 8c732487-1992-4801-aa17-61c7be3ce3ae pour l'utilisateur: lllol", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:13:54,972", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur lllol authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:13:54,972", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de lllol dans la room quick_match", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:13:54,972", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de lllol \u00e0 la room quick_match: Authentication successful", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:18:47,807", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:18:47,810", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'uu', 'token': '3f1e490b-8c54-48be-a54d-3ede4850275b', 'room': 'main_room'}", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:18:47,810", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour uu", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:18:47,810", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: 3f1e490b-8c54-48be-a54d-3ede4850275b pour l'utilisateur: uu", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:18:47,818", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur uu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:18:47,819", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de uu dans la room main_room", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:18:47,819", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de uu \u00e0 la room main_room: Authentication successful", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:18:49,353", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:18:49,357", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'uu', 'token': '3f1e490b-8c54-48be-a54d-3ede4850275b', 'room': 'quick_match'}", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:18:49,357", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour uu", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:18:49,357", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: 3f1e490b-8c54-48be-a54d-3ede4850275b pour l'utilisateur: uu", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:18:49,365", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur uu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:18:49,365", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de uu dans la room quick_match", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:18:49,366", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de uu \u00e0 la room quick_match: Authentication successful", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:18:49,366", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de uu \u00e0 la room quick_match: Authentication successful", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:19:04,187", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de uu dans la room quick_match", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:19:04,188", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "uu d\u00e9connect\u00e9 de la room quick_match", "taskName": "Task-297"} +{"asctime": "2024-09-17 13:19:04,188", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de uu dans la room main_room", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:19:04,188", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "uu d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-291"} +{"asctime": "2024-09-17 13:19:04,188", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de uu \u00e0 la room quick_match: uu a quitt\u00e9 le chat", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:19:07,718", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:07,720", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'jj', 'token': 'c6e290f3-5944-42b1-8482-7d062ca74a7d', 'room': 'main_room'}", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:07,720", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour jj", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:07,720", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: c6e290f3-5944-42b1-8482-7d062ca74a7d pour l'utilisateur: jj", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:07,728", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur jj authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:07,729", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de jj dans la room main_room", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:07,729", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de jj \u00e0 la room main_room: Authentication successful", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:09,285", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:09,288", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'jj', 'token': 'c6e290f3-5944-42b1-8482-7d062ca74a7d', 'room': 'quick_match'}", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:09,288", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour jj", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:09,288", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: c6e290f3-5944-42b1-8482-7d062ca74a7d pour l'utilisateur: jj", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:09,296", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur jj authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:09,297", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de jj dans la room quick_match", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:09,297", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de jj \u00e0 la room quick_match: Authentication successful", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:19:09,298", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de jj \u00e0 la room quick_match: Authentication successful", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:13,049", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'lllol', 'message': 'juju', 'room': 'quick_match'}", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:19:13,049", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message de chat envoy\u00e9 par lllol: juju", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:19:13,049", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de lllol dans la room quick_match", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:19:13,049", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de lllol \u00e0 la room quick_match: juju", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:19:13,050", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de lllol \u00e0 la room quick_match: juju", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:17,446", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de lllol dans la room quick_match", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:19:17,446", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "lllol d\u00e9connect\u00e9 de la room quick_match", "taskName": "Task-225"} +{"asctime": "2024-09-17 13:19:17,447", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de lllol \u00e0 la room quick_match: lllol a quitt\u00e9 le chat", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:21,054", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:21,055", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'uuu', 'token': 'd63d0ed2-20d7-4c5f-8793-18a5b38d2503', 'room': 'main_room'}", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:21,056", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour uuu", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:21,056", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: d63d0ed2-20d7-4c5f-8793-18a5b38d2503 pour l'utilisateur: uuu", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:21,064", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur uuu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:21,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de uuu dans la room main_room", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:21,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de uuu \u00e0 la room main_room: Authentication successful", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:21,065", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de uuu \u00e0 la room main_room: Authentication successful", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:28,735", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de jj dans la room main_room", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:28,735", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "jj d\u00e9connect\u00e9 de la room main_room", "taskName": "Task-323"} +{"asctime": "2024-09-17 13:19:28,735", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type chat_message de jj dans la room quick_match", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:28,736", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "jj d\u00e9connect\u00e9 de la room quick_match", "taskName": "Task-329"} +{"asctime": "2024-09-17 13:19:28,736", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de jj \u00e0 la room main_room: jj a quitt\u00e9 le chat", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:32,346", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-380"} +{"asctime": "2024-09-17 13:19:32,348", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'kk', 'token': 'f5ca401c-b6c7-479e-acbb-126c8458347f', 'room': 'main_room'}", "taskName": "Task-380"} +{"asctime": "2024-09-17 13:19:32,348", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour kk", "taskName": "Task-380"} +{"asctime": "2024-09-17 13:19:32,348", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: f5ca401c-b6c7-479e-acbb-126c8458347f pour l'utilisateur: kk", "taskName": "Task-380"} +{"asctime": "2024-09-17 13:19:32,356", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur kk authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-380"} +{"asctime": "2024-09-17 13:19:32,356", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de kk dans la room main_room", "taskName": "Task-380"} +{"asctime": "2024-09-17 13:19:32,356", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de kk \u00e0 la room main_room: Authentication successful", "taskName": "Task-360"} +{"asctime": "2024-09-17 13:19:32,357", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de kk \u00e0 la room main_room: Authentication successful", "taskName": "Task-380"} +{"asctime": "2024-09-17 13:19:36,928", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-387"} +{"asctime": "2024-09-17 13:19:36,931", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'uuu', 'token': 'd63d0ed2-20d7-4c5f-8793-18a5b38d2503', 'room': 'quick_match'}", "taskName": "Task-387"} +{"asctime": "2024-09-17 13:19:36,931", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour uuu", "taskName": "Task-387"} +{"asctime": "2024-09-17 13:19:36,931", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: d63d0ed2-20d7-4c5f-8793-18a5b38d2503 pour l'utilisateur: uuu", "taskName": "Task-387"} +{"asctime": "2024-09-17 13:19:36,941", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur uuu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-387"} +{"asctime": "2024-09-17 13:19:36,941", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de uuu dans la room quick_match", "taskName": "Task-387"} +{"asctime": "2024-09-17 13:19:36,941", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de uuu \u00e0 la room quick_match: Authentication successful", "taskName": "Task-387"} +{"asctime": "2024-09-17 13:19:38,168", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-399"} +{"asctime": "2024-09-17 13:19:38,170", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'kk', 'token': 'f5ca401c-b6c7-479e-acbb-126c8458347f', 'room': 'quick_match'}", "taskName": "Task-399"} +{"asctime": "2024-09-17 13:19:38,170", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Authentification demand\u00e9e pour kk", "taskName": "Task-399"} +{"asctime": "2024-09-17 13:19:38,171", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Tentative d'authentification avec le token: f5ca401c-b6c7-479e-acbb-126c8458347f pour l'utilisateur: kk", "taskName": "Task-399"} +{"asctime": "2024-09-17 13:19:38,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Utilisateur kk authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-399"} +{"asctime": "2024-09-17 13:19:38,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de kk dans la room quick_match", "taskName": "Task-399"} +{"asctime": "2024-09-17 13:19:38,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de kk \u00e0 la room quick_match: Authentication successful", "taskName": "Task-387"} +{"asctime": "2024-09-17 13:19:38,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de kk \u00e0 la room quick_match: Authentication successful", "taskName": "Task-399"} diff --git a/pong/game/consumers.py b/pong/game/consumers.py index cae1a84..d016737 100644 --- a/pong/game/consumers.py +++ b/pong/game/consumers.py @@ -169,11 +169,6 @@ class ChatConsumer(AsyncWebsocketConsumer): logger.info(f"Message reçu: {data}") - if not username: - 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 différents types de messages if message_type == 'authenticate': logger.info(f"Authentification demandée pour {username}") @@ -259,6 +254,43 @@ class ChatConsumer(AsyncWebsocketConsumer): 'type': 'block_user', 'message': f'Vous avez bloqué les messages de {target_user}' })) + + async def handle_invite_user(self, data): + # Récupération des informations de l'invitation + inviter = data.get('username') + target_user = data.get('target_user') + room = data.get('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 + + 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 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', + 'inviter': inviter, + 'target_user': target_user, + 'room': room, + 'message': f'{inviter} vous a invité à rejoindre la room {room}.' + } + ) # Méthode appelée pour envoyer l'invitation à l'utilisateur invité (target_user) async def invite(self, event): diff --git a/pong/game/tournament.py b/pong/game/tournament.py index 9108046..1e4237d 100644 --- a/pong/game/tournament.py +++ b/pong/game/tournament.py @@ -185,7 +185,7 @@ class TournamentMatchMaker: asyncio.create_task(match.start_game()) elif match.player1: # Gestion du BYE - match_message = f"Prochain match: {match.player1.user.username} contre Bot" + message = f"Prochain match: {match.player1.user.username} contre Bot" await self.send_to_player(match.player1, {'type': 'tournament_match', 'message': message}) await match_maker.notify_players(match.player1, match.player2, match.game_id, False) match.game_state['player1_score'] = 3 diff --git a/pong/static/game.js b/pong/static/game.js index 247250f..77e1bd6 100644 --- a/pong/static/game.js +++ b/pong/static/game.js @@ -614,6 +614,47 @@ document.addEventListener('DOMContentLoaded', () => { starsContainer.appendChild(star); } + const homeButton = document.getElementById('home'); + const replayButton = document.getElementById('retry'); + const gameControls = document.getElementById('game-controls'); + + homeButton.addEventListener('click', () => { + gameContainer.style.display = 'none'; + gameControls.style.display = 'none'; + + logo.style.display = 'block' + + formBlock.style.display = 'block'; + postFormButtons.style.display = 'flex'; + + setupFirstPlayer(); + }); + + function setupFirstPlayer() { + const firstPlayerName = window.firstPlayerName; + document.getElementById('player1-name').textContent = firstPlayerName; + } + + replayButton.addEventListener('click', () => { + document.getElementById('player1-name').textContent = saveData.player1_name; + document.getElementById('player2-name').textContent = saveData.player2_name; + startLocalGame2(); + }); + + function checkForWinner() { + if (gameState.player1_score === 3 || gameState.player2_score === 3) { + if (saveData.type != "tournoi"){ + gameControls.style.display = 'flex'; + homeButton.style.display = 'block'; + replayButton.style.display = 'none'; + console.log(saveData.type); + if (saveData.type === 'local'){ + replayButton.style.display = 'block'; + } + } + } + } + // Détection de la commande /s username function sendStatsCommand(targetUser) { console.log(`Detected stats command for user: ${targetUser}`); diff --git a/pong/static/index.html b/pong/static/index.html index 6203e94..e845c13 100644 --- a/pong/static/index.html +++ b/pong/static/index.html @@ -216,8 +216,6 @@
- -
@@ -320,20 +318,6 @@ }); }); - - \ No newline at end of file diff --git a/pong/static/styles.css b/pong/static/styles.css index c17813c..d7ef894 100644 --- a/pong/static/styles.css +++ b/pong/static/styles.css @@ -702,20 +702,3 @@ canvas { transform: translateY(20px); opacity: 0; } - -#quit-room-btn, #show-chat-btn { - display: inline-block; - padding: 5px 10px; - margin: 5px; - background-color: #007bff; - color: white; - border: none; - border-radius: 5px; - cursor: pointer; - text-align: center; - font-size: 14px; -} - -#quit-room-btn:hover, #show-chat-btn:hover { - background-color: #0056b3; -} \ No newline at end of file From f016e5eae877d083568d091466fb55ddb463435d Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Tue, 17 Sep 2024 19:32:25 +0200 Subject: [PATCH 11/11] versionfernandfonctionnelavantpull --- logs/django.log | 599 +++++++++++++++++++++++++++++++++++++++++ pong/game/consumers.py | 56 +++- pong/static/burger.js | 3 +- pong/static/game.js | 168 ++++++------ 4 files changed, 732 insertions(+), 94 deletions(-) diff --git a/logs/django.log b/logs/django.log index 0072578..b92ebca 100644 --- a/logs/django.log +++ b/logs/django.log @@ -1225,3 +1225,602 @@ {"asctime": "2024-09-17 13:19:38,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Envoi d'un message de type authenticated de kk dans la room quick_match", "taskName": "Task-399"} {"asctime": "2024-09-17 13:19:38,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de kk \u00e0 la room quick_match: Authentication successful", "taskName": "Task-387"} {"asctime": "2024-09-17 13:19:38,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139968256703360, "message": "Diffusion d'un message de kk \u00e0 la room quick_match: Authentication successful", "taskName": "Task-399"} +{"asctime": "2024-09-17 16:23:35,007", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140289265064832, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 16:23:35,010", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140289265064832, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:23:35,010", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140289265064832, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 16:23:35,010", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140289265064832, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:23:35,011", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140289265064832, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 16:38:08,691", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140213396159360, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 16:38:08,695", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140213396159360, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:38:08,695", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140213396159360, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 16:38:08,696", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140213396159360, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:38:08,696", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140213396159360, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 16:39:05,801", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:05,803", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'fer', 'token': 'ba90567a-e6c5-48ca-9c0c-ab430370eda4', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:05,803", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Authentification demand\u00e9e pour fer", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:05,803", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Tentative d'authentification avec le token: ba90567a-e6c5-48ca-9c0c-ab430370eda4 pour l'utilisateur: fer", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:05,809", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Utilisateur fer authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:05,809", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type authenticated de fer dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:05,809", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de fer \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:12,272", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:12,274", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ffff', 'token': 'b64836aa-9909-4bc1-b501-d9be64f2c21b', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:12,274", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Authentification demand\u00e9e pour ffff", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:12,274", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Tentative d'authentification avec le token: b64836aa-9909-4bc1-b501-d9be64f2c21b pour l'utilisateur: ffff", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:12,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Utilisateur ffff authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:12,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type authenticated de ffff dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:12,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de ffff \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:12,280", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de ffff \u00e0 la room main_room: Authentication successful", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:22,581", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'fer', 'target_user': 'ffff', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:22,581", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Invitation envoy\u00e9e de fer \u00e0 ffff dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:22,581", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:22,581", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room main_room: fer a invit\u00e9 ffff \u00e0 rejoindre une partie main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:22,582", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room main_room: fer a invit\u00e9 ffff \u00e0 rejoindre une partie main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:22,582", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=fer, Room=main_room, Message=fer vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:22,582", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=fer, Room=main_room, Message=fer vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:26,308", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'ffff', 'response': 'yes', 'inviter': 'fer', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:26,308", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "ffff a r\u00e9pondu 'yes' \u00e0 l'invitation de fer", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:26,308", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:26,308", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room main_room: ffff a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:26,309", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room main_room: ffff a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:26,309", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=ffff a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=fer", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:39:26,309", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=ffff a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=fer", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:39:26,356", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:39:26,358", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'fer', 'token': 'ba90567a-e6c5-48ca-9c0c-ab430370eda4', 'room': 'quick_match'}", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:39:26,358", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Authentification demand\u00e9e pour fer", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:39:26,358", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Tentative d'authentification avec le token: ba90567a-e6c5-48ca-9c0c-ab430370eda4 pour l'utilisateur: fer", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:39:26,364", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Utilisateur fer authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:39:26,364", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type authenticated de fer dans la room quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:39:26,364", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de fer \u00e0 la room quick_match: Authentication successful", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:39:28,314", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:39:28,315", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ffff', 'token': 'b64836aa-9909-4bc1-b501-d9be64f2c21b', 'room': 'quick_match'}", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:39:28,315", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Authentification demand\u00e9e pour ffff", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:39:28,315", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Tentative d'authentification avec le token: b64836aa-9909-4bc1-b501-d9be64f2c21b pour l'utilisateur: ffff", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:39:28,322", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Utilisateur ffff authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:39:28,322", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type authenticated de ffff dans la room quick_match", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:39:28,322", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de ffff \u00e0 la room quick_match: Authentication successful", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:39:28,322", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de ffff \u00e0 la room quick_match: Authentication successful", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:40:07,893", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'ffff', 'target_user': 'fer', 'room': 'quick_match'}", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:40:07,893", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Invitation envoy\u00e9e de ffff \u00e0 fer dans la room quick_match", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:40:07,893", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type chat_message de server dans la room quick_match", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:40:07,893", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room quick_match: ffff a invit\u00e9 fer \u00e0 rejoindre une partie quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:40:07,893", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room quick_match: ffff a invit\u00e9 fer \u00e0 rejoindre une partie quick_match", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:40:07,894", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=ffff, Room=quick_match, Message=ffff vous a invit\u00e9 \u00e0 rejoindre la room quick_match.", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:40:07,894", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=ffff, Room=quick_match, Message=ffff vous a invit\u00e9 \u00e0 rejoindre la room quick_match.", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:40:14,275", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'fer', 'response': 'yes', 'inviter': 'ffff', 'room': 'quick_match'}", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:40:14,275", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "fer a r\u00e9pondu 'yes' \u00e0 l'invitation de ffff", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:40:14,275", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type chat_message de server dans la room quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:40:14,275", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room quick_match: fer a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:40:14,276", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room quick_match: fer a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:40:14,276", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=fer a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=ffff", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:40:14,276", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=fer a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=ffff", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:42:11,091", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'ffff', 'target_user': 'fer', 'room': 'quick_match'}", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:42:11,092", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Invitation envoy\u00e9e de ffff \u00e0 fer dans la room quick_match", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:42:11,092", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type chat_message de server dans la room quick_match", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:42:11,092", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room quick_match: ffff a invit\u00e9 fer \u00e0 rejoindre une partie quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:42:11,092", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room quick_match: ffff a invit\u00e9 fer \u00e0 rejoindre une partie quick_match", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:42:11,092", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=ffff, Room=quick_match, Message=ffff vous a invit\u00e9 \u00e0 rejoindre la room quick_match.", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:42:11,092", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=ffff, Room=quick_match, Message=ffff vous a invit\u00e9 \u00e0 rejoindre la room quick_match.", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:42:13,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'fer', 'response': 'yes', 'inviter': 'ffff', 'room': 'quick_match'}", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:42:13,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "fer a r\u00e9pondu 'yes' \u00e0 l'invitation de ffff", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:42:13,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Envoi d'un message de type chat_message de server dans la room quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:42:13,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room quick_match: fer a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:42:13,715", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "Diffusion d'un message de server \u00e0 la room quick_match: fer a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:42:13,716", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=fer a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=ffff", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:42:13,716", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140213396159360, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=fer a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=ffff", "taskName": "Task-88"} +{"asctime": "2024-09-17 16:46:17,860", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140402200488832, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 16:46:17,863", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140402200488832, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:46:17,863", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140402200488832, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 16:46:17,864", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140402200488832, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:46:17,864", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140402200488832, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 16:47:43,066", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:43,068", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'jyjy', 'token': '617f0227-5964-4965-8258-68a5bee70993', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:43,068", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Authentification demand\u00e9e pour jyjy", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:43,068", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Tentative d'authentification avec le token: 617f0227-5964-4965-8258-68a5bee70993 pour l'utilisateur: jyjy", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:43,075", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Utilisateur jyjy authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:43,075", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Envoi d'un message de type authenticated de jyjy dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:43,075", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de jyjy \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:49,171", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:47:49,173", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'rrrr', 'token': 'e8036fd5-9934-4b77-94ad-a461ec535fdc', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:47:49,173", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Authentification demand\u00e9e pour rrrr", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:47:49,173", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Tentative d'authentification avec le token: e8036fd5-9934-4b77-94ad-a461ec535fdc pour l'utilisateur: rrrr", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:47:49,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Utilisateur rrrr authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:47:49,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Envoi d'un message de type authenticated de rrrr dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:47:49,179", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de rrrr \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:49,180", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de rrrr \u00e0 la room main_room: Authentication successful", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:47:57,734", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'jyjy', 'target_user': 'rrrr', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:57,734", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Invitation envoy\u00e9e de jyjy \u00e0 rrrr dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:57,734", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:57,735", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de server \u00e0 la room main_room: jyjy a invit\u00e9 rrrr \u00e0 rejoindre une partie main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:57,735", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de server \u00e0 la room main_room: jyjy a invit\u00e9 rrrr \u00e0 rejoindre une partie main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:47:57,735", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=jyjy, Room=main_room, Message=jyjy vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:47:57,735", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=jyjy, Room=main_room, Message=jyjy vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:48:00,365", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'rrrr', 'response': 'yes', 'inviter': 'jyjy', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:48:00,365", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "rrrr a r\u00e9pondu 'yes' \u00e0 l'invitation de jyjy", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:48:00,365", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:48:00,366", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de server \u00e0 la room main_room: rrrr a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:48:00,366", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de server \u00e0 la room main_room: rrrr a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:48:00,366", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=rrrr a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=jyjy", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:48:00,366", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=rrrr a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=jyjy", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:48:00,411", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:48:00,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'jyjy', 'token': '617f0227-5964-4965-8258-68a5bee70993', 'room': 'quick_match'}", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:48:00,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Authentification demand\u00e9e pour jyjy", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:48:00,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Tentative d'authentification avec le token: 617f0227-5964-4965-8258-68a5bee70993 pour l'utilisateur: jyjy", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:48:00,417", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Utilisateur jyjy authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:48:00,418", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Envoi d'un message de type authenticated de jyjy dans la room quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:48:00,418", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de jyjy \u00e0 la room quick_match: Authentication successful", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:48:02,375", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-82"} +{"asctime": "2024-09-17 16:48:02,376", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'rrrr', 'token': 'e8036fd5-9934-4b77-94ad-a461ec535fdc', 'room': 'quick_match'}", "taskName": "Task-82"} +{"asctime": "2024-09-17 16:48:02,376", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Authentification demand\u00e9e pour rrrr", "taskName": "Task-82"} +{"asctime": "2024-09-17 16:48:02,377", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Tentative d'authentification avec le token: e8036fd5-9934-4b77-94ad-a461ec535fdc pour l'utilisateur: rrrr", "taskName": "Task-82"} +{"asctime": "2024-09-17 16:48:02,382", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Utilisateur rrrr authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-82"} +{"asctime": "2024-09-17 16:48:02,383", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Envoi d'un message de type authenticated de rrrr dans la room quick_match", "taskName": "Task-82"} +{"asctime": "2024-09-17 16:48:02,383", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de rrrr \u00e0 la room quick_match: Authentication successful", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:48:02,383", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140402200488832, "message": "Diffusion d'un message de rrrr \u00e0 la room quick_match: Authentication successful", "taskName": "Task-82"} +{"asctime": "2024-09-17 16:49:07,522", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139731657915264, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 16:49:07,525", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139731657915264, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:49:07,525", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139731657915264, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 16:49:07,525", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139731657915264, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:49:07,525", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139731657915264, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 16:51:01,055", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140071986346880, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 16:51:01,059", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140071986346880, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:51:01,059", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140071986346880, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 16:51:01,059", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140071986346880, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:51:01,060", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140071986346880, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 16:51:31,391", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140541655489408, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 16:51:31,394", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140541655489408, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:51:31,394", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140541655489408, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 16:51:31,394", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140541655489408, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:51:31,395", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140541655489408, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 16:52:06,612", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:06,614", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hu', 'token': '59ce8cfd-feeb-47a5-99d5-707559266d38', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:06,614", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Authentification demand\u00e9e pour hu", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:06,614", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Tentative d'authentification avec le token: 59ce8cfd-feeb-47a5-99d5-707559266d38 pour l'utilisateur: hu", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:06,620", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Utilisateur hu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:06,620", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Envoi d'un message de type authenticated de hu dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:06,621", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de hu \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:14,204", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:14,205", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ki', 'token': 'f9c951f3-7d0a-4f3b-8ea9-8ae396cc9472', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:14,205", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Authentification demand\u00e9e pour ki", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:14,205", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Tentative d'authentification avec le token: f9c951f3-7d0a-4f3b-8ea9-8ae396cc9472 pour l'utilisateur: ki", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:14,211", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Utilisateur ki authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:14,211", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Envoi d'un message de type authenticated de ki dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:14,211", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de ki \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:14,211", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de ki \u00e0 la room main_room: Authentication successful", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:16,954", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'ki', 'message': 'hthth', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:16,954", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Message de chat envoy\u00e9 par ki: hthth", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:16,954", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Envoi d'un message de type chat_message de ki dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:16,954", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de ki \u00e0 la room main_room: hthth", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:16,954", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de ki \u00e0 la room main_room: hthth", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:24,260", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'hu', 'target_user': 'ki', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:24,260", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Invitation envoy\u00e9e de hu \u00e0 ki dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:24,260", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:24,261", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de server \u00e0 la room main_room: hu a invit\u00e9 ki \u00e0 rejoindre une partie main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:24,261", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de server \u00e0 la room main_room: hu a invit\u00e9 ki \u00e0 rejoindre une partie main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:24,261", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=hu, Room=main_room, Message=hu vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:24,261", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=hu, Room=main_room, Message=hu vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:27,034", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'ki', 'response': 'yes', 'inviter': 'hu', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:27,034", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "ki a r\u00e9pondu 'yes' \u00e0 l'invitation de hu", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:27,034", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:27,034", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de server \u00e0 la room main_room: ki a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:27,034", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de server \u00e0 la room main_room: ki a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:27,035", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=ki a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=hu", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:52:27,035", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=ki a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=hu", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:52:27,093", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-79"} +{"asctime": "2024-09-17 16:52:27,095", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hu', 'token': '59ce8cfd-feeb-47a5-99d5-707559266d38', 'room': 'quick_match'}", "taskName": "Task-79"} +{"asctime": "2024-09-17 16:52:27,095", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Authentification demand\u00e9e pour hu", "taskName": "Task-79"} +{"asctime": "2024-09-17 16:52:27,095", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Tentative d'authentification avec le token: 59ce8cfd-feeb-47a5-99d5-707559266d38 pour l'utilisateur: hu", "taskName": "Task-79"} +{"asctime": "2024-09-17 16:52:27,100", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Utilisateur hu authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-79"} +{"asctime": "2024-09-17 16:52:27,100", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Envoi d'un message de type authenticated de hu dans la room quick_match", "taskName": "Task-79"} +{"asctime": "2024-09-17 16:52:27,101", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de hu \u00e0 la room quick_match: Authentication successful", "taskName": "Task-79"} +{"asctime": "2024-09-17 16:52:29,049", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-89"} +{"asctime": "2024-09-17 16:52:29,051", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ki', 'token': 'f9c951f3-7d0a-4f3b-8ea9-8ae396cc9472', 'room': 'quick_match'}", "taskName": "Task-89"} +{"asctime": "2024-09-17 16:52:29,051", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Authentification demand\u00e9e pour ki", "taskName": "Task-89"} +{"asctime": "2024-09-17 16:52:29,051", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Tentative d'authentification avec le token: f9c951f3-7d0a-4f3b-8ea9-8ae396cc9472 pour l'utilisateur: ki", "taskName": "Task-89"} +{"asctime": "2024-09-17 16:52:29,057", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Utilisateur ki authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-89"} +{"asctime": "2024-09-17 16:52:29,057", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Envoi d'un message de type authenticated de ki dans la room quick_match", "taskName": "Task-89"} +{"asctime": "2024-09-17 16:52:29,057", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de ki \u00e0 la room quick_match: Authentication successful", "taskName": "Task-79"} +{"asctime": "2024-09-17 16:52:29,057", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140541655489408, "message": "Diffusion d'un message de ki \u00e0 la room quick_match: Authentication successful", "taskName": "Task-89"} +{"asctime": "2024-09-17 16:54:18,036", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140206046624640, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 16:54:18,038", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140206046624640, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:54:18,039", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140206046624640, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 16:54:18,039", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140206046624640, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 16:54:18,039", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140206046624640, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 16:54:48,077", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:54:48,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'b', 'token': 'e513f000-496a-4660-8af1-cbfcf2770e05', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:54:48,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Authentification demand\u00e9e pour b", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:54:48,082", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Tentative d'authentification avec le token: e513f000-496a-4660-8af1-cbfcf2770e05 pour l'utilisateur: b", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:54:48,089", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Utilisateur b authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:54:48,089", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Envoi d'un message de type authenticated de b dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:54:48,089", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de b \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:54:53,566", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:54:53,568", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'f', 'token': '1c232b79-3f27-48ea-bc44-97862ad56fcf', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:54:53,568", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Authentification demand\u00e9e pour f", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:54:53,568", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Tentative d'authentification avec le token: 1c232b79-3f27-48ea-bc44-97862ad56fcf pour l'utilisateur: f", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:54:53,574", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Utilisateur f authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:54:53,574", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Envoi d'un message de type authenticated de f dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:54:53,574", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:54:53,574", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de f \u00e0 la room main_room: Authentication successful", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:55:01,609", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'b', 'target_user': 'f', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:55:01,609", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Invitation envoy\u00e9e de b \u00e0 f dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:55:01,609", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:55:01,609", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de server \u00e0 la room main_room: b a invit\u00e9 f \u00e0 rejoindre une partie main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:55:01,609", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de server \u00e0 la room main_room: b a invit\u00e9 f \u00e0 rejoindre une partie main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:55:01,610", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=b, Room=main_room, Message=b vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:55:01,610", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=b, Room=main_room, Message=b vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:55:04,124", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'f', 'response': 'yes', 'inviter': 'b', 'room': 'main_room'}", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:55:04,124", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "f a r\u00e9pondu 'yes' \u00e0 l'invitation de b", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:55:04,124", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:55:04,124", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de server \u00e0 la room main_room: f a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:55:04,124", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de server \u00e0 la room main_room: f a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:55:04,125", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=f a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=b", "taskName": "Task-29"} +{"asctime": "2024-09-17 16:55:04,125", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=f a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=b", "taskName": "Task-59"} +{"asctime": "2024-09-17 16:55:04,180", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:55:04,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'b', 'token': 'e513f000-496a-4660-8af1-cbfcf2770e05', 'room': 'quick_match'}", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:55:04,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Authentification demand\u00e9e pour b", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:55:04,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Tentative d'authentification avec le token: e513f000-496a-4660-8af1-cbfcf2770e05 pour l'utilisateur: b", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:55:04,187", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Utilisateur b authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:55:04,188", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Envoi d'un message de type authenticated de b dans la room quick_match", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:55:04,188", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de b \u00e0 la room quick_match: Authentication successful", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:55:06,127", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 16:55:06,129", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'f', 'token': '1c232b79-3f27-48ea-bc44-97862ad56fcf', 'room': 'quick_match'}", "taskName": "Task-86"} +{"asctime": "2024-09-17 16:55:06,129", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Authentification demand\u00e9e pour f", "taskName": "Task-86"} +{"asctime": "2024-09-17 16:55:06,129", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Tentative d'authentification avec le token: 1c232b79-3f27-48ea-bc44-97862ad56fcf pour l'utilisateur: f", "taskName": "Task-86"} +{"asctime": "2024-09-17 16:55:06,136", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Utilisateur f authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-86"} +{"asctime": "2024-09-17 16:55:06,136", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Envoi d'un message de type authenticated de f dans la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 16:55:06,136", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de f \u00e0 la room quick_match: Authentication successful", "taskName": "Task-76"} +{"asctime": "2024-09-17 16:55:06,137", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140206046624640, "message": "Diffusion d'un message de f \u00e0 la room quick_match: Authentication successful", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:02:44,365", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140002222574464, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 17:02:44,368", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140002222574464, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:02:44,368", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140002222574464, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 17:02:44,368", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140002222574464, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:02:44,369", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140002222574464, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 17:03:22,857", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:22,863", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hhhh', 'token': '566991ff-d676-4688-97f6-0c71cc6bc7ef', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:22,863", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Authentification demand\u00e9e pour hhhh", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:22,863", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Tentative d'authentification avec le token: 566991ff-d676-4688-97f6-0c71cc6bc7ef pour l'utilisateur: hhhh", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:22,871", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Utilisateur hhhh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:22,871", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Envoi d'un message de type authenticated de hhhh dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:22,871", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de hhhh \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:30,050", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:30,051", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'gzgfz', 'token': '1c8fee67-1f76-4d85-9e26-c78cdc1b5837', 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:30,052", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Authentification demand\u00e9e pour gzgfz", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:30,052", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Tentative d'authentification avec le token: 1c8fee67-1f76-4d85-9e26-c78cdc1b5837 pour l'utilisateur: gzgfz", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:30,057", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Utilisateur gzgfz authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:30,057", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Envoi d'un message de type authenticated de gzgfz dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:30,058", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de gzgfz \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:30,058", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de gzgfz \u00e0 la room main_room: Authentication successful", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:46,651", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'hhhh', 'target_user': 'gzgfz', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:46,652", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Invitation envoy\u00e9e de hhhh \u00e0 gzgfz dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:46,652", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:46,652", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de server \u00e0 la room main_room: hhhh a invit\u00e9 gzgfz \u00e0 rejoindre une partie main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:46,652", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de server \u00e0 la room main_room: hhhh a invit\u00e9 gzgfz \u00e0 rejoindre une partie main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:46,652", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=hhhh, Room=main_room, Message=hhhh vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:46,653", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=hhhh, Room=main_room, Message=hhhh vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:49,439", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'gzgfz', 'response': 'yes', 'inviter': 'hhhh', 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:49,439", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "gzgfz a r\u00e9pondu 'yes' \u00e0 l'invitation de hhhh", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:49,439", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:49,439", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de server \u00e0 la room main_room: gzgfz a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:49,439", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de server \u00e0 la room main_room: gzgfz a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:49,440", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=gzgfz a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=hhhh", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:03:49,440", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=gzgfz a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=hhhh", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:03:49,494", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:03:49,495", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hhhh', 'token': '566991ff-d676-4688-97f6-0c71cc6bc7ef', 'room': 'quick_match'}", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:03:49,495", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Authentification demand\u00e9e pour hhhh", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:03:49,495", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Tentative d'authentification avec le token: 566991ff-d676-4688-97f6-0c71cc6bc7ef pour l'utilisateur: hhhh", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:03:49,500", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Utilisateur hhhh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:03:49,501", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Envoi d'un message de type authenticated de hhhh dans la room quick_match", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:03:49,501", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de hhhh \u00e0 la room quick_match: Authentication successful", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:03:51,443", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:03:51,444", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'gzgfz', 'token': '1c8fee67-1f76-4d85-9e26-c78cdc1b5837', 'room': 'quick_match'}", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:03:51,444", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Authentification demand\u00e9e pour gzgfz", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:03:51,444", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Tentative d'authentification avec le token: 1c8fee67-1f76-4d85-9e26-c78cdc1b5837 pour l'utilisateur: gzgfz", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:03:51,451", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Utilisateur gzgfz authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:03:51,451", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Envoi d'un message de type authenticated de gzgfz dans la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:03:51,452", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de gzgfz \u00e0 la room quick_match: Authentication successful", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:03:51,452", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140002222574464, "message": "Diffusion d'un message de gzgfz \u00e0 la room quick_match: Authentication successful", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:05:01,220", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139644976737152, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 17:05:01,224", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139644976737152, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:05:01,224", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139644976737152, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 17:05:01,224", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139644976737152, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:05:01,225", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139644976737152, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 17:05:37,249", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:37,250", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'yolo', 'token': 'c3973a8a-5018-4077-ac86-961bc52d4476', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:37,250", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Authentification demand\u00e9e pour yolo", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:37,250", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Tentative d'authentification avec le token: c3973a8a-5018-4077-ac86-961bc52d4476 pour l'utilisateur: yolo", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:37,256", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Utilisateur yolo authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:37,256", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type authenticated de yolo dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:37,256", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de yolo \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:44,900", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:44,901", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'yala', 'token': '668efa56-ff87-49c6-bf4a-37c84133ffc1', 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:44,901", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Authentification demand\u00e9e pour yala", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:44,901", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Tentative d'authentification avec le token: 668efa56-ff87-49c6-bf4a-37c84133ffc1 pour l'utilisateur: yala", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:44,907", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Utilisateur yala authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:44,907", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type authenticated de yala dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:44,907", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de yala \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:44,907", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de yala \u00e0 la room main_room: Authentication successful", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:53,242", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'yolo', 'target_user': 'yala', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:53,242", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Invitation envoy\u00e9e de yolo \u00e0 yala dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:53,242", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:53,242", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room main_room: yolo a invit\u00e9 yala \u00e0 rejoindre une partie main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:53,242", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room main_room: yolo a invit\u00e9 yala \u00e0 rejoindre une partie main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:53,242", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=yolo, Room=main_room, Message=yolo vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:53,242", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=yolo, Room=main_room, Message=yolo vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:56,570", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'yala', 'response': 'yes', 'inviter': 'yolo', 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:56,570", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "yala a r\u00e9pondu 'yes' \u00e0 l'invitation de yolo", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:56,570", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:56,570", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room main_room: yala a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:56,571", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room main_room: yala a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:56,571", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=yala a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=yolo", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:05:56,571", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=yala a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=yolo", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:05:56,627", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:05:56,629", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'yolo', 'token': 'c3973a8a-5018-4077-ac86-961bc52d4476', 'room': 'quick_match'}", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:05:56,629", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Authentification demand\u00e9e pour yolo", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:05:56,629", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Tentative d'authentification avec le token: c3973a8a-5018-4077-ac86-961bc52d4476 pour l'utilisateur: yolo", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:05:56,635", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Utilisateur yolo authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:05:56,635", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type authenticated de yolo dans la room quick_match", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:05:56,635", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de yolo \u00e0 la room quick_match: Authentication successful", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:05:58,577", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:05:58,579", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'yala', 'token': '668efa56-ff87-49c6-bf4a-37c84133ffc1', 'room': 'quick_match'}", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:05:58,579", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Authentification demand\u00e9e pour yala", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:05:58,579", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Tentative d'authentification avec le token: 668efa56-ff87-49c6-bf4a-37c84133ffc1 pour l'utilisateur: yala", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:05:58,585", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Utilisateur yala authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:05:58,586", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type authenticated de yala dans la room quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:05:58,586", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de yala \u00e0 la room quick_match: Authentication successful", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:05:58,586", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de yala \u00e0 la room quick_match: Authentication successful", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:29,656", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'yolo', 'message': 'bien jouer', 'room': 'quick_match'}", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:29,656", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message de chat envoy\u00e9 par yolo: bien jouer", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:29,656", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type chat_message de yolo dans la room quick_match", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:29,657", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de yolo \u00e0 la room quick_match: bien jouer", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:29,657", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de yolo \u00e0 la room quick_match: bien jouer", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:45,899", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'yala', 'target_user': 'yala', 'room': 'quick_match'}", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:45,899", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Invitation envoy\u00e9e de yala \u00e0 yala dans la room quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:45,899", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type chat_message de server dans la room quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:45,899", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room quick_match: yala a invit\u00e9 yala \u00e0 rejoindre une partie quick_match", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:45,899", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room quick_match: yala a invit\u00e9 yala \u00e0 rejoindre une partie quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:45,899", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=yala, Room=quick_match, Message=yala vous a invit\u00e9 \u00e0 rejoindre la room quick_match.", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:45,899", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=yala, Room=quick_match, Message=yala vous a invit\u00e9 \u00e0 rejoindre la room quick_match.", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:48,546", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'yala', 'response': 'no', 'inviter': 'yala', 'room': 'quick_match'}", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:48,546", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "yala a r\u00e9pondu 'no' \u00e0 l'invitation de yala", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:48,546", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type chat_message de server dans la room quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:48,546", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room quick_match: yala a r\u00e9pondu no \u00e0 l'invitation.", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:48,546", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room quick_match: yala a r\u00e9pondu no \u00e0 l'invitation.", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:48,547", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=yala a r\u00e9pondu no \u00e0 l'invitation., Response=no, Inviter=yala", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:48,547", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=yala a r\u00e9pondu no \u00e0 l'invitation., Response=no, Inviter=yala", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:59,741", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'yala', 'target_user': 'yolo', 'room': 'quick_match'}", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:59,741", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Invitation envoy\u00e9e de yala \u00e0 yolo dans la room quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:59,743", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type chat_message de server dans la room quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:59,743", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room quick_match: yala a invit\u00e9 yolo \u00e0 rejoindre une partie quick_match", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:59,743", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room quick_match: yala a invit\u00e9 yolo \u00e0 rejoindre une partie quick_match", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:06:59,744", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=yala, Room=quick_match, Message=yala vous a invit\u00e9 \u00e0 rejoindre la room quick_match.", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:06:59,744", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=yala, Room=quick_match, Message=yala vous a invit\u00e9 \u00e0 rejoindre la room quick_match.", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:07:02,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'yolo', 'response': 'yes', 'inviter': 'yala', 'room': 'quick_match'}", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:07:02,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "yolo a r\u00e9pondu 'yes' \u00e0 l'invitation de yala", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:07:02,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Envoi d'un message de type chat_message de server dans la room quick_match", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:07:02,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room quick_match: yolo a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:07:02,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "Diffusion d'un message de server \u00e0 la room quick_match: yolo a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:07:02,412", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=yolo a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=yala", "taskName": "Task-80"} +{"asctime": "2024-09-17 17:07:02,413", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139644976737152, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=yolo a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=yala", "taskName": "Task-92"} +{"asctime": "2024-09-17 17:10:40,779", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139893359061888, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 17:10:40,781", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139893359061888, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:10:40,781", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139893359061888, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 17:10:40,781", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139893359061888, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:10:40,782", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139893359061888, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 17:11:28,812", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:28,814", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'nhn', 'token': '30b91f20-e230-4817-b9a4-c1e0d9c9282f', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:28,815", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Authentification demand\u00e9e pour nhn", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:28,815", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Tentative d'authentification avec le token: 30b91f20-e230-4817-b9a4-c1e0d9c9282f pour l'utilisateur: nhn", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:28,821", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Utilisateur nhn authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:28,822", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type authenticated de nhn dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:28,822", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de nhn \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:36,779", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:36,782", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ny', 'token': '1230b0e1-ceee-40e3-94e7-aea3bcb22493', 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:36,783", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Authentification demand\u00e9e pour ny", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:36,783", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Tentative d'authentification avec le token: 1230b0e1-ceee-40e3-94e7-aea3bcb22493 pour l'utilisateur: ny", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:36,789", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Utilisateur ny authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:36,789", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type authenticated de ny dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:36,789", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de ny \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:36,789", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de ny \u00e0 la room main_room: Authentication successful", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:47,850", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'ny', 'message': \"t't\", 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:47,851", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message de chat envoy\u00e9 par ny: t't", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:47,851", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de ny dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:47,851", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de ny \u00e0 la room main_room: t't", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:47,851", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de ny \u00e0 la room main_room: t't", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:51,676", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'chat_message', 'username': 'nhn', 'message': 'fef', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:51,676", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message de chat envoy\u00e9 par nhn: fef", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:51,676", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de nhn dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:51,676", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de nhn \u00e0 la room main_room: fef", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:51,676", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de nhn \u00e0 la room main_room: fef", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:59,266", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'nhn', 'target_user': 'ny', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:59,266", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Invitation envoy\u00e9e de nhn \u00e0 ny dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:59,266", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:59,266", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de server \u00e0 la room main_room: nhn a invit\u00e9 ny \u00e0 rejoindre une partie main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:59,266", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de server \u00e0 la room main_room: nhn a invit\u00e9 ny \u00e0 rejoindre une partie main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:11:59,266", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=nhn, Room=main_room, Message=nhn vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:11:59,266", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=nhn, Room=main_room, Message=nhn vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:01,944", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'ny', 'response': 'yes', 'inviter': 'nhn', 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:01,944", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "ny a r\u00e9pondu 'yes' \u00e0 l'invitation de nhn", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:01,944", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:01,944", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de server \u00e0 la room main_room: ny a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:01,944", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de server \u00e0 la room main_room: ny a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:01,944", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=ny a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=nhn", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:01,945", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=ny a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=nhn", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:01,989", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:12:01,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'nhn', 'token': '30b91f20-e230-4817-b9a4-c1e0d9c9282f', 'room': 'quick_match'}", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:12:01,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Authentification demand\u00e9e pour nhn", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:12:01,991", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Tentative d'authentification avec le token: 30b91f20-e230-4817-b9a4-c1e0d9c9282f pour l'utilisateur: nhn", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:12:01,996", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Utilisateur nhn authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:12:01,996", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type authenticated de nhn dans la room quick_match", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:12:01,997", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de nhn \u00e0 la room quick_match: Authentication successful", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:12:03,953", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Connexion de l'utilisateur \u00e0 la room quick_match", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:12:03,955", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ny', 'token': '1230b0e1-ceee-40e3-94e7-aea3bcb22493', 'room': 'quick_match'}", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:12:03,955", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Authentification demand\u00e9e pour ny", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:12:03,955", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Tentative d'authentification avec le token: 1230b0e1-ceee-40e3-94e7-aea3bcb22493 pour l'utilisateur: ny", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:12:03,962", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Utilisateur ny authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:12:03,962", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type authenticated de ny dans la room quick_match", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:12:03,962", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de ny \u00e0 la room quick_match: Authentication successful", "taskName": "Task-86"} +{"asctime": "2024-09-17 17:12:03,962", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de ny \u00e0 la room quick_match: Authentication successful", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:12:43,479", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'invite', 'username': 'ny', 'target_user': 'nhn', 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:43,479", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Invitation envoy\u00e9e de ny \u00e0 nhn dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:43,479", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:43,480", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de server \u00e0 la room main_room: ny a invit\u00e9 nhn \u00e0 rejoindre une partie main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:43,480", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de server \u00e0 la room main_room: ny a invit\u00e9 nhn \u00e0 rejoindre une partie main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:43,480", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=ny, Room=main_room, Message=ny vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:43,480", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "invite: Envoi de l'invitation \u00e0 l'utilisateur via WebSocket. Inviter=ny, Room=main_room, Message=ny vous a invit\u00e9 \u00e0 rejoindre la room main_room.", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:47,583", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'invite_response', 'username': 'nhn', 'response': 'yes', 'inviter': 'ny', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:47,583", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "nhn a r\u00e9pondu 'yes' \u00e0 l'invitation de ny", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:47,583", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de server dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:47,583", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de server \u00e0 la room main_room: nhn a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:47,583", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de server \u00e0 la room main_room: nhn a r\u00e9pondu yes \u00e0 l'invitation.", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:12:47,583", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=nhn a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=ny", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:12:47,583", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "invite_response: Envoi de la r\u00e9ponse \u00e0 l'invitation via WebSocket. Message=nhn a r\u00e9pondu yes \u00e0 l'invitation., Response=yes, Inviter=ny", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:14:27,986", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-183"} +{"asctime": "2024-09-17 17:14:27,987", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'fefe', 'token': 'f26281c5-39e3-4b09-9910-aaada456aac9', 'room': 'main_room'}", "taskName": "Task-183"} +{"asctime": "2024-09-17 17:14:27,987", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Authentification demand\u00e9e pour fefe", "taskName": "Task-183"} +{"asctime": "2024-09-17 17:14:27,988", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Tentative d'authentification avec le token: f26281c5-39e3-4b09-9910-aaada456aac9 pour l'utilisateur: fefe", "taskName": "Task-183"} +{"asctime": "2024-09-17 17:14:27,993", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Utilisateur fefe authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-183"} +{"asctime": "2024-09-17 17:14:27,993", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type authenticated de fefe dans la room main_room", "taskName": "Task-183"} +{"asctime": "2024-09-17 17:14:27,993", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de fefe \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:14:27,993", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de fefe \u00e0 la room main_room: Authentication successful", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:14:27,994", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de fefe \u00e0 la room main_room: Authentication successful", "taskName": "Task-183"} +{"asctime": "2024-09-17 17:14:28,651", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:28,652", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'fefe', 'token': 'f26281c5-39e3-4b09-9910-aaada456aac9', 'room': 'tournament'}", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:28,653", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Authentification demand\u00e9e pour fefe", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:28,653", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Tentative d'authentification avec le token: f26281c5-39e3-4b09-9910-aaada456aac9 pour l'utilisateur: fefe", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:28,659", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Utilisateur fefe authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:28,659", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type authenticated de fefe dans la room tournament", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:28,659", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de fefe \u00e0 la room tournament: Authentication successful", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:33,204", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:33,205", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ny', 'token': '1230b0e1-ceee-40e3-94e7-aea3bcb22493', 'room': 'tournament'}", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:33,205", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Authentification demand\u00e9e pour ny", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:33,205", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Tentative d'authentification avec le token: 1230b0e1-ceee-40e3-94e7-aea3bcb22493 pour l'utilisateur: ny", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:33,211", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Utilisateur ny authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:33,211", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type authenticated de ny dans la room tournament", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:33,211", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de ny \u00e0 la room tournament: Authentication successful", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:33,211", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de ny \u00e0 la room tournament: Authentication successful", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:42,810", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:14:42,811", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'nhn', 'token': '30b91f20-e230-4817-b9a4-c1e0d9c9282f', 'room': 'tournament'}", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:14:42,811", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Authentification demand\u00e9e pour nhn", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:14:42,812", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Tentative d'authentification avec le token: 30b91f20-e230-4817-b9a4-c1e0d9c9282f pour l'utilisateur: nhn", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:14:42,819", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Utilisateur nhn authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:14:42,819", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type authenticated de nhn dans la room tournament", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:14:42,819", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de nhn \u00e0 la room tournament: Authentication successful", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:42,819", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de nhn \u00e0 la room tournament: Authentication successful", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:42,819", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de nhn \u00e0 la room tournament: Authentication successful", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:14:57,872", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: nhn contre ny', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:57,872", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message de chat envoy\u00e9 par Server: Prochain match: nhn contre ny", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:57,872", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:57,872", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: fefe contre Bot', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:57,872", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message de chat envoy\u00e9 par Server: Prochain match: fefe contre Bot", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:57,872", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:57,872", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: nhn contre ny", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:57,873", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: nhn contre ny", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:57,873", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: nhn contre ny", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:14:57,874", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: fefe contre Bot", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:14:57,874", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: fefe contre Bot", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:14:57,874", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: fefe contre Bot", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:15:13,907", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: ny contre fefe', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:15:13,908", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Message de chat envoy\u00e9 par Server: Prochain match: ny contre fefe", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:15:13,908", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:15:13,908", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: ny contre fefe", "taskName": "Task-191"} +{"asctime": "2024-09-17 17:15:13,908", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: ny contre fefe", "taskName": "Task-202"} +{"asctime": "2024-09-17 17:15:13,908", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139893359061888, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: ny contre fefe", "taskName": "Task-214"} +{"asctime": "2024-09-17 17:17:02,756", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 17, "thread": 140063179438976, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 17:17:02,759", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 17, "thread": 140063179438976, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:17:02,759", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 17, "thread": 140063179438976, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 17:17:02,759", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 17, "thread": 140063179438976, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:17:02,759", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 17, "thread": 140063179438976, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 17:20:36,530", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 139940827048832, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 17:20:36,533", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 139940827048832, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:20:36,533", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139940827048832, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 17:20:36,533", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139940827048832, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:20:36,533", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 139940827048832, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 17:21:12,698", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:12,700", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hhh', 'token': '9bfaef30-4dfc-4a75-a2de-fb669da1d1c9', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:12,700", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Authentification demand\u00e9e pour hhh", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:12,700", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Tentative d'authentification avec le token: 9bfaef30-4dfc-4a75-a2de-fb669da1d1c9 pour l'utilisateur: hhh", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:12,706", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Utilisateur hhh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:12,706", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type authenticated de hhh dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:12,706", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de hhh \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:19,037", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:21:19,039", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '443a81c5-154e-47ee-b5f4-9ab0f00184d8', 'room': 'main_room'}", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:21:19,039", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:21:19,039", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Tentative d'authentification avec le token: 443a81c5-154e-47ee-b5f4-9ab0f00184d8 pour l'utilisateur: g", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:21:19,046", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:21:19,046", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type authenticated de g dans la room main_room", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:21:19,046", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:19,047", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de g \u00e0 la room main_room: Authentication successful", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:21:27,995", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:21:27,996", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'h', 'token': '5ed21c88-0178-4fbe-b58a-2770bd046f10', 'room': 'main_room'}", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:21:27,997", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Authentification demand\u00e9e pour h", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:21:27,997", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Tentative d'authentification avec le token: 5ed21c88-0178-4fbe-b58a-2770bd046f10 pour l'utilisateur: h", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:21:28,002", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Utilisateur h authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:21:28,002", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type authenticated de h dans la room main_room", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:21:28,002", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:21:28,003", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-63"} +{"asctime": "2024-09-17 17:21:28,003", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de h \u00e0 la room main_room: Authentication successful", "taskName": "Task-98"} +{"asctime": "2024-09-17 17:21:30,284", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:30,285", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'h', 'token': '5ed21c88-0178-4fbe-b58a-2770bd046f10', 'room': 'tournament'}", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:30,285", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Authentification demand\u00e9e pour h", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:30,285", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Tentative d'authentification avec le token: 5ed21c88-0178-4fbe-b58a-2770bd046f10 pour l'utilisateur: h", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:30,291", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Utilisateur h authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:30,291", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type authenticated de h dans la room tournament", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:30,291", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de h \u00e0 la room tournament: Authentication successful", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:32,562", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:32,564", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'g', 'token': '443a81c5-154e-47ee-b5f4-9ab0f00184d8', 'room': 'tournament'}", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:32,564", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Authentification demand\u00e9e pour g", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:32,564", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Tentative d'authentification avec le token: 443a81c5-154e-47ee-b5f4-9ab0f00184d8 pour l'utilisateur: g", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:32,570", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Utilisateur g authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:32,570", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type authenticated de g dans la room tournament", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:32,570", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de g \u00e0 la room tournament: Authentication successful", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:32,570", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de g \u00e0 la room tournament: Authentication successful", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:34,507", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Connexion de l'utilisateur \u00e0 la room tournament", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:34,509", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'hhh', 'token': '9bfaef30-4dfc-4a75-a2de-fb669da1d1c9', 'room': 'tournament'}", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:34,510", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Authentification demand\u00e9e pour hhh", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:34,510", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Tentative d'authentification avec le token: 9bfaef30-4dfc-4a75-a2de-fb669da1d1c9 pour l'utilisateur: hhh", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:34,515", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Utilisateur hhh authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:34,515", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type authenticated de hhh dans la room tournament", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:34,516", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de hhh \u00e0 la room tournament: Authentication successful", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:34,516", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de hhh \u00e0 la room tournament: Authentication successful", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:34,516", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de hhh \u00e0 la room tournament: Authentication successful", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:36,544", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: h contre g', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:36,544", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message de chat envoy\u00e9 par Server: Prochain match: h contre g", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:36,544", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:36,544", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: h contre g", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:36,544", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: h contre g", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:36,544", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: hhh contre Bot', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:36,544", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message de chat envoy\u00e9 par Server: Prochain match: hhh contre Bot", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:36,545", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:36,545", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: h contre g", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:36,546", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: hhh contre Bot", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:36,546", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: hhh contre Bot", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:36,546", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: hhh contre Bot", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:50,576", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message re\u00e7u: {'type': 'chat_message', 'message': 'Prochain match: g contre hhh', 'username': 'Server', 'room': 'tournament'}", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:50,576", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Message de chat envoy\u00e9 par Server: Prochain match: g contre hhh", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:50,576", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Envoi d'un message de type chat_message de Server dans la room tournament", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:21:50,577", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: g contre hhh", "taskName": "Task-106"} +{"asctime": "2024-09-17 17:21:50,577", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: g contre hhh", "taskName": "Task-117"} +{"asctime": "2024-09-17 17:21:50,577", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 139940827048832, "message": "Diffusion d'un message de Server \u00e0 la room tournament: Prochain match: g contre hhh", "taskName": "Task-129"} +{"asctime": "2024-09-17 17:25:31,575", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140719840488320, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 17:25:31,577", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140719840488320, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:25:31,578", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140719840488320, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 17:25:31,578", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140719840488320, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:25:31,578", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140719840488320, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 17:25:53,181", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140719840488320, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:25:53,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140719840488320, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ggg', 'token': '0b68244e-67bf-4a82-b009-4dd86d89a6a2', 'room': 'main_room'}", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:25:53,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140719840488320, "message": "Authentification demand\u00e9e pour ggg", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:25:53,182", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140719840488320, "message": "Tentative d'authentification avec le token: 0b68244e-67bf-4a82-b009-4dd86d89a6a2 pour l'utilisateur: ggg", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:25:53,189", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140719840488320, "message": "Utilisateur ggg authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:25:53,189", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140719840488320, "message": "Envoi d'un message de type authenticated de ggg dans la room main_room", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:25:53,189", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140719840488320, "message": "Diffusion d'un message de ggg \u00e0 la room main_room: Authentication successful", "taskName": "Task-29"} +{"asctime": "2024-09-17 17:30:10,455", "levelname": "INFO", "name": "pong.game.routing", "module": "routing", "process": 18, "thread": 140512702421888, "message": "WebSocket routing patterns configured successfully", "taskName": null} +{"asctime": "2024-09-17 17:30:10,457", "levelname": "INFO", "name": "daphne.cli", "module": "cli", "process": 18, "thread": 140512702421888, "message": "Starting server at tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:30:10,458", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140512702421888, "message": "HTTP/2 support not enabled (install the http2 and tls Twisted extras)", "taskName": null} +{"asctime": "2024-09-17 17:30:10,458", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140512702421888, "message": "Configuring endpoint tcp:port=8080:interface=0.0.0.0", "taskName": null} +{"asctime": "2024-09-17 17:30:10,458", "levelname": "INFO", "name": "daphne.server", "module": "server", "process": 18, "thread": 140512702421888, "message": "Listening on TCP address 0.0.0.0:8080", "taskName": null} +{"asctime": "2024-09-17 17:31:04,685", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140512702421888, "message": "Connexion de l'utilisateur \u00e0 la room main_room", "taskName": "Task-33"} +{"asctime": "2024-09-17 17:31:04,687", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140512702421888, "message": "Message re\u00e7u: {'type': 'authenticate', 'username': 'ffe', 'token': '45c53dc1-7506-4be6-ab08-8c11d08661b6', 'room': 'main_room'}", "taskName": "Task-33"} +{"asctime": "2024-09-17 17:31:04,687", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140512702421888, "message": "Authentification demand\u00e9e pour ffe", "taskName": "Task-33"} +{"asctime": "2024-09-17 17:31:04,687", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140512702421888, "message": "Tentative d'authentification avec le token: 45c53dc1-7506-4be6-ab08-8c11d08661b6 pour l'utilisateur: ffe", "taskName": "Task-33"} +{"asctime": "2024-09-17 17:31:04,693", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140512702421888, "message": "Utilisateur ffe authentifi\u00e9 avec succ\u00e8s", "taskName": "Task-33"} +{"asctime": "2024-09-17 17:31:04,693", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140512702421888, "message": "Envoi d'un message de type authenticated de ffe dans la room main_room", "taskName": "Task-33"} +{"asctime": "2024-09-17 17:31:04,694", "levelname": "INFO", "name": "pong.game.consumers", "module": "consumers", "process": 18, "thread": 140512702421888, "message": "Diffusion d'un message de ffe \u00e0 la room main_room: Authentication successful", "taskName": "Task-33"} diff --git a/pong/game/consumers.py b/pong/game/consumers.py index d016737..2c69ac8 100644 --- a/pong/game/consumers.py +++ b/pong/game/consumers.py @@ -291,7 +291,45 @@ class ChatConsumer(AsyncWebsocketConsumer): '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'] @@ -331,6 +369,22 @@ class ChatConsumer(AsyncWebsocketConsumer): } ) + 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 est manquant, l'authentification ne peut pas se poursuivre.") diff --git a/pong/static/burger.js b/pong/static/burger.js index 6467591..491d47a 100644 --- a/pong/static/burger.js +++ b/pong/static/burger.js @@ -98,7 +98,8 @@ document.addEventListener('DOMContentLoaded', () => { return null; // En cas d'erreur, retourne null }); } - + // Expose fetchPlayers globalement + window.fetchPlayers = fetchPlayers; function fetchTournois(){ console.log('Fetching tournois...'); fetch('/api/tournoi_list/') diff --git a/pong/static/game.js b/pong/static/game.js index 77e1bd6..64fd3e2 100644 --- a/pong/static/game.js +++ b/pong/static/game.js @@ -423,18 +423,12 @@ document.addEventListener('DOMContentLoaded', () => { logo.style.display = 'none'; pongElements.style.display = 'none'; formBlock.style.display = 'none'; - - // Log pour vérifier le token avant l'authentification WebSocket - console.log("Token before WebSocket authentication:", token); - - if (!token) { - console.error("Token is not defined or is null. WebSocket connection aborted."); - return; - } - // Vérification si une connexion WebSocket est déjà active avant d'initialiser - if (roomSockets["quick_match"] && roomSockets["quick_match"].readyState === WebSocket.OPEN) { + if (roomSockets["quick_match"] && roomSockets["quick_match"].readyState === WebSocket.OPEN) + { console.warn("WebSocket for quick_match already open."); + // On laisse startWebSocketConnection se lancer malgré la WebSocket ouverte + startWebSocketConnection(token, 1); return; } roomName = "quick_match"; // Nom de la room principale @@ -444,44 +438,41 @@ document.addEventListener('DOMContentLoaded', () => { startWebSocketConnection(token, 1); // Le "1" pourrait être un identifiant pour le mode Quick Match } - - function startTournament() { + // Fonction pour démarrer un tournoi + function startTournament() + { saveData = { - type: 'tournoi' - } - // Masquer les éléments inutiles et afficher le conteneur du tournoi - tournamentContainer.style.display = 'flex'; - logo.style.display = 'none'; - pongElements.style.display = 'none'; - formBlock.style.display = 'none'; - - // Log pour vérifier le token avant l'authentification WebSocket - console.log("Token before WebSocket authentication:", token); - - if (!token) { - console.error("Token is not defined or is null. WebSocket connection aborted."); - return; - } - - // Vérification si une connexion WebSocket est déjà active avant d'initialiser - if (roomSockets["tournament"] && roomSockets["tournament"].readyState === WebSocket.OPEN) { - console.warn("WebSocket for tournament already open."); - return; - } - 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 + type: 'tournoi' + }; + // Masquer les éléments inutiles et afficher le conteneur du tournoi + tournamentContainer.style.display = 'flex'; + logo.style.display = 'none'; + pongElements.style.display = 'none'; + formBlock.style.display = 'none'; + // Log pour vérifier le token avant l'authentification WebSocket + // Vérification si une connexion WebSocket est déjà active avant d'initialiser + if (roomSockets["tournament"] && roomSockets["tournament"].readyState === WebSocket.OPEN) + { + console.warn("WebSocket for tournament already open."); + // On laisse startWebSocketConnection se lancer malgré la WebSocket ouverte + startWebSocketConnection(token, 42); + return; } - + 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 +} function startWebSocketConnection(token, players) { - if (socket && socket.readyState === WebSocket.OPEN) { - console.warn('WebSocket connection already open.'); - return; - } + // Si le socket existe déjà et est ouvert, le fermer + /*if (socket && socket.readyState === WebSocket.OPEN) + { + console.warn('WebSocket connection already open. Closing and recreating a new one.'); + socket.close(); // Fermer le socket ouvert + }*/ socket = new WebSocket(`ws://${window.location.host}/ws/game/`); - + socket.onopen = function (event) { console.log('WebSocket connection established'); if (players === 1) { @@ -655,61 +646,54 @@ document.addEventListener('DOMContentLoaded', () => { } } - // Détection de la commande /s username function sendStatsCommand(targetUser) { - console.log(`Detected stats command for user: ${targetUser}`); - - // Appelle fetchPlayers et utilise .then() pour traiter les résultats - fetchPlayers().then((players) => { - if (!players) { - console.log('No players found.'); - return; - } - - console.log('Players received in sendStatsCommand:', players); // Affiche les joueurs récupérés - - // Filtrer et récupérer les informations du joueur spécifique - const playerStats = filterPlayers(targetUser); - if (playerStats) { - // Si les stats sont trouvées, afficher la popup avec les données - displayPlayerStats(playerStats); - } else { - console.log(`Player with username ${targetUser} not found.`); - } - }).catch(error => { - console.error('Error fetching players:', error); - }); + console.log(`Detected stats command for user: ${targetUser}`); + + // Appelle fetchPlayers et utilise .then() pour traiter les résultats + fetchPlayers().then((players) => { + if (!players) { + console.log('No players found.'); + return; + } + + console.log('Players received in sendStatsCommand:', players); // Affiche les joueurs récupérés + + // Filtrer et récupérer les informations du joueur spécifique + const playerStats = filterPlayers(targetUser, players); // Passer le tableau players en paramètre + if (playerStats) { + // Si les stats sont trouvées, afficher la popup avec les données + displayPlayerStats(playerStats); + } else { + console.log(`Player with username ${targetUser} not found.`); + } + }).catch(error => { + console.error('Error fetching players:', error); + }); } - // Modification de filterPlayers pour renvoyer les données du joueur trouvé - function filterPlayers(targetUser) { - const searchValue = targetUser.toLowerCase(); // Utiliser le nom d'utilisateur comme valeur de recherche - const playersListBody = document.querySelector('#player-list tbody'); - const rows = playersListBody.getElementsByTagName('tr'); + // Modification de filterPlayers pour chercher dans les données reçues (JSON) +function filterPlayers(targetUser, players) { + const searchValue = targetUser.toLowerCase(); // Utiliser le nom d'utilisateur comme valeur de recherche - for (let i = 0; i < rows.length; i++) { - const nameCell = rows[i].getElementsByTagName('td')[1]; // Colonne du nom de l'utilisateur - if (nameCell) { - const nameValue = nameCell.textContent || nameCell.innerText; - if (nameValue.toLowerCase().indexOf(searchValue) > -1) { - rows[i].style.display = ''; // Affiche uniquement la ligne correspondant au joueur - - // Récupérer les statistiques du joueur à partir des cellules de la ligne - const playerStats = { - username: nameValue, - total_matches: rows[i].getElementsByTagName('td')[2].textContent, - total_wins: rows[i].getElementsByTagName('td')[3].textContent, - win_percentage: rows[i].getElementsByTagName('td')[4].textContent, - best_score: rows[i].getElementsByTagName('td')[5].textContent - }; - return playerStats; // Retourne les stats du joueur - } - } - } - - return null; // Retourne null si le joueur n'est pas trouvé + for (let i = 0; i < players.length; i++) { + const player = players[i]; + if (player.name && player.name.toLowerCase() === searchValue) { + // Récupérer les statistiques du joueur à partir des données reçues + const playerStats = { + username: player.name, + total_matches: player.total_match, + total_wins: player.total_win, + win_percentage: player.p_win, + best_score: player.best_score || 'N/A' // Ajoute une gestion de cas si best_score n'existe pas + }; + return playerStats; // Retourne les stats du joueur + } } + return null; // Retourne null si le joueur n'est pas trouvé +} + + function displayPlayerStats(stats) { console.log('Displaying player stats:', stats); // Vérifie que la fonction est bien appelée