"""Classes to (de)serialize various struct messages""" import struct from steam.enums import EResult, EUniverse from steam.enums.emsg import EMsg _emsg_map = {} def get_struct(emsg): return _emsg_map.get(emsg, None) class MapEMsgMeta(type): """Automatically maps subclasses of :class:`StructMessage` to ``EMsg``""" def __new__(metacls, name, bases, classdict): cls = type.__new__(metacls, name, bases, classdict) if name != 'StructMessage': try: _emsg_map[EMsg[name]] = cls except KeyError: pass return cls class StructMessage: __metaclass__ = MapEMsgMeta def __init__(self, data=None): if data: self.load(data) def serialize(self): return b'' def load(self, data): pass class ChannelEncryptRequest(StructMessage): protocolVersion = 1 universe = EUniverse.Invalid challenge = b'' def serialize(self): return struct.pack(" 8: self.challenge = data[8:] def __str__(self): return '\n'.join(["protocolVersion: %s" % self.protocolVersion, "universe: %s" % repr(self.universe), "challenge: %s" % repr(self.challenge), ]) class ChannelEncryptResponse(StructMessage): protocolVersion = 1 keySize = 128 key = '' crc = 0 def __init__(self, data=None): if data: self.load(data) def serialize(self): return struct.pack("