def handle(self, message: Message) -> None: """ Implement the reaction to a message. :param message: the message :return: None """ # convenience representations fipa_msg = cast(FipaMessage, message) msg_performative = FipaMessage.Performative( message.get("performative")) # recover dialogue dialogues = cast(Dialogues, self.context.dialogues) if dialogues.is_belonging_to_registered_dialogue( fipa_msg, self.context.agent_address): dialogue = cast( Dialogue, dialogues.get_dialogue(fipa_msg, self.context.agent_address)) dialogue.incoming_extend(fipa_msg) else: self._handle_unidentified_dialogue(fipa_msg) return # handle message if msg_performative == FipaMessage.Performative.PROPOSE: self._handle_propose(fipa_msg, dialogue) elif msg_performative == FipaMessage.Performative.DECLINE: self._handle_decline(fipa_msg, dialogue) elif msg_performative == FipaMessage.Performative.MATCH_ACCEPT_W_INFORM: self._handle_match_accept(fipa_msg, dialogue) elif msg_performative == FipaMessage.Performative.INFORM: self._handle_inform(fipa_msg, dialogue)
def decode(obj: bytes) -> Message: """ Decode bytes into a 'Fipa' message. :param obj: the bytes object. :return: the 'Fipa' message. """ message_pb = ProtobufMessage() fipa_pb = fipa_pb2.FipaMessage() message_pb.ParseFromString(obj) message_id = message_pb.dialogue_message.message_id dialogue_reference = ( message_pb.dialogue_message.dialogue_starter_reference, message_pb.dialogue_message.dialogue_responder_reference, ) target = message_pb.dialogue_message.target fipa_pb.ParseFromString(message_pb.dialogue_message.content) performative = fipa_pb.WhichOneof("performative") performative_id = FipaMessage.Performative(str(performative)) performative_content = dict() # type: Dict[str, Any] if performative_id == FipaMessage.Performative.CFP: pb2_query = fipa_pb.cfp.query query = Query.decode(pb2_query) performative_content["query"] = query elif performative_id == FipaMessage.Performative.PROPOSE: pb2_proposal = fipa_pb.propose.proposal proposal = Description.decode(pb2_proposal) performative_content["proposal"] = proposal elif performative_id == FipaMessage.Performative.ACCEPT_W_INFORM: info = fipa_pb.accept_w_inform.info info_dict = dict(info) performative_content["info"] = info_dict elif performative_id == FipaMessage.Performative.MATCH_ACCEPT_W_INFORM: info = fipa_pb.match_accept_w_inform.info info_dict = dict(info) performative_content["info"] = info_dict elif performative_id == FipaMessage.Performative.INFORM: info = fipa_pb.inform.info info_dict = dict(info) performative_content["info"] = info_dict elif performative_id == FipaMessage.Performative.ACCEPT: pass elif performative_id == FipaMessage.Performative.DECLINE: pass elif performative_id == FipaMessage.Performative.MATCH_ACCEPT: pass elif performative_id == FipaMessage.Performative.END: pass else: raise ValueError("Performative not valid: {}.".format(performative_id)) return FipaMessage( message_id=message_id, dialogue_reference=dialogue_reference, target=target, performative=performative, **performative_content )