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 0000000..d91cd1f Binary files /dev/null and b/pong/static/logo-42-perpignan.png differ 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