68 lines
1.2 KiB
Python
68 lines
1.2 KiB
Python
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]} ???)"
|