def from_bytes(data): length = len(data) if length == 0: return KeepAliveMessage() offset, type = Network.read_byte_as_int(data, 0) if type == PeerMessageType.Piece: return PieceMessage.from_bytes(data) if type == PeerMessageType.Choke: return ChokeMessage.from_bytes(data) if type == PeerMessageType.Unchoke: return UnchokeMessage.from_bytes(data) if type == PeerMessageType.Interested: return InterestedMessage.from_bytes(data) if type == PeerMessageType.Uninterested: return UninterestedMessage.from_bytes(data) if type == PeerMessageType.Have: return HaveMessage.from_bytes(data) if type == PeerMessageType.Bitfield: return BitfieldMessage.from_bytes(data) if type == PeerMessageType.Request: return RequestMessage.from_bytes(data) if type == PeerMessageType.Port: return PortMessage.from_bytes(data) if type == PeerMessageType.Cancel: return CancelMessage.from_bytes(data) if type == PeerMessageType.HaveAll: return HaveAllMessage.from_bytes(data) if type == PeerMessageType.HaveNone: return HaveNoneMessage.from_bytes(data) if type == PeerMessageType.AllowedFast: return AllowedFastMessage.from_bytes(data) if type == PeerMessageType.SuggestPiece: return SuggestPieceMessage.from_bytes(data) if type == PeerMessageType.RejectRequest: return RejectRequestMessage.from_bytes(data) if type == PeerMessageType.ExtensionMessage: offset, extension_message_type = Network.read_byte_as_int( data, offset) if extension_message_type == 0: return ExtensionHandshakeMessage.from_bytes(data) if extension_message_type == ExtensionProtocolMessageType.PeerExchange: return PeerExchangeMessage.from_bytes(data) if extension_message_type == ExtensionProtocolMessageType.Metadata: return MetadataMessage.from_bytes(data) Logger().write(LogVerbosity.Info, "Unknown message! type = " + str(type))
def from_bytes(cls, data): if not check_bytes_length(data, 68): return None offset = 0 offset, length = Network.read_byte_as_int(data, offset) offset, protocol = Network.read_bytes(data, 19, offset) offset, reserved = Network.read_bytes(data, 8, offset) offset, info_hash = Network.read_bytes(data, 20, offset) offset, peer_id = Network.read_bytes(data, 20, offset) result = cls(info_hash) result.length = length result.protocol = protocol result.reserved = reserved result.peer_id = peer_id return result