L3-Bataille-Navale/source/network/packet/PacketBoatsData.py
2023-03-11 12:53:01 +01:00

45 lines
1.1 KiB
Python

import socket
import struct
from dataclasses import dataclass, field
import numpy as np
from source.network.packet.abc import Packet
@dataclass
class PacketBoatsData(Packet):
boats: np.array = field()
packet_format: str = ">II"
def to_bytes(self) -> bytes:
width, height = self.boats.shape
size: int = width * height
return struct.pack(
f"{self.packet_format}{size*2}s", # deux "s" parce qu'un bateau est représenté en ushort
width,
height,
self.boats.tobytes()
)
@classmethod
def from_connection(cls, connection: socket.socket) -> "PacketBoatsData":
width, height = struct.unpack(
cls.packet_format,
connection.recv(struct.calcsize(cls.packet_format))
)
size: int = width * height
format_ = f"{size*2}s" # deux "s" parce qu'un bateau est représenté en ushort
data, *_ = struct.unpack(
format_,
connection.recv(struct.calcsize(format_))
)
return cls(
boats=np.frombuffer(data, dtype=np.ushort).reshape((width, height))
)