text: # -*- coding: utf-8 -*-
  # ------------------------------------------------------------------------------
  #
  #   Copyright 2018-2019 Fetch.AI Limited
  #
  #   Licensed under the Apache License, Version 2.0 (the "License");
  #   you may not use this file except in compliance with the License.
  #   You may obtain a copy of the License at
  #
  #       http://www.apache.org/licenses/LICENSE-2.0
  #
  #   Unless required by applicable law or agreed to in writing, software
  #   distributed under the License is distributed on an "AS IS" BASIS,
  #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  #   See the License for the specific language governing permissions and
  #   limitations under the License.
  #
  # ------------------------------------------------------------------------------
  
  """This package contains dialogues used by the fetch_beacon skill."""
  
  from typing import Any, Type
  
  from aea.protocols.base import Address, Message
  from aea.protocols.dialogue.base import Dialogue as BaseDialogue
  from aea.protocols.dialogue.base import DialogueLabel as BaseDialogueLabel
  from aea.skills.base import Model
  
  from packages.fetchai.protocols.ledger_api.dialogues import (
      LedgerApiDialogue as BaseLedgerApiDialogue,
  )
  from packages.fetchai.protocols.ledger_api.dialogues import (
      LedgerApiDialogues as BaseLedgerApiDialogues,
  )
  from packages.fetchai.protocols.ledger_api.message import LedgerApiMessage
  
  
  class LedgerApiDialogue(BaseLedgerApiDialogue):
      """The dialogue class maintains state of a dialogue and manages it."""
  
      def __init__(
          self,
          dialogue_label: BaseDialogueLabel,
          self_address: Address,
          role: BaseDialogue.Role,
          message_class: Type[LedgerApiMessage] = LedgerApiMessage,
      ) -> None:
          """
          Initialize a dialogue.
  
          :param dialogue_label: the identifier of the dialogue
          :param self_address: the address of the entity for whom this dialogue is maintained
          :param role: the role of the agent this dialogue is maintained for
  
          :return: None
          """
          BaseLedgerApiDialogue.__init__(
              self,
              dialogue_label=dialogue_label,
              self_address=self_address,
              role=role,
              message_class=message_class,
          )
  
  
  class LedgerApiDialogues(Model, BaseLedgerApiDialogues):
      """The dialogues class keeps track of all dialogues."""
  
      def __init__(self, **kwargs: Any) -> None:
          """
          Initialize dialogues.
  
          :return: None
          """
          Model.__init__(self, **kwargs)
  
          def role_from_first_message(  # pylint: disable=unused-argument
              message: Message, receiver_address: Address
          ) -> BaseDialogue.Role:
              """Infer the role of the agent from an incoming/outgoing first message
  
              :param message: an incoming/outgoing first message
              :param receiver_address: the address of the receiving agent
              :return: The role of the agent
              """
              return BaseLedgerApiDialogue.Role.AGENT
  
          BaseLedgerApiDialogues.__init__(
              self,
              self_address=str(self.skill_id),
              role_from_first_message=role_from_first_message,
              dialogue_class=LedgerApiDialogue,
          )
  