class MsgProto(object): proto = True body = "!!! NO BODY !!!" def __init__(self, msg, data=None): self._header = MsgHdrProtoBuf(data) self.header = self._header.proto self.msg = msg if msg == EMsg.ServiceMethod: proto = get_um(self.header.target_job_name) if proto: self.body = proto() else: self.body = '!! Can\'t resolve ServiceMethod: %s !!' % repr(self.header.target_job_name) else: proto = get_cmsg(msg) if proto: self.body = proto() if data: data = data[self._header._fullsize:] self.body.ParseFromString(data) @property def msg(self): return self._header.msg @msg.setter def msg(self, value): self._header.msg = EMsg(value) def serialize(self): return self._header.serialize() + self.body.SerializeToString() @property def steamID(self): return self.header.steamid @steamID.setter def steamID(self, value): self.header.steamid = value @property def sessionID(self): return self.header.client_sessionid @sessionID.setter def sessionID(self, value): self.header.client_sessionid = value def __repr__(self): return "<MsgProto %s>" % repr(self.msg) def __str__(self): rows = ["MsgProto %s" % repr(self.msg)] header = str(self.header).rstrip() rows.append("-------------- header --") rows.append(header if header else "(empty)") body = str(self.body).rstrip() rows.append("---------------- body --") rows.append(body if body else "(empty)") return '\n'.join(rows)
class MsgProto(object): proto = True body = None #: protobuf message instance payload = None #: Will contain body payload, if we fail to find correct proto message def __init__(self, msg, data=None, parse=True): self._header = MsgHdrProtoBuf(data) self.header = self._header.proto self.msg = msg if data: self.payload = data[self._header._fullsize:] if parse: self.parse() def parse(self): """Parses :attr:`payload` into :attr:`body` instance""" if self.body is None: if self.msg in (EMsg.ServiceMethod, EMsg.ServiceMethodResponse, EMsg.ServiceMethodSendToClient): is_resp = False if self.msg == EMsg.ServiceMethod else True proto = get_um(self.header.target_job_name, response=is_resp) else: proto = get_cmsg(self.msg) if proto: self.body = proto() if self.payload: self.body.ParseFromString(self.payload) self.payload = None else: self.body = '!!! Failed to resolve message !!!' @property def msg(self): return self._header.msg @msg.setter def msg(self, value): self._header.msg = EMsg(value) def serialize(self): return self._header.serialize() + self.body.SerializeToString() @property def steamID(self): return self.header.steamid @steamID.setter def steamID(self, value): self.header.steamid = value @property def sessionID(self): return self.header.client_sessionid @sessionID.setter def sessionID(self, value): self.header.client_sessionid = value def __repr__(self): if isinstance(self.body, _ProtoMessageType): suffix = self.body.__class__.__name__ elif self.payload: suffix = 'not parsed' else: suffix = 'n/a' return "<MsgProto(%r | %s)>" % (self.msg, suffix) def __str__(self): rows = [repr(self)] header = str(self.header).rstrip() rows.append("-------------- header --") rows.append(header if header else "(empty)") body = str(self.body).rstrip() rows.append("---------------- body --") rows.append(body if body else "(empty)") if self.payload: rows.append("------------- payload --") rows.append(repr(self.payload)) return '\n'.join(rows)