Spaces:
Build error
Build error
| # Copyright (c) Microsoft Corporation. All rights reserved. | |
| # Licensed under the MIT License. | |
| from typing import List | |
| from botbuilder.core import ChannelServiceHandler | |
| from botbuilder.schema import ( | |
| Activity, | |
| ChannelAccount, | |
| ConversationParameters, | |
| ConversationResourceResponse, | |
| ConversationsResult, | |
| PagedMembersResult, | |
| ResourceResponse | |
| ) | |
| from botframework.connector.aio import ConnectorClient | |
| from botframework.connector.auth import ( | |
| AuthenticationConfiguration, | |
| ChannelProvider, | |
| ClaimsIdentity, | |
| CredentialProvider, | |
| MicrosoftAppCredentials | |
| ) | |
| from routing_id_factory import RoutingIdFactory | |
| class RoutingHandler(ChannelServiceHandler): | |
| def __init__( | |
| self, | |
| conversation_id_factory: RoutingIdFactory, | |
| credential_provider: CredentialProvider, | |
| auth_configuration: AuthenticationConfiguration, | |
| channel_provider: ChannelProvider = None | |
| ): | |
| super().__init__(credential_provider, auth_configuration, channel_provider) | |
| self._factory = conversation_id_factory | |
| self._credentials = MicrosoftAppCredentials(None, None) | |
| async def on_reply_to_activity( | |
| self, | |
| claims_identity: ClaimsIdentity, | |
| conversation_id: str, | |
| activity_id: str, | |
| activity: Activity, | |
| ) -> ResourceResponse: | |
| back_conversation_id, back_service_url = self._factory.get_conversation_info(conversation_id) | |
| connector_client = self._get_connector_client(back_service_url) | |
| activity.conversation.id = back_conversation_id | |
| activity.service_url = back_service_url | |
| return await connector_client.conversations.send_to_conversation(back_conversation_id, activity) | |
| async def on_send_to_conversation( | |
| self, claims_identity: ClaimsIdentity, conversation_id: str, activity: Activity, | |
| ) -> ResourceResponse: | |
| back_conversation_id, back_service_url = self._factory.get_conversation_info(conversation_id) | |
| connector_client = self._get_connector_client(back_service_url) | |
| activity.conversation.id = back_conversation_id | |
| activity.service_url = back_service_url | |
| return await connector_client.conversations.send_to_conversation(back_conversation_id, activity) | |
| async def on_update_activity( | |
| self, | |
| claims_identity: ClaimsIdentity, | |
| conversation_id: str, | |
| activity_id: str, | |
| activity: Activity, | |
| ) -> ResourceResponse: | |
| back_conversation_id, back_service_url = self._factory.get_conversation_info(conversation_id) | |
| connector_client = self._get_connector_client(back_service_url) | |
| activity.conversation.id = back_conversation_id | |
| activity.service_url = back_service_url | |
| return await connector_client.conversations.update_activity(back_conversation_id, activity.id, activity) | |
| async def on_delete_activity( | |
| self, claims_identity: ClaimsIdentity, conversation_id: str, activity_id: str, | |
| ): | |
| back_conversation_id, back_service_url = self._factory.get_conversation_info(conversation_id) | |
| connector_client = self._get_connector_client(back_service_url) | |
| return await connector_client.conversations.delete_activity(back_conversation_id, activity_id) | |
| async def on_create_conversation( | |
| self, claims_identity: ClaimsIdentity, parameters: ConversationParameters, | |
| ) -> ConversationResourceResponse: | |
| # This call will be used in Teams scenarios. | |
| # Scenario #1 - creating a thread with an activity in a Channel in a Team | |
| # In order to know the serviceUrl in the case of Teams we would need to look it up based upon the | |
| # TeamsChannelData. | |
| # The inbound activity will contain the TeamsChannelData and so will the ConversationParameters. | |
| # Scenario #2 - starting a one on one conversation with a particular user | |
| # - needs further analysis - | |
| back_service_url = "http://tempuri" | |
| connector_client = self._get_connector_client(back_service_url) | |
| return await connector_client.conversations.create_conversation(parameters) | |
| async def on_delete_conversation_member( | |
| self, claims_identity: ClaimsIdentity, conversation_id: str, member_id: str, | |
| ): | |
| return await super().on_delete_conversation_member(claims_identity, conversation_id, member_id) | |
| async def on_get_activity_members( | |
| self, claims_identity: ClaimsIdentity, conversation_id: str, activity_id: str, | |
| ) -> List[ChannelAccount]: | |
| return await super().on_get_activity_members(claims_identity, conversation_id, activity_id) | |
| async def on_get_conversation_members( | |
| self, claims_identity: ClaimsIdentity, conversation_id: str, | |
| ) -> List[ChannelAccount]: | |
| return await super().on_get_conversation_members(claims_identity, conversation_id) | |
| async def on_get_conversations( | |
| self, claims_identity: ClaimsIdentity, continuation_token: str = "", | |
| ) -> ConversationsResult: | |
| return await super().on_get_conversations(claims_identity, continuation_token) | |
| async def on_get_conversation_paged_members( | |
| self, | |
| claims_identity: ClaimsIdentity, | |
| conversation_id: str, | |
| page_size: int = None, | |
| continuation_token: str = "", | |
| ) -> PagedMembersResult: | |
| return await super().on_get_conversation_paged_members(claims_identity, conversation_id, continuation_token) | |
| def _get_connector_client(self, service_url: str): | |
| return ConnectorClient(self._credentials, service_url) | |