ManInTheMiddleAmongUs/proto/packet.py
2020-10-20 02:46:01 +02:00

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]} ???)"