import enum from typing import * from dataclasses import dataclass from . import parser from .fieldtype import * class HazelPacketType(bytes, enum.Enum): UNRELIABLE = bytes([0]) RELIABLE = bytes([1]) HELLO = bytes([8]) PING = bytes([12]) ACK = bytes([10]) FIN = bytes([9]) FRAGMENT = bytes([11]) # not observed yet, maybe unused in among us? Parser = parser.MetaParser() @Parser.register class PingPacket(parser.Packet): Fields = [ Fixed(HazelPacketType.PING), Int("nonce", 2), ] def __str__(self): return f"Ping {self.nonce}" @Parser.register class AckPacket(parser.Packet): Fields = [ Fixed(HazelPacketType.ACK), Int("nonce", 2), Fixed(b"\xff"), ] def __str__(self): return f"Ack {self.nonce}" @Parser.register class FinPacket(parser.Packet): Fields = [ Fixed(HazelPacketType.FIN), ] def __str__(self): return "Fin" @Parser.register class HelloPacket(parser.Packet): Fields = [ Fixed(HazelPacketType.HELLO), Unknown(7), Int("name_len", 1), Ascii("name", "name_len"), ] def __str__(self): return f"Hello {self.name} ({self.fields[1]} ???)"