L3-Bataille-Navale/source/network/packet/PacketChat.py

40 lines
1 KiB
Python

import socket
import struct
from dataclasses import dataclass, field
from typing import Optional
from source.network.packet.abc import Packet
@dataclass
class PacketChat(Packet):
"""
A packet that represent a message from the chat
"""
message: str = field()
packet_format = ">I"
def to_bytes(self) -> bytes:
message: bytes = self.message.encode("utf-8")
message_len: int = len(message)
# envoie la taille du message, suivi des données du message
return struct.pack(f"{self.packet_format}{message_len}s", message_len, message)
@classmethod
def from_connection(cls, connection: socket.socket) -> "Packet":
message_len, *_ = struct.unpack(
cls.packet_format,
connection.recv(struct.calcsize(cls.packet_format))
)
format_: str = f">{message_len}s"
message, *_ = struct.unpack(
format_,
connection.recv(struct.calcsize(format_))
)
return cls(message=message.decode("utf-8"))