Example #1
0
        /// <summary>
        /// Notifies both the conversation owner (agent) and the conversation client (customer)
        /// about the connection status change.
        /// </summary>
        /// <param name="messageRouterResult">The result to handle.</param>
        protected virtual async Task HandleConnectionChangedResultAsync(MessageRouterResult messageRouterResult)
        {
            IRoutingDataManager routingDataManager = _messageRouterManager.RoutingDataManager;

            Party conversationOwnerParty  = messageRouterResult.ConversationOwnerParty;
            Party conversationClientParty = messageRouterResult.ConversationClientParty;

            string conversationOwnerName =
                string.IsNullOrEmpty(conversationOwnerParty?.ChannelAccount.Name)
                    ? StringAndCharConstants.NoUserNamePlaceholder
                    : conversationOwnerParty?.ChannelAccount.Name;

            string conversationClientName =
                string.IsNullOrEmpty(conversationClientParty?.ChannelAccount.Name)
                    ? StringAndCharConstants.NoUserNamePlaceholder
                    : conversationClientParty?.ChannelAccount.Name;

            string messageToConversationOwner  = string.Empty;
            string messageToConversationClient = string.Empty;

            if (messageRouterResult.Type == MessageRouterResultType.ConnectionRequested)
            {
                bool conversationClientPartyMissing =
                    (conversationClientParty == null || conversationClientParty.ChannelAccount == null);

                foreach (Party aggregationParty in _messageRouterManager.RoutingDataManager.GetAggregationParties())
                {
                    Party botParty = routingDataManager.FindBotPartyByChannelAndConversation(
                        aggregationParty.ChannelId, aggregationParty.ConversationAccount);

                    if (botParty != null)
                    {
                        if (conversationClientPartyMissing)
                        {
                            await _messageRouterManager.SendMessageToPartyByBotAsync(
                                aggregationParty, ConversationText.RequestorDetailsMissing);
                        }
                        else
                        {
                            IMessageActivity messageActivity = Activity.CreateMessageActivity();
                            messageActivity.Conversation = aggregationParty.ConversationAccount;
                            messageActivity.Recipient    = aggregationParty.ChannelAccount;
                            messageActivity.Attachments  = new List <Attachment>
                            {
                                CommandCardFactory.CreateRequestCard(
                                    conversationClientParty, botParty.ChannelAccount?.Name).ToAttachment()
                            };

                            await _messageRouterManager.SendMessageToPartyByBotAsync(
                                aggregationParty, messageActivity);
                        }
                    }
                }

                if (!conversationClientPartyMissing)
                {
                    messageToConversationClient = ConversationText.NotifyClientWaitForRequestHandling;
                }
            }
            else if (messageRouterResult.Type == MessageRouterResultType.ConnectionAlreadyRequested)
            {
                messageToConversationClient = ConversationText.NotifyClientDuplicateRequest;
            }
            else if (messageRouterResult.Type == MessageRouterResultType.ConnectionRejected)
            {
                messageToConversationOwner  = string.Format(ConversationText.NotifyOwnerRequestRejected, conversationClientName);
                messageToConversationClient = ConversationText.NotifyClientRequestRejected;
            }
            else if (messageRouterResult.Type == MessageRouterResultType.Connected)
            {
                messageToConversationOwner  = string.Format(ConversationText.NotifyOwnerConnected, conversationClientName);
                messageToConversationClient = string.Format(ConversationText.NotifyClientConnected, conversationOwnerName);
            }
            else if (messageRouterResult.Type == MessageRouterResultType.Disconnected)
            {
                messageToConversationOwner  = string.Format(ConversationText.NotifyOwnerDisconnected, conversationClientName);
                messageToConversationClient = string.Format(ConversationText.NotifyClientDisconnected, conversationOwnerName);
            }

            if (conversationOwnerParty != null &&
                !string.IsNullOrEmpty(messageToConversationOwner))
            {
                await _messageRouterManager.SendMessageToPartyByBotAsync(
                    conversationOwnerParty, messageToConversationOwner);
            }

            if (conversationClientParty != null &&
                !string.IsNullOrEmpty(messageToConversationClient))
            {
                await _messageRouterManager.SendMessageToPartyByBotAsync(
                    conversationClientParty, messageToConversationClient);
            }
        }
