def _try_construct_envelope( agent_name: str, dialogues: Dialogues, message_class: Type[Message]) -> Optional[Envelope]: """Try construct an envelope from user input.""" envelope = None # type: Optional[Envelope] try: performative_str = "bytes" performative = message_class.Performative(performative_str) click.echo( f"Provide message of protocol '{str(message_class.protocol_id)}' for performative {performative_str}:" ) message_escaped = input() # nosec message_escaped = message_escaped.strip() if message_escaped == "": raise InterruptInputException message_decoded = codecs.decode(message_escaped.encode("utf-8"), "unicode-escape") message = message_decoded.encode("utf-8") # type: Union[str, bytes] msg, _ = dialogues.create( counterparty=agent_name, performative=performative, content=message, ) envelope = Envelope( to=msg.to, sender=msg.sender, message=msg, ) except InterruptInputException: click.echo("Interrupting input, checking inbox ...") except KeyboardInterrupt: raise except BaseException as e: # pylint: disable=broad-except # pragma: no cover click.echo(e) return envelope
def prepare_skill_dialogue( self, dialogues: Dialogues, messages: Tuple[DialogueMessage, ...], counterparty: Address = COUNTERPARTY_ADDRESS, ) -> Dialogue: """ Quickly create a dialogue. The 'messages' argument is a tuple of DialogueMessages. For every DialogueMessage (performative, contents, is_incoming, target): - if 'is_incoming' is not provided: for the first message it is assumed False (outgoing), for any other message, it is the opposite of the one preceding it. - if 'target' is not provided: for the first message it is assumed 0, for any other message, it is the index of the message before it in the tuple of messages + 1. :param dialogues: a dialogues class :param counterparty: the message_id :param messages: the dialogue_reference :return: the created incoming message """ if len(messages) == 0: raise AEAEnforceError("the list of messages must be positive.") ( performative, contents, message_id, is_incoming, target, ) = self._extract_message_fields(messages[0], index=0, last_is_incoming=True) if is_incoming: # first message from the opponent dialogue_reference = dialogues.new_self_initiated_dialogue_reference() message = self.build_incoming_message( message_type=dialogues.message_class, dialogue_reference=dialogue_reference, message_id=message_id, target=target, performative=performative, to=self.skill.skill_context.agent_address, sender=counterparty, **contents, ) dialogue = cast(Dialogue, dialogues.update(message)) if dialogue is None: raise AEAEnforceError( "Cannot update the dialogue with message number {}".format( message_id ) ) else: # first message from self _, dialogue = dialogues.create( counterparty=counterparty, performative=performative, **contents ) for idx, dialogue_message in enumerate(messages[1:]): ( performative, contents, message_id, is_incoming, target, ) = self._extract_message_fields(dialogue_message, idx + 1, is_incoming) if is_incoming: # messages from the opponent dialogue_reference = self._non_initial_incoming_message_dialogue_reference( dialogue ) message = self.build_incoming_message( message_type=dialogues.message_class, dialogue_reference=dialogue_reference, message_id=message_id, target=target, performative=performative, to=self.skill.skill_context.agent_address, sender=counterparty, **contents, ) dialogue = cast(Dialogue, dialogues.update(message)) if dialogue is None: raise AEAEnforceError( "Cannot update the dialogue with message number {}".format( message_id ) ) else: # messages from self dialogue.reply(performative=performative, target=target, **contents) return dialogue