40 lines
1 KiB
Python
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"))
|