def handle(self, message: Message, sender: str) -> None: """ Implement the reaction to a message. :param message: the message :param sender: the sender :return: None """ tx_msg_response = cast(TransactionMessage, message) if tx_msg_response is not None and \ TransactionMessage.Performative(tx_msg_response.get("performative")) == TransactionMessage.Performative.ACCEPT: logger.info("[{}]: transaction was successful.".format(self.context.agent_name)) json_data = {'transaction_digest': tx_msg_response.get("transaction_digest")} dialogue_label = DialogueLabel.from_json(cast(Dict[str, str], tx_msg_response.get("dialogue_label"))) dialogues = cast(Dialogues, self.context.dialogues) dialogue = dialogues.dialogues[dialogue_label] fipa_msg = cast(FIPAMessage, dialogue.last_incoming_message) new_message_id = cast(int, fipa_msg.get("message_id")) + 1 new_target_id = cast(int, fipa_msg.get("target")) + 1 counterparty_pbk = dialogue.dialogue_label.dialogue_opponent_pbk inform_msg = FIPAMessage(message_id=new_message_id, dialogue_reference=dialogue.dialogue_label.dialogue_reference, target=new_target_id, performative=FIPAMessage.Performative.INFORM, json_data=json_data) dialogue.outgoing_extend(inform_msg) self.context.outbox.put_message(to=counterparty_pbk, sender=self.context.agent_public_key, protocol_id=FIPAMessage.protocol_id, message=FIPASerializer().encode(inform_msg)) logger.info("[{}]: informing counterparty={} of transaction digest.".format(self.context.agent_name, counterparty_pbk[-5:])) self._received_tx_message = True else: logger.info("[{}]: transaction was not successful.".format(self.context.agent_name))
def handle(self, message: Message, sender: str) -> None: """ Dispatch message to relevant handler and respond. :param message: the message :param sender: the sender :return: None """ tx_message = cast(TransactionMessage, message) if TransactionMessage.Performative(tx_message.get( "performative")) == TransactionMessage.Performative.ACCEPT: logger.info( "[{}]: transaction confirmed by decision maker, sending to controller." .format(self.context.agent_name)) game = cast(Game, self.context.game) msg = TACMessage( type=TACMessage.Type.TRANSACTION, transaction_id=tx_message.get("transaction_digest"), counterparty=tx_message.get("counterparty"), amount_by_currency={ tx_message.get("currency"): tx_message.get("amount") }, sender_tx_fee=tx_message.get("sender_tx_fee"), counterparty_tx_fee=tx_message.get("counterparty_tx_fee"), quantities_by_good_pbk=tx_message.get( "quantities_by_good_pbk")) self.context.outbox.put_message( to=game.configuration.controller_pbk, sender=self.context.agent_public_key, protocol_id=TACMessage.protocol_id, message=TACSerializer().encode(msg)) else: logger.info("[{}]: transaction was not successful.".format( self.context.agent_name))
def handle(self, message: Message, sender: str) -> None: """ Dispatch message to relevant handler and respond. :param message: the message :param sender: the sender :return: None """ tx_message = cast(TransactionMessage, message) if TransactionMessage.Performative(tx_message.get( "performative")) == TransactionMessage.Performative.ACCEPT: logger.info( "[{}]: transaction confirmed by decision maker, sending match accept." .format(self.context.agent_name)) dialogue_label = DialogueLabel.from_json( cast(Dict[str, str], tx_message.get("dialogue_label"))) dialogues = cast(Dialogues, self.context.dialogues) dialogue = dialogues.dialogues[dialogue_label] tac_message = dialogue.last_incoming_message if tac_message is not None and tac_message.get( "performative") == FIPAMessage.Performative.ACCEPT: fipa_msg = FIPAMessage( performative=FIPAMessage.Performative. MATCH_ACCEPT_W_ADDRESS, message_id=cast(int, tac_message.get("message_id")) + 1, dialogue_reference=dialogue.dialogue_label. dialogue_reference, target=tac_message.get("message_id"), address=tx_message.get("transaction_digest")) dialogue.outgoing_extend(fipa_msg) self.context.outbox.put_message( to=dialogue.dialogue_label.dialogue_opponent_pbk, sender=self.context.agent_public_key, protocol_id=FIPAMessage.protocol_id, message=FIPASerializer().encode(fipa_msg)) else: logger.info( "[{}]: last message should be of performative accept.". format(self.context.agent_name)) else: logger.info("[{}]: transaction was not successful.".format( self.context.agent_name))