Example #2
0
        /// <summary>
        /// Handles the given connection request result.
        /// </summary>
        /// <param name="connectionRequestResult">The result to handle.</param>
        /// <returns>True, if the result was handled. False, if no action was taken.</returns>
        protected virtual async Task <bool> HandleConnectionRequestResultAsync(
            ConnectionRequestResult connectionRequestResult)
        {
            ConnectionRequest connectionRequest = connectionRequestResult?.ConnectionRequest;

            if (connectionRequest == null || connectionRequest.Requestor == null)
            {
                System.Diagnostics.Debug.WriteLine("No client to inform about the connection request result");
                return(false);
            }

            switch (connectionRequestResult.Type)
            {
            case ConnectionRequestResultType.Created:
                foreach (ConversationReference aggregationChannel
                         in _messageRouter.RoutingDataManager.GetAggregationChannels())
                {
                    ConversationReference botConversationReference =
                        _messageRouter.RoutingDataManager.FindConversationReference(
                            aggregationChannel.ChannelId, aggregationChannel.Conversation.Id, null, true);

                    if (botConversationReference != null)
                    {
                        IMessageActivity messageActivity = Activity.CreateMessageActivity();
                        messageActivity.Conversation = aggregationChannel.Conversation;
                        messageActivity.Recipient    = RoutingDataManager.GetChannelAccount(aggregationChannel);
                        messageActivity.Attachments  = new List <Attachment>
                        {
                            CommandCardFactory.CreateConnectionRequestCard(
                                connectionRequest,
                                RoutingDataManager.GetChannelAccount(
                                    botConversationReference)?.Name).ToAttachment()
                        };

                        await _messageRouter.SendMessageAsync(aggregationChannel, messageActivity);
                    }
                }

                await _messageRouter.SendMessageAsync(
                    connectionRequest.Requestor, Strings.NotifyClientWaitForRequestHandling);

                return(true);

            case ConnectionRequestResultType.AlreadyExists:
                await _messageRouter.SendMessageAsync(
                    connectionRequest.Requestor, Strings.NotifyClientDuplicateRequest);

                return(true);

            case ConnectionRequestResultType.Rejected:
                if (connectionRequestResult.Rejecter != null)
                {
                    await _messageRouter.SendMessageAsync(
                        connectionRequestResult.Rejecter,
                        string.Format(Strings.NotifyOwnerRequestRejected, GetNameOrId(connectionRequest.Requestor)));
                }

                await _messageRouter.SendMessageAsync(
                    connectionRequest.Requestor, Strings.NotifyClientRequestRejected);

                return(true);

            case ConnectionRequestResultType.NotSetup:
                await _messageRouter.SendMessageAsync(
                    connectionRequest.Requestor, Strings.NoAgentsAvailable);

                return(true);

            case ConnectionRequestResultType.Error:
                if (connectionRequestResult.Rejecter != null)
                {
                    await _messageRouter.SendMessageAsync(
                        connectionRequestResult.Rejecter,
                        string.Format(Strings.ConnectionRequestResultErrorWithResult, connectionRequestResult.ErrorMessage));
                }

                return(true);

            default:
                break;
            }

            return(false);
        }
        /// <summary>
        /// Notifies both the conversation owner (agent) and the conversation client (customer)
        /// about the connection status change.
        /// </summary>
        /// <param name="messageRouterResult">The result to handle.</param>
        protected virtual async Task HandleConnectionChangedResultAsync(MessageRouterResult messageRouterResult)
        {
            IRoutingDataManager routingDataManager = _messageRouterManager.RoutingDataManager;

            Party conversationOwnerParty  = messageRouterResult.ConversationOwnerParty;
            Party conversationClientParty = messageRouterResult.ConversationClientParty;

            string conversationOwnerName  = conversationOwnerParty?.ChannelAccount.Name;
            string conversationClientName = conversationClientParty?.ChannelAccount.Name;

            string messageToConversationOwner  = string.Empty;
            string messageToConversationClient = string.Empty;

            if (messageRouterResult.Type == MessageRouterResultType.ConnectionRequested)
            {
                if (conversationClientParty == null || conversationClientParty.ChannelAccount == null)
                {
                    await _messageRouterManager.BroadcastMessageToAggregationChannelsAsync(
                        ConversationText.ConnectionRequestMadeButRequestorIsNull);

                    throw new NullReferenceException(ConversationText.ConnectionRequestMadeButRequestorIsNull);
                }

                foreach (Party aggregationParty in _messageRouterManager.RoutingDataManager.GetAggregationParties())
                {
                    Party botParty = routingDataManager
                                     .FindBotPartyByChannelAndConversation(aggregationParty.ChannelId, aggregationParty.ConversationAccount);

                    if (botParty != null)
                    {
                        IMessageActivity messageActivity = Activity.CreateMessageActivity();
                        messageActivity.Conversation = aggregationParty.ConversationAccount;
                        messageActivity.Recipient    = aggregationParty.ChannelAccount;
                        messageActivity.Attachments  = new List <Attachment>
                        {
                            CommandCardFactory.CreateRequestCard(
                                conversationClientParty, botParty.ChannelAccount?.Name).ToAttachment()
                        };

                        try
                        {
                            await _messageRouterManager.SendMessageToPartyByBotAsync(aggregationParty, messageActivity);
                        }
                        catch (UnauthorizedAccessException e)
                        {
                            System.Diagnostics.Debug.WriteLine($"Failed to broadcast message: {e.Message}");
                        }
                    }
                    else
                    {
                        try
                        {
                            await _messageRouterManager.BroadcastMessageToAggregationChannelsAsync(
                                string.Format(
                                    ConversationText.FailedToFindBotOnAggregationChannel,
                                    aggregationParty.ConversationAccount.Name));
                        }
                        catch (UnauthorizedAccessException e)
                        {
                            System.Diagnostics.Debug.WriteLine($"Failed to send message: {e.Message}");
                        }
                    }
                }

                messageToConversationClient = ConversationText.NotifyClientWaitForRequestHandling;
            }
            else if (messageRouterResult.Type == MessageRouterResultType.ConnectionAlreadyRequested)
            {
                messageToConversationClient = ConversationText.NotifyClientDuplicateRequest;
            }
            else if (messageRouterResult.Type == MessageRouterResultType.ConnectionRejected)
            {
                messageToConversationOwner  = string.Format(ConversationText.NotifyOwnerRequestRejected, conversationClientName);
                messageToConversationClient = ConversationText.NotifyClientRequestRejected;
            }
            else if (messageRouterResult.Type == MessageRouterResultType.Connected)
            {
                messageToConversationOwner  = string.Format(ConversationText.NotifyOwnerConnected, conversationClientName);
                messageToConversationClient = string.Format(ConversationText.NotifyClientConnected, conversationOwnerName);
            }
            else if (messageRouterResult.Type == MessageRouterResultType.Disconnected)
            {
                messageToConversationOwner  = string.Format(ConversationText.NotifyOwnerDisconnected, conversationClientName);
                messageToConversationClient = string.Format(ConversationText.NotifyClientDisconnected, conversationOwnerName);
            }

            if (!string.IsNullOrEmpty(messageToConversationOwner) && conversationOwnerParty != null)
            {
                try
                {
                    await _messageRouterManager.SendMessageToPartyByBotAsync(
                        conversationOwnerParty, messageToConversationOwner);
                }
                catch (UnauthorizedAccessException e)
                {
                    System.Diagnostics.Debug.WriteLine($"Failed to send message: {e.Message}");
                }
            }

            if (!string.IsNullOrEmpty(messageToConversationClient) && conversationClientParty != null)
            {
                try
                {
                    await _messageRouterManager.SendMessageToPartyByBotAsync(
                        conversationClientParty, messageToConversationClient);
                }
                catch (UnauthorizedAccessException e)
                {
                    System.Diagnostics.Debug.WriteLine($"Failed to send message: {e.Message}");
                }
            }
        }