from channels.generic.websocket import AsyncWebsocketConsumer from transcendence.abstract.AbstractRoomMember import AbstractRoomMember from .Position import Position import time from .. import config from ..models import GameModel MIN_POSITION: float = config.PADDLE_RATIO / 2 MAX_POSITION: float = 1 - MIN_POSITION class GameMember(AbstractRoomMember): def __init__(self, user_id: int, socket: AsyncWebsocketConsumer, room): super().__init__(user_id, socket) self.position: Position = Position(0.5, int(time.time() * 1000.0)) self.room = room self.is_a_player = user_id in GameModel.objects.get(pk = self.room.game_id).get_players_id() def receive(self, data: dict): detail: str = data.get("detail") if (detail is None): return if (detail == "update_my_paddle_pos"): self.update_position(data) def send_error(self, error_message: str): self.send("error", {"error_message": error_message}) def update_position(self, data: dict): if (not self.is_a_player): return new_position: Position = Position() new_position.position = data.get("position") if (new_position is None): self.send_error("missing new_position") return new_position.time = data.get("time") if (new_position.time is None): self.send_error("missing time") return if (self.position.time > new_position.time): self.send_error("time error") return distance: float = abs(self.position.position - new_position.position) sign = 1 if self.position.position >= new_position.position else -1 time_difference = (new_position.time - self.position.time) / 1000 max_distance = config.PADDLE_SPEED_PER_SECOND_MAX * (time_difference) * config.PADDLE_SPEED_PER_SECOND_TOLERANCE new_position_verified: Position = new_position.copy() if (distance > max_distance): print(max_distance, distance, time_difference, self.position.position, new_position.position) new_position_verified.position = self.position.position + max_distance * sign if (not MIN_POSITION <= new_position_verified.position <= MAX_POSITION): new_position_verified.position = max(new_position_verified.position, MIN_POSITION) new_position_verified.position = min(new_position_verified.position, MAX_POSITION) if (new_position.position != new_position_verified.position): self.send("update_paddles", { "players": [ { "position": new_position_verified.position, "time": new_position_verified.time, "id": self.user_id, }, ], }) print("trop vite") self.position = new_position def send_ball(self, ball): self.send("update_ball_pos", {"x": ball.x, "y": ball.y